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

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

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





转载于:https://my.oschina.net/u/266531/blog/84886

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值