A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© TS__likewise 中级黑马   /  2014-6-9 12:59  /  1204 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.duapp.itfanr;
class Atom {
    Atom() {

        System.out.println("A");
}

}



class Rock extends Atom {



    Rock() {



        System.out.println("B");

    }

}



class Moutain extends Rock {



    Moutain() {

    System.out.println("C");

    }



}



public class MainTest {



    public static void main(String[] args) {



        new Moutain();

    }

//为什么结果不是C????

6 个回复

倒序浏览
构造函数默认第一句是 super();   调用的父类的构造函数
回复 使用道具 举报
tiuwing 来自手机 中级黑马 2014-6-9 13:21:43
藤椅
构造函数一般都会默认调用父类的无参构造函数,例子中super()被隐藏了!当父类无无参构造函数时,要手动调用父类的构造函数……
回复 使用道具 举报
打印了一下结果是ABC。之前学C++的时候老师讲过子类父类构造函数,析构函数的调用方法。不过貌似java没有析构函数。实例化一个无参构造函数时,先看这个类有没有父类,有父类的话,就先调用父类的无参构造方法,再调用子类的。就相当于子类的构造函数前面加了一句“super();" 。本例中new Moutain();先调用Rock父类,而Rock父类的无参构造方法,前面也相当于加了一句“super();",这时候Rock父类再调用它的父类的 Atom 的无参构造方法。所以结果是ABC  
另外我试验了一下有参构造函数,发现有参构造函数并不会默认加super(参数)的。下面是在你代码前提下加的的测试代码,注释和没加注释的结果是不一样的。
  1. package com.study.two;

  2. class Atom {
  3.         String name="atom";
  4.         Atom() {

  5.                 System.out.println("A");
  6.         }
  7.         Atom(String name){
  8.                 System.out.println("Atom::"+name);
  9.         }

  10. }
  11. class Rock extends Atom {

  12.         Rock() {

  13.                 System.out.println("B");

  14.         }
  15.     Rock(String name){
  16.             //super(name);
  17.             System.out.println("Rock::"+name);
  18.     }
  19. }
  20. class Moutain extends Rock {
  21.         Moutain() {
  22.         super();
  23.                 System.out.println("C");

  24.         }
  25.         Moutain(String name){
  26.         //        super(name);
  27.                 System.out.println("Moutain::"+name);
  28.         }

  29. }
  30. public class MainTest {

  31.         public static void main(String[] args) {

  32.                 new Moutain();
  33.                 new Moutain("moutain");

  34.         }
  35. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
事实证明:
    子类默认调用父类的无参构造方法;
    如果在代码中申明默认的无参构造函数,并有函数体,如在构造函数中打印语句,相当于覆写默认的构造函数
  package com.itheima;

public class test
{
        public static void main(String[] args)
        {
        new Moutain();
    }
}
class Atom
{
    Atom()
    {
        System.out.println("A");
   }

}

class Rock extends Atom
{
    Rock()
    {
        System.out.println("B");
    }
   
    //当去掉Rock()构造方法市,将不会打印B,子类调用默认的构造方法
    //而  System.out.println("B");相当于复写了默认的构造方法
}

class Moutain extends Rock
{
   public Moutain()
   {
          super();//去掉此句,结果一样,证明子类默认调用父类的无参构造方法
      System.out.println("C");

    }

}


评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
子类对象在创建的时候会先调用自己的构造函数成员变量进行初始化,而子类的构造函数默认的第一行是super();就跑去调用父类的无参构造函数,所以结果是 ABC
回复 使用道具 举报
很多人已经给了答案
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马