Java 面试题[1]
题目1
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
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是按照编程顺序来执行实例变量初始化和实例代码块初始化的,并且不允许顺序靠前的实例代码块初始化在其后面定义的实例变量
版权声明:如无特殊标注,文章均为本站原创,转载时请以链接形式注明文章出处。
评论