Java 面试题[1]

sancaiodm 面试题 2021-11-27 1257 0

题目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是按照编程顺序来执行实例变量初始化和实例代码块初始化的,并且不允许顺序靠前的实例代码块初始化在其后面定义的实例变量


评论