面试题

原创
2018/09/06 17:53
阅读数 34

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

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

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部