public class A {
public A() {
init();
}protected void init() {}public void print() {
System.out.print("1");
}
}
public class B extends A{
private String b1=null;
protected void init() {
this.b1 = "0";
print();
}
public void print() {
// TODO Auto-generated method stub
System.out.print(b1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
A a =new B();//输出0
a.print();//输出null?
}}结果为是么是0null?
0还好理解 a.print()结果为什么是null? b不是0吗面试题Java
的写法等同于
private String b1;
{
b1 = null;
}而{}块中的赋值是在构造方法之后执行的。所以最终b1被指向null。
a.print();B覆盖了A类的print方法,所以这是多态。会调用B类的print方法.B类的方法只是打b1,而b1是String类型,是引用类型,默认为null。又因为B类没显式构造器,b1没显式在构造器里初始化,所以一直还是null啊
1.new B();首先在堆中创建一个B类的对象,在创建的时候要先调用构造方法,由于B中没有自己的构造方法,所以要调用父类的构造方法作为自己的去用他。
2.在调用的时候,要执行init()方法,B已经覆盖了A中的方法,所以执行B中的protected void init() {
this.b1 = "0";
print();
}此时b1被赋值为0,然后执行print()方法,打印出0.
3.执行完构造方法后,做private String b1=null;b1被指向了一个空值,然后做a.print();,打印后当然是null,不知道这样解释你懂了吗?不懂可以问我。。
public class B extends A {
//4、super()执行完就开始构造B类
//调用B()的构造之前,会先执行静态代码
//此时b1=0,然后执行b1=1,然后b1=2
private String b1 = "1";
{
b1="2";
}
public B(){
//2、然后new B()的时候执行到这
//此时b1=null,然后进入A类的构造方法
super();
//5、静态代码执行完后,b1=2
//然后才是B类自己的构造代码,执行b1=3
b1="3";
} protected void init() {
//3、A类构造方法调用init后执行到这
//此时b1=null,接下来b1=0并print输出0
this.b1 = "0";
print();
} public void print() {
// TODO Auto-generated method stub
System.out.print(b1);
} public static void main(String[] args) {
//1、先分配A类的内存,再分配B类的内存
//此例中可视为A类不占内存,B类只有b1占内存
//虽然给b1分配了内存,但b1是引用类型,所以此时b1=null
//如果b1是基础类型(比如int),那分配内存的时候就有默认值
A a = new B();// 输出0
//6、B构造完了,此时b1=3
a.print();// 输出null?
}}
会调用父类的构造方法,因为父类构造方法中调用了init方法,但是子类复写了init方法所以调用了子类的init方法。子类init中调用print方法也是调用的子类中的。。b1在子类的init方法中被赋值为0.所以会输出0.。
在执行完父类构造函数的时候会执行到 private String b1=null; 所以此时b1=null了。
a.print();
执行依然是子类复写了的print方法。。所以这个地方就输出null咯。表达能力不是很好,希望能看到。
public A() {
init();
}执行其中的init();时,因子类重写了该方法,所在实际上执行的是子类B的init()方法
于是,输出0
再执行B类的构造方法
接着初始化B类的成员
private String b1 = null;再接着执行
a.print();
此时执行的是B类重写的print()方法
public void print() {
System.out.print(b1);
}于是输出了null
至于第二个为什么是null,a对象没有被赋值.
1.父类实例变量的初始化
2.父类构造器
3.子类实例变量的初始化
4.子类构造器