如下为今天京北方的笔试题:
-----------------------类A
public class A {
static {
System.out.println("A1");
}
public A(){
System.out.println("A2");
}
}
---------------类B-------------------
public class B extends A{
static {
System.out.println("b1");
}
public B(){
System.out.println("b2");
}
public static void main(String[] args){
A ab = new B();
ab = new B();
}
}
问输出结果?当时一下子给整蒙了,也怪我对static就没怎么在意,所以再看到A ab用父类引用子类的代码后就一直在这里打转了,就写了个答案abab!哎~差得十万八千里了。
被static修饰的方法或者变量属于类,而不属于对象。所以可以用类名或者对象名引用这些方法或者变流量,当遇到没有实例化的声明时,这些方法仍然会被执行!
结果是
A1
b1
A2
b2
A2
b2
为什么呢?首先A ab 执行A中的静态方法输出A1,然后因为没有构造A1的对象,所以不可能输出A2;构造了B的对象所以输出了b1 A2 b2,为什么呢?这里可就有窍门了。构造B的对象时,先执行静态代码块,静态代码块属于类,每个对象都可以执行而且是在构造方法之前执行,输出b1;接下来执行构造方法,B继承了A,所以首先执行A的构造方法,输出了A2,再执行自己的构造方法输出了b2;最后的A2 b2,因为ab之前指向的是一个B对象的地址,然后再赋予一个B对象的地址,所以不会再执行之前A中的静态方法,只会执行new B()应该输出的结果。