class Base1{
Base1(){
System.out.println("Base1");
}
}public class Sub extends Base1{

Sub(){
super();
System.out.println("Sub");
}
public static void main(String[] args) { Sub sub=new Sub();
}}为什么输出结果是:
Base1
Sub
而不是两个Base1呢?

解决方案 »

  1.   

    LZ,先说说,为啥你会理解输出为2个Base1吧
      

  2.   


    首先会调用父类的默认构造函数,输出一次base1,然后调用super()又输出一次base1.。。
      

  3.   


    为啥会调用父类的默认构造器?只有super()的时候调用一次吧
      

  4.   

    super只是显式调用父类构造器
    输出一次base1,然后调用super()又输出一次base1.。。
    所以这里应该是只输出一次base1
      

  5.   

    建议LZ看看Thinking in Java里介绍的类的Initialization order
      

  6.   

    super() 调用父类构造器  构造器中输出了一个System.out.println("Base1");
    然后在System.out.println("Sub");
    所以是Base1,Sub
      

  7.   

    你已经显式的调用了super();
    子类不会再调用父类的默认构造函数
      

  8.   

    7#  你已经显式的调用了super();
        子类不会再调用父类的默认构造函数   正确,就是这个原因
      

  9.   

      首先运行mian,看到Sub sub=new Sub();时,实例 Sub 。
      new Sub() 时,你在sub的空参构造里调用了 super()和输入了 System.out.println("Sub");。
      程序会执行super()。也就是调用你的父类,在那的父类里又有一个空参的构造
      Base1(){
            System.out.println("Base1");
        }
      程序会执行Base1(),也就会输出第一个“Base1”。
      接着程序会执行
      Sub(){
            super();//上一步执行过了
            System.out.println("Sub");
        }
    中的System.out.println("Sub");
    也就会输出“Sub”。
    所以结果是
    Base1
    Sub 
      

  10.   

    yes,去掉super,得出的结论是一样的!!!
      

  11.   

    class Base1{
        Base1(){
            System.out.println("Base1");
        }
    }public class Sub extends Base1{
        
        Sub(){
            super();
            System.out.println("Sub");
        }
        public static void main(String[] args) {        Sub sub=new Sub();
        }}AND class Base1{
        Base1(){
            System.out.println("Base1");
        }
    }public class Sub extends Base1{
        
        Sub(){
            System.out.println("Sub");
        }
        public static void main(String[] args) {        Sub sub=new Sub();    }}have the same result
      

  12.   

    这是java中多态的一种表现。
    public static void main(String[] args) {        Sub sub=new Sub();    }
    你在new sub 对象的时候 ,首先自动的调父类的构造,然后在调它本身的构造。所以结果会是
    Base1
    Sub