多态
1.多态
1.1 基本概念
多态主要指同一种事物表现出来的多种形态。
饮料:可乐、雪碧、脉动、乐虎、红牛、…
宠物:狗、猫、鸟、乌龟、鱼、…
人:学生、教师、工人、…
1.2 语法格式
父类类型 引用变量名 = new 子类类型();
如:
Person pw = new Worker();
pw.show();
解析:
编译阶段调用Person类中show方法,在运行阶段调用Worker类中重写以后的show方法 | |
---|---|
1.3 多态的效果
-
当父类的引用指向子类的对象时,父类的引用可以直接调用父类独有的方法;
-
当父类的引用指向子类的对象时,父类的引用不可以直接调用子类独有的方法;
-
对于父子类都有的非静态成员方法来说,编译阶段调用父类版本,运行阶段
调用子类重写以后的版本; -
对于父子类都有的静态方法来说,编译和运行阶段调用父类版本,隶属于类层级, 因此与指向的对象无关;
1.4 引用数据类型之间的转换
(1)引用数据类型之间的转换分为:自动类型转换 和 强制类型转换。
其中自动类型转换主要指从小范围到大范围之间的转换,也就是子类到父类的转换
其中强制类型转换主要指从大范围到小范围之间的转换,也就是父类到子类的转换
(2)引用数据类型之间的转换必须发生在父子类之间,否则编译报错。
(3)若转换到的目标类型是子类类型但不是该引用真正指向的子类类型,则编译通过,
运行阶段发生类型转换异常。
(4)为了避免上述错误的发生,可以使用instanceof进行判断,具体格式如下:
if(引用变量名 instanceof 数据类型) - 判断引用变量指向的对象是否为后面类型
1.5 多态的意义
多态的实际意义在于可以屏蔽不同子类的差异性实现通用的编程,但可以调用不同的方法带来不同的结果。
抽象类
2.1 抽象方法的概念
抽象方法就是指不能具体实现的方法,也就是没有方法体并使用abstract关键字修饰
语法格式:
访问控制符 abstract 返回值类型 方法名称(形参列表);
如:
public abstract void cry();
2.2 抽象类的概念
抽象类就是指不能具体实例化的类,也就是不能创建对象并使用abstract关键字修饰
2.3 注意事项
(1)抽象类中可以有成员变量、构造方法以及成员方法;
(2)抽象类中可以有抽象方法也可以没有抽象方法;
(3)拥有抽象方法的类必须是抽象类,因此严格来说,具有抽象方法并且使用
abstract关键字修饰的类才算真正意义上的抽象类。
2.4 实际意义
抽象类的意义不在于自身创建对象而在于被继承,当一个类继承抽象类后必须重写抽象类中的抽象方法,否则该类也变成抽象类。
也就是说抽象类对子类具有强制性和规范性,因此叫做模板设计模式。
3.接口
3.1 基本概念
接口就是一种比抽象类还抽象的类,体现为所有成员方法都是抽象方法。
定义类的关键字是class,而定义接口的关键字是interface。
继承类的关键字是extends,而实现接口的关键字是implements。
3.2 类和接口之间的关系
-
类和类之间的关系 使用extends关键字表达继承的关系 支持单继承
-
类和接口之间的关系 使用implemets关键字表达实现的关系 支持多实现
-
接口和接口之间的关系 使用extends关键字表达继承的关系 支持多继承
3.3 抽象类和接口之间的区别(笔试题)
(1)定义抽象类的关键字是abstract class,而定义接口的关键字是interface。
(2)继承抽象类的关键字是extends,而实现接口的关键字是implements。
(3)继承抽象类支持单继承,而实现接口可以多实现。
(4)抽象类中可以有构造方法,而接口中不可以有构造方法。
(5)抽象类中可以有成员变量,而接口中只可以有常量。
(6)抽象类中可以有成员方法,而接口中只可以有抽象方法。
(7)抽象类中增加方法可以不影响子类,而接口中增加方法通常都影响子类。
(8)从jdk1.8开始允许接口中出现非抽象方法,但需要使用default关键字修饰。
4.匿名内部类
4.1 语法格式
接口/父类类型 引用变量名 = new 接口/父类类型(){ 方法的重写 };
4.2 经验的分享
当接口类型的引用作为方法的形参时,实参的传递方式有两种:
a.自定义类实现接口,然后创建该类的对象作为实参传递;
b.使用匿名内部类的语法格式来得到接口类型的引用作为实参传递;