[京北方笔试]java中的继承与static

以下为今天京北方的笔试题: java

-----------------------类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()应该输出的结果。 spa

相关文章
相关标签/搜索