一个经典 java 面试题引发的大案

/**
 * 
 * @author suifeng
 * @since java 1.7
 *
 */

class ww {
	int a = 12;

	void show() {
		System.out.println(a);
	}
}
class dd extends ww {

	dd() {
		 
		 a=10;
		show();
	}
	int a = 15;

	void show() {
		System.out.println(a);
	}
}
public class test1 {
	public static void main(String[] args) {
		new dd();
	}

}



这个是一个很简单的面试题大家都知道结果是啥,但是面试官问为什么不是15 或者12的时候 估计大多数人都会蒙比,其实想一想为什么不能是15。这里面有点虚拟机的知识,类的加载过程是这样子的,加载 验证  准备 解析 初始化 执行 卸载 7个阶段。成员变量的初始化是在初始化阶段进行的,如果有父类先初始化父类 在初始化子类,初始化子类安装代码的自上而下的顺序,如果成员变量有复制 int a=15; 等于int a=0 ; dd(){ a=15;},代码在已有的子类代码之前初始化。所以就为什么是结果是10,不是15 也不是12了

如果上面的代码你认为结束了就太天真了,


/**
 * 
 * @author suifeng
 * @since java 1.7
 *
 */

class ww {
	int a = 12;
	ww() {
		show();
	}
	void show() {
		System.out.println(a);
	}
}
class dd extends ww {
	dd() {
		a = 10;
	}
	int a = 15;
	void show() {
		System.out.println(a);
	}
}
public class test1 {
	public static void main(String[] args) {
		new dd(); //结果是0 
	}
}


这个结果是0,重写的函数调用是调用实例的自己的函数,初始化先初始化父类的,所以调用show()时dd类的成员变量初始化还没有开始,就只好输出0了

class ww {
	final static ww w=new ww(6);
	 static int a=6;
	 public int b=10;
	 static void show(){
		 System.out.println(a);
	 }
	 ww(int c)
	 {
		 b=a-c;
	 }
}


public class test1 {
	public static void main(String[] args) {
		
		System.out.println(ww.w.a);//6
		System.out.println(ww.w.b);//-6
		
		System.out.println(new ww(6).b);//0
		
	}
}

静态变量初始化在准备阶段 早于成员变量的所在阶段 初始化阶段,
final static ww w=new ww(6); //所以这里的 w 的 b=a-c;是b=0-6;  因为a还没有来的及初始化,结果输出的是-6.这里考的是静态变量的初始化比成员变量早


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值