Java 面试题[1]
题目1
Java
public class Base {
public Base() {
testA();
}
public void testA() {
}
}
public class ChildClass extends Base {
private int num = 123;
public ChildClass() {
}
public void testA() {
System.out.println(num);
}
}
public class JavaTestMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
ChildClass child = new ChildClass();
child.testA();
}
}
输出结题:
0
123
第一次输出是在new过程中输出的,在new过程中,首先是初始化父类,父类构造方法调用testA()方法,testA()方法被子类重写了
,就会调用子类的testA()方法,子类方法访问子类实例变量a,而这个时候子类的实例变量的赋值语句和构造方法还没有执行,
所以输出的是其默认值0。
把 private int num = 123;
修为:
private static int num = 123;
输出结题:
123
123
考点:类的实例化顺序
在父类构造方法中调用可被子类重写的方法,是一种不太友好的实践,容易引起混淆,应该只调用private的方法
题目2
Java
public class ShoujiOdm {
private int j = getI();
private int i = 1;
public ShoujiOdm() {
i = 2;
}
private int getI() {
return i;
}
public static void main(String[] args) {
ShoujiOdm ii = new ShoujiOdm();
System.out.println(ii.j);
}
}
//打印结果:0
分析:Java是按照编程顺序来执行实例变量初始化和实例代码块初始化的,并且不允许顺序靠前的实例代码块初始化在其后面定义的实例变量
版权声明:如无特殊标注,文章均为本站原创,转载时请以链接形式注明文章出处。
评论