今天在微信群里有人问了这么一道题,求答案
public class Test {
public static void main(String[] args) {
A a=new B();
}
class A {
int a=3;
public A (){
System.out.println("构造A");
if (a==5){
printA();
}
}
public void printA() {
System.out.println("调用A");
System.out.println("A:printA="+a);
}
}
class B extends A{
int a=5;
public B(){
System.out.println("构造B");
printA();
}
public void printA(){
System.out.println("调用B");
System.out.println("B:printA="+a);
}
}
结果为5,然后改了一下这道题,
把类A里的int a=3改为int a=5,求解
结果为0 5
static(父类)->
static(子类)->
成员变量初始化(父类)->
构造代码块(父类)->
构造方法(父类) ->
成员变量初始化(子类)->
构造代码块(子类)-> 构造方法(子类)
另外注意父类构造方法里的printA是调用的子类的方法
构造方法(父类) -> 成员变量初始化(子类)
父类构造方法里的printA是调用的子类的方法
这个时候子类的a 还没有初始化 是 0
开始菜鸡互啄(我也是其中一个,emmm)
绕的地方就是A的构造方法里判断 a==5,这个a是父类A的a,
但调用的方法pringA()是子类B的,这时候B的a还没有初始化,所以是0
printA()方法,其实从头到尾调用的都是B类重写的方法,A类中的根本没有用到
B类对printA进行了重写,只要没有加上super,调用的一直都是B类中重写的方法
知道了构造器的加载顺序,再知道重写方法的调用,就能知道怎么回事了
然后是这个问题(请允许我做一个悲伤的表情)
A a=new B()改为B b=new A()
B b=new A();//编译不通过
直白的解释:猫是一只动物,但是你能说动物是一只猫么?
B继承了A类,所以B是子类,A是父类,B b = new A();
你这个儿子要生你爸爸出来吗,你这个逆子