多态性 抽象类 模板模式

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值