/**
*
* @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
}
}
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.这里考的是静态变量的初始化比成员变量早