今天继续学学习了面向对象的新内容 做了一些练习题

                                                                       多态性
多态性是一种允许使用一个界面来访问一类动作的特性,特定的动作可以由不同的具体情况而(传入不同的参数)。多态性是发送消息给某个对象,让该对象自行决定响应何种行为
通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用
多态性通过允许同一界面指定一类动作减少了程序的复杂度,编译器工作就是选择适用于各个情况的特定动作,而程序员则无须手动进行选择,使用者仅仅是记得以及利用这个统一的界面
多态形成的三个必要条件:
1.有继承,父类定义方法,子类重写方法
2.父类的引用指向子类的对象
3.可以使用参数传递时多态,也可以直接创建对象时多态
多态可以用 三个定义和两个方法 来总结。三个定义分别是父类定义子类构建、接口定义实现类构建和抽象类定义实体类构建,而两个方法分别是方法重载和方法重写。
多态分为两种:
1.编译时多态:方法的重载
2.运行时多态: JAVA 运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态
对象的多态性
继承表示的是 is a的语义
强调的一个点:编程是对现实世界的模拟体现
一个对象 x 有两种形态,猫这类事物即具有猫的形态,又具有着动物的形态,这就是对象的多态性。简单说就是一个对象对应着不同类型
多态在代码中的体现
父类或者接口的引用指向其子类的对象。例如:动物 x=new ()
对象多态性可以使程序有良好的扩展,并可以对所有类的对象进行通用处理
多态引用时,构造子类对象时的构造方法的调用顺序
1.先调用超类的构造方法,多重超类首先调用最远超类的方法
2.然后再执行当前子类的构造方法
                                                        this super 的用法
this 用于指代当前对象, super 用于指代父类的内存空间的标识
this 关键字
this 代表其所在函数所属对象的引用。换言之, this 代本类的对象的引用
1.当成员变量和局部变量重名,可以用关键字 this 来区分, this 就是所在函数所属对象的引用
2.对象调用了 this 所在的函数, this 就代表哪个对象。一般方法调用默认加 this
3.通过 this 在构造函数中调用其他构造函数的时候,只能定义在构造函数的第一行,因为初始化动作要先执行,否则就会报错
super 关键字
1.当本类的成员和局部变量同名用 this 区分,当子父类中的成员变量同名用 super 区分父类
2.当子父类中出现成员函数一模一样的情况,会运行子类的函数。这种现象,称为覆盖操作,这是函数在子父类中的特性。在子类覆盖方法中,继续使用被覆盖的方法可以通过super. 函数名获取
3.this() 表示调用当前类中的另外一个构造器 ,() 中可以带有参数; super() 表示调用父类中的某个构造器,() 中可以带有参数。
this() super()
this() 表示调用当前类中的另外一个构造器 ,() 中可以带有参数
super() 表示调用父类中的某个构造器, () 中可以带有参数
new 子类 () 的执行过程
1.首先上溯子类的所有祖先类,然后再从上向下逐步执行各个层次父类的构造器 Object— 爷爷的构造器— 父亲的构造器 ; 最后才执行子类自己的构造器
2.因为每个类的构造方法中默认第一句话为 super() 表示调用父类的无参构造器,除非编程 super
this super 的三种用法:
从语义的角度上说, this 用于指代当前对象; super 用于指代父类对象
1 this() 表示调用另外一个构造器 ,super() 表示调用父类中的某个构造器, () 中的参数决定调用的是哪个构造器
2 this. 成员属性用于表示当前对象的某个成员,一般用于局部变量和属性名称一致的场景下。 super. 成员属性用于表示父类中定义的某个属性,一般用于子类中覆盖定义了某个父类属性的场景下。
3 this. 成员方法 () 用于表示当前对象的某个成员方法; super. 成员方法 () 用于表示当前类的父类中定义的某个成员方法,一般用于覆盖定义时【就近原则】。
4 、在 static 方法中不允许使用 this/super 之类关键字
面向对象设计思想的要点
1.认为客观世界由各种对象组成,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成
2.把所有对象都划分成各种对象类,每个对象类都定义了一组数据和一组方法
3.按照子类与父类的关系,把若干个对象类组成一个层次结构的系统
4.对象彼此之间仅能通过传递消息互相联系
                                                         类间多态和类内多态
多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作
类间多态性
父子类之间的一种多态型,例如:动物 x = new ()
方法调用中的限制 :
针对一个类对象有两种类型,一种称之为编译期类型,编译时系统识别对象的类型, 动物 x = new
()” 在编译时,系统识别 x 是动物类别的,所以只能调用动物类定义的方法,而不能调用猫中特殊
的方法。另外一种称之为运行时类型,也就是当程序运行系统识别的类型, new 谁就是谁
覆盖的方法一定不能是 private
类内多态性
在一个类对象上调用相同名称的方法,但是当参数不同时执行不同的动作
方法名称相同,参数不同,和返回值类型无关
1.参数个数不同
2.参数类型不同
3.参数顺序不同。注意不同参数名称顺序不同
方法的重写和重载
要求:方法的名称一致。
方法的重写 ( 覆盖 )
方法的重写 ( 覆盖 ) 一定发生在父子类之间
执行规则: new 谁运行谁的方法,和声明的类型无关
方法的覆盖定义要求方法名称一致
方法的参数一致 ( 个数、类型、顺序 ) ,和参数名称无关
重点:返回数据类型一致 ( 因为如果返回类型不一致,则无法进行语法检查 , 例如父类返回
Double ,而子类返回 Integer, 调用处语法检查是按照 Double 进行检查还是按 Integer 检查?允许父
类中返回的是父类型,而子类中返回子类型,例如父类中返回的是 Number 类型,而子类中返回的
Integer)
方法的重载
方法的名称相同,参数不同,和返回值类型无关。可以在一个类内或者父子类之间
调用规则:类型最佳匹配原则
要求:方法名称相同并且参数不同。参数不同有 3 种情况:参数个数不同、参数类型不同、参数顺
序不同
和参数名称无关
和返回类型无关
为什么返回类型不同判断不同的方法?【重点
例如调用方法时不需要处理返回值 pp(10), 容易造成混淆
和范围无关
和方法抛出的异常无关
方法的重载可以出现父子类之间,也可以是在一个类内。但是方法的覆盖一定是父子类之间,不能
在一个类内实现方法的覆盖
多态的优点
消除类型之间的耦合关系
可替换性、可扩充性
接口性、灵活性、简化性
 
                                                               抽象类
面向对象编程的核心是面向抽象编程,一般依赖抽象不依赖具体
包含了抽象方法的类叫作 抽象类 ,所谓的抽象方法是指没有函数体的方法,抽象方法必须在子类中给出具体实现,而抽象类本身不能创建对象。 public abstract class A{}
1.如果一个类中有抽象方法则这个类一定是抽象类
2.抽象类中可以定义的内容与普通类一样,只是可以定义抽象方法
3.抽象类中可以没有抽象方法
4.普通类继承抽象类必须实现抽象类中所有的抽象方法
5.抽象类一般是用来定义规范的,该规范的实现是通过子类来实现的
抽象类的特点
方法只有声明没有实现时,该方法就是抽象方法【不是空实现方法体 , 没有 {} 】,需要被 abstract
饰,否则语法报错。抽象方法必须定义在抽象类中,该类必须也被 abstract 修饰
1.抽象方法只能被 public protected 或不加域修饰符修饰,抽象方法一定不能是 private
2.public void pp(){} 不是抽象方法,只是方法的实现为空 , 有方法体
3.public void pp(); 没有 {} 才是没有方法体,才是抽象方法,当然需要添加关键字 abstract
4.不能定义抽象构造函数
              抽象类中可以定义构造器,也可以不定义构造器,使用系统默认提供的无参构造器,但
是自定义构造器不能 private
               抽象类不能是 final class
5.不能定义抽象静态方法
              抽象类中可以有静态方法,但是必须有方法体,不能是抽象方法
              允许抽象类直接调用静态方法
6.抽象类不能直接创建对象,只能通过继承的方式由子类实现对应的抽象方法;
一般的使用方法为【动物 x=new ();
7.所有抽象类的子类必须实现抽象父类中的所有抽象方法或者自己也声明成抽象类 [ 没有实现所有的
抽象方法 ]
8.抽象类除了可以有抽象函数,也可以有非抽象函数
         没有任何限制,允许属性、方法,也允许抽象方法
抽象类不可以被实例化
是因为调用抽象方法没有意义?
抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化,否则这个子类还是抽象类
强调:注意抽象类中可以包含构造器、析构器、抽象方法和方法以及静态方法等,也可以没有抽象方法
什么时候使用抽象类
1.当一个类的一个或多个方法为抽象方法时
2.当该类为一个抽象类的子类,并且没有为所有抽象方法提供实现细节或方法主体时
3.当一个类实现一个接口,并且没有为所有抽象方法提供实现细节或方法主体时
抽象类和普通类的区别
1.抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误
2.抽象类允许(但不要求)抽象类包含抽象成员
3.抽象类不能被密封
          简单说就是被 final 修饰的类,密封类不能被继承,防止了恶意的派生
模板模式
定义抽象类的目的是提供可由其子类共享的一般形式,子类可以根据自身需要扩展抽象类
什么是模板模式
在模板模式 Template Pattern 中一个抽象类公开定义了总体的算法【算法骨架】,把没有办法在父类中实现的方法延迟到子类中具体实现。这种类型的设计模式属于行为型模式
何时使用
1.有多个子类共有的方法,且逻辑相同
2.重要的、复杂的方法,可以考虑作为模板方法
注意事项
为防止恶意操作,一般模板方法都加上 final 关键词
优点
封装不变部分,扩展可变部分
提取公共代码,便于维护
行为由父类控制,子类实现。
缺点
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
抽象类的作用
在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的
通过从这个抽象体派生,也可扩展此模块的行为功能。为了能够实现面向对象设计的一个最核心的原则开闭原则OCP ,抽象类是其中的关键所在
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象
OOP的核心是面向抽象编程
1.在父类中固化算法骨架,在子类中实现特殊的方法
2.依赖抽象
常见问题
抽象类中有构造器吗 ?
有,用于给子类对象进行初始化
new 子类时抽象父类的构造器一定会被执行
抽象类可以不定义抽象方法吗 ?
可以的,但是很少见
目的就是不让该类创建对象
抽象类一定是个父类吗 ?
是的 因为需要子类覆盖其方法后才可以对子类实例化
创建对象时,加载对象的执行顺序
1.先加载父类的静态变量和静态初始化块
2.加载子类的静态变量和静态初始化块
3.加载父类的成员变量、初始化块
4.加载父类的构造方法
5.加载子类的成员变量、初始化块
6.加载子类的构造方法
类和类之间的耦合问题
OOP 要求类内高内聚、类间弱耦合 --- 客户需求变动
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值