对于java中,非常重要的一个概念就是多态,但多态里面的很多坑是很容易被忽视的,在此,我总结一下我遇到的坑。
1、对于域和静态方法,是不存在多态的。demo如下:
package com.zh.model; public class Test2 { public int index = 0; public int getIndex() { return index; } public static void main(String[] args) { Test2 test2 = new Child(); System.out.println("test2.index="+test2.index+" test2.getIndex()=" +test2.getIndex()); Child child = new Child(); System.out.println("child.index="+child.index+" child.getIndex()=" +child.getIndex()); } } class Child extends Test2{ public int index = 1; public int getIndex() { return index; } public int getSuperIndex(){ return super.index; } }
输出结果为:
2、父类没有默认构造器,有带参数的构造器时,子类必须显式编写调用父类构造器的语句super(。。。)
如图,如果没有显式使用super关键字则会报错。
3、使用父类类型的引用指向子类的对象时多态加载顺序:即 在main‘方法中执行Parent parent = new Children();
先加载根基类中static初始化----根基类的子类static初始化----。。。。-----该类的static初始化-----对象中所有基本类型初始化为默认值,引用类型设为null-----调用父类构造器----调用子类构造器
class Parent {
public static int parent = 1;
static {
System.out.println(parent);
}
public Parent() {
System.out.println("Parent");
}
public static void main(String[] args) {
Parent aaa = new Children();
}
}
class Children extends Parent{
public static int children = 2;
static {
System.out.println(children);
}
public Children() {
System.out.println("Children");
}
}
输出: