多态:代码在编译中多种状态的展示
1、 多态的前提是1是发生继承关系
2、 多态的前提是2是要有方法的重写
3、 父类引用指向子类对象,如:Animal a = new Dog();--向上造型
4、 多态中,成员方法编译看左边,运行看右边 就是编译申明变量的时候 a是Animal 而在运行的时候 a是dog
多态中的成员访问特点:
A:成员变量
编译看左边,运行看左边。
B:构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
C:成员方法
编译看左边,运行看右边。
D:静态方法
编译看左边,运行看左边。
(静态和类相关,算不上重写,所以,访问还是看左边的)
由于成员方法存在方法重写,所以它运行看右边。
5.父类申明对象,由子类来实际创建,可以调用那些方法看父类,具体方法的执行看啊可能子类。可以把多态想成一本书,父类是目录 子类是正文
多态的好处
1、 多态可以让我们不用关心某个对象到底是什么具体类型,
就可以使用该对象的某些方法。
2、 提高了程序的扩展性和可维护性
3.解耦合(多个模块之间的关联) 高内聚低耦合
现在我采用时期来展示代码的多态 分为编译时期多态和运行时期多态 判断是否是运行时期多态要看是不是运行时期绑定的代码
在编译时期不知道要传入的是什么对象,只有在把实参给定的时候要传入的是什么对象。
编译时期: ----编译时多态---编译时期绑定代码 下面两个函数 参数不一样那么就是在编译时期m方法展现出多种状态
public static void m(){} public static void m(int i,int j){}
运行时期多态 -重写,向上转型
public static void main(String[] args) { A12 a=new B12(); a.m(); System.out.println(a.i); } } class A12{ int i=100; void m() { System.out.println("f"); } } class B12 extends A12{ int i=1000; void m() { System.out.println("z"); }
结果是100 z 向上转型时 属性是父类的,方法是执行的是子类的。
java类加载顺序
JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的, 静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。
先初始化父类的静态代码--->初始化子类的静态代码-->
初始化父类的非静态代码--->初始化父类构造函数--->
初始化子类非静态代码--->初始化子类构造函数