您现在的位置是: 首页 >  个人博客 >  据说是一道华为Java面试题 个人博客

据说是一道华为Java面试题

2018-12-26 11:12:31 【问答】1527人已围观

简介 请问下面程序将会输出什么?程序如下:public class Test { class A{ private static final int m = 10; public A(){ change(); } public void change(){ System.ou......

请问下面程序将会输出什么?程序如下:

public class Test {
	
	class A{
		
		private static final int m = 10;
		
		public A(){
			change();
		}
		
		public void change(){
			System.out.println(m);
		}
	}


	class B extends A{
		
		private static final int num = 20;
		
		public void change(){
			System.out.println(num);
		}
			
	}

}

输出测试:

public class Test2 {
	
	public static void main(String[] args) {
		new Test().new B();
	}

}

结果公布,最终会输出:20,为什么?分析一下继承的初始化顺序。

继承的初始化顺序一般如下:

父类的静态变量-->父类的静态代码块-->子类的静态变量-->子类的静态代码快-->父类的非静态变量(父类的非静态代码块)-->父类的构造函数-->子类的非静态变量(子类的非静态代码块)-->子类的构造函数

值得注意的是:父类的非静态变量(父类的非静态代码块)是同一级的,看哪个部分写在类的最前面谁就先被执行,子类的非静态变量(子类的非静态代码块)也是一样。

所以这道题,实例化一个子类,首先会去执行父类的构造方法,执行构造方法中的函数change,但是由于change函数被子类重写了,所以执行的将是子类的change,所以会输出20;

但是,如果我们把子类的中的

private static final int num = 20;

改为

private int m = 20;

那么结果又会输出什么呢?结果是0,因为在父类的构造方法中调用子类的change方法输出num的时候,num作为一个实例变量,这时候还没有被实例化赋值,所以取得是初始值0。

Tags: 继承 多态

很赞哦! (0)

随机图文