日期:2014-05-20  浏览次数:20750 次

关于继承类的创建问题
class A{
static{
System.out.print("1");
}
public A(){
System.out.print("2");
}
}
class B extends A{
static{
System.out.print("a");
}
public B(){
System.out.print("b");
}  
}
public class Hello{
public static void main(String[] ars){
A ab = new B(); //执行到此处,结果: 1a2b
ab = new B(); //执行到此处,结果: 1a2b2b
}
}
问题:如果始终以ab指向新建的对象(ab = new B();),结果是1a2b2b2b...... 请帮忙解释一下。。。

------解决方案--------------------
没看出什么问题啊,static的是属于类的,只构造一次。构造完static再构造函数,每构造出一个B对象打印出来一个2b(楼主的变量名起得很有喜感。。。)
------解决方案--------------------
你认为应该输出的是什么啊
------解决方案--------------------
跟引用变量的类型没一毛钱关系,写成Object ab = new B();都是一样的。
第一次new B()输出1a2b,在new就永远2b,你new两次就是1a2b2b,继续new就是1a2b2b2b2b2b2b。。。。。。
------解决方案--------------------
static是静态代码块在其在加载到虚拟机时就会运行且只运行一次,其运行顺序在构造方法之前,然后各个构造方法的执行顺序是先执行父类在执行子类。
------解决方案--------------------
没有什么问题啊,静态块只执行一次,所以只有一次1和a,然后每次都构造一个新的对象,当然后面的就会一继续执行构造方法
------解决方案--------------------
A ab = new B(); //输出1a2b
ab = new B(); //输出2b
ab = new B(); //输出2b
。。。
静态的只输出一次
------解决方案--------------------
5楼正解。
------解决方案--------------------
恩,大家都分析的很到位了,我就是来顶贴的!