黑马程序员 第九天笔记
<a href="http://www.itheima.com" target="blank">java培训</a>
1.多态的概述
生活中,一个事物表现出来的不同形态。
程序中多态的前提:
要有继承,(或者是实现—接口)
方法的重写
父类的引用指向自己的子类对象
程序的多态指的是对象的多态性。
2.根据多态的前提,写案例
父类的引用指向自己的子类对象
多态的调用方法:运行子类重写
好处:扩展性很强,代码重复利用也很高,维护性很强
代码演示:
演示结果:
3.多态中成员访问的特点
A.非静态成员变量的特点
编译时期,看父类中有没有变量,有编译成功,没有编译失败
运行时期,运行的是父类中的变量
B.静态成员变量的特点
编译时期,看父类中有没有变量,有编译成功,没有编译失败
运行时期,运行的是父类中的变量
C.非静态成员方法特点:
编译时期,看父类中有没有这个方法,有编译成功,没有编译失败
运行时期,运行是子类重写后的方法
D.静态成员方法特点:
编译时期,看父类中有没有这个方法,有编译成功,没有编译失败
运行时期,运行是父类中的方法
总结:多态中,除了非静态方法以外,编译看左边,运行看左边
只有非静态的方法,编译看左边,运行看右边 (左边只等号的左边)
代码演示:
演示结果:
4.多态中的转型
父类引用=子类对象();
子类和父类类型,数据类型不同,不能直接运算,需要类型转换
自动转换,小的转成大的,子类自动提升为父类的类型,向下转型
格式:
目标类型 变量=(目标类型)被转数据
代码演示:孔子装爹
演示结果:
5.多态转型中的类型判断 instance of运算符(用于检查类的类型转换异常)
关键字,也是运算符 instance of 运算,结果是布尔类型
检查引用变量是不是这个类创建的
固定格式:
引用变量 instanceof 类
在if语句中写a instanceof b。 判断a 是不是b对象,如果是运算符返回true
使用子类特有功能,需要强制转换,保证安全,使用instanceof判断
代码演示:
演示结果:
6.多态的设计原理
为什么多态中,有的走父类,有的走子类
编译为什么看左边 Fu f = new Zi();
编译期间特点,检查语法问题,变量没有值,对象也是不存在
编译的时候,看见左边的类类型变量,看不到对象具体是谁
除了非静态的成员方法以外,运行时期,JVM静态的绑定在父类的引用中
但是如果运行的是非静态成员方法,运行时期,JVM动态绑定在子类的对象中,会调用子类的重写方法
为什么,必须运行子类重写方法,设计的原因,扩展父类
子类重写父类方法,目的就为了沿袭父类功能,扩展自己的功能
7.抽象类概述
一个方法没有具体的主体实现,没有逻辑。这样的方法,叫做抽象方法。
如果一个类中,有抽象方法,这个类应该是一个抽象类
关键字,修饰符abstract 抽象的,修饰类,修饰方法
抽象类不一定有抽象方法,抽象方法一定是在抽象类中
8.定义抽象类
先写抽象方法 :abstract 修饰,没有方法体,没有大括号,直接分号结束
抽象类不能实例化,不可以new对象
但是可以定义子类,继承抽象类,重写抽象方法,建立子类对象
代码演示:
演示结果:
9.抽象方法的特点
抽象类不一定有抽象方法,但是抽象方法一定是在抽象类中
有成员变量,和普通类一致。
抽象类中可以有静态方法,不能有非静态方法,类名.方法名调用。
抽象类中可以有静态成员,不能有非静态成员,类名. 成员名调用。
抽象类中有构造方法。第一行必须是super();
不可以建立对象,构造方法的作用,建立对象给成员变量赋值。
10.子类继承后的注意事项
子类没有覆盖抽象方法,子类还是一个抽象类。不能new对象
如果子类覆盖了一部分抽象方法,子类还是一个抽象类
如果抽象中,没有抽象方法,子类继承后,可以不重写
代码演示:
演示结果:
11.员工与经理案例
代码演示:
演示结果:
12.修饰符的冲突问题:
abstract 不能和哪些修饰符一起使用
final 抽象目的,子类重写,final不能重写
private 抽象目的,子类重写,但是子类不知道父类有这个方法
static 静态方法类名直接调用,如果是抽象没有方法体,怎么调用
13.接口概述
同一种事物中,猫狗,最基本的功能,定义在动物抽象类
但是有写狗和猫具备其他功能,不是所有的猫狗都具备
写在动物类不合适,例如跳高,钻火圈,某写狗才具备,狗的一个扩展功能
扩展功能,使用接口来实现
当一个类中的方法,全部是抽象方法的时候,这个类换一个名字,叫做接口
先期,接口理解为一个特殊的抽象类
14.接口的定义
接口定义的关键字不是class 是interface 接口名
Interface Demo{}
接口中的成员,成员变量,成员方法
成员变量的固定格式:public static final 数据类型 变量名
成员方法固定格式:public abstract 返回值类型 方法名(参数列表)