多态
(1) 向上转型:用父类引用指向子类对象。
(2)动态绑定:当父类和子类中包含同名参数方法的时候,此时到底调用的是哪个版本的方法,就需要程序运行时来确定(根据当前引用指向的对象的类型才能确定)
(3)方法重写:方法重写这个语法 机制基于动态绑定来实现的,子类和父类中存在同名,同参数列表的方法,(也和返回值、访问权限控制多少有点关系,父类的方法访问权限不应该比子类的更严格)
**重写(Override)VS 重载(Overload)**
多态的理解:一个引用可以体现出多种形态(多种不同类型的对象),这是封装的更进一步,类的使用者不需要知道你使用的对象究竟是啥类型
**好处**
1.多态进一步降低使用者的成本。
2.多态可以降低代码的圈复杂度。
3.可扩展性更强方便修改。
以下是一道例题。
class X {
Y y = new Y();
public X() {
System.out.print("X");
}
}
class Y {
public Y() {
System.out.print("Y");
}
}
class Z extends X {
Y y = new Y();
public Z() {
System.out.print("Z");
}
public static void main(String[] args) {
new Z();
}
}
题解
此题考查对初始化过程的理解。
初始化过程如下:
初始化过程为以下四步
1. 初始化父类中的静态成员变量和静态代码块 ;
2. 初始化子类中的静态成员变量和静态代码块 ;
3.初始化父类的普通成员变量和代码块,再执行父类的构造方法;
4.初始化子类的普通成员变量和代码块,再执行子类的构造方法
##对于此题,经过分析不难得到:
(1)初始化父类的普通成员变量和代码块,执行 Y y=new Y(); 输出Y
(2)再执行父类的构造方法;输出X
(3) 初始化子类的普通成员变量和代码块,执行 Y y=new Y(); 输出Y
(4)再执行子类的构造方法;输出Z 所以输出YXYZ