黑马程序员技术交流社区

标题: 子父类构造函数 [打印本页]

作者: zclove898    时间: 2011-12-8 00:34
标题: 子父类构造函数
本帖最后由 zclove898 于 2011-12-8 23:28 编辑

   子类是否会继承父类的构造函数,为什么?谢谢
作者: 周胜    时间: 2011-12-8 00:47
本帖最后由 周胜 于 2011-12-8 00:55 编辑

java继承中对构造函数是不继承的,只是调用(隐式或显式)。

以下是例子:

public class FatherClass {

public FatherClass() {
       System.out.println(100);
}

public FatherClass(int age) {
      System.out.println(age);
}

}



public class SonClass extends FatherClass{

        public SonClass() {
         }

        public SonClass(int c) {
                 System.out.println(1234);
        }
   
public static void main(String[] args) {

  SonClass s = new SonClass(66);

}
}

编译后执行结果如下是什么呢?

分析:SonClass s = new SonClass(66);执行这句时,调用

public SonClass(int c) {
                 System.out.println(1234);//系统会自动先调用父类的无参构造函数(super())
        }



在这个构造函数中,等价于

public SonClass(int c) {

                super();//必须是第1行,否则不能编译
                 System.out.println(1234);
        }

所以结果是    100
             1234

在创建子类的对象时,Java虚拟机首先执行父类的构造方法,然后再执行子类的构造方法。在多级继承的情况下,将从继承树的最上层的父类开始,依次执行各个类的构造方法,这可以保证子类对象从所有直接或间接父类中继承的实例变量都被正确地初始化。

3.如果子类构造函数是这样写的

public SonClass(int c) {

                super(22);//必须是第1行,否则不能编译
                          //显式调用了super后,系统就不再调用无参的super()了;
                 System.out.println(1234);
        }

执行结果是   22
            1234

总结1:构造函数不能继承,只是调用而已。

如果父类没有无参构造函数

创建子类时,不能编译,除非在构造函数代码体中第一行,必须是第一行显式调用父类有参构造函数

如下:

SonClass (){

super(777);//显示调用父类有参构造函数

System.out.println(66);

}

如果不显示调用父类有参构造函数,系统会默认调用父类无参构造函数super();

但是父类中没有无参构造函数,那它不是不能调用了。所以编译就无法通过了


作者: 小春同学    时间: 2011-12-8 00:51
肯定不会呀,子类对象只会显式或隐式调用父类的构造函数,用super();
需注意的是:在创建子类的对象时,JVM首先执行父类的构造方法,然后再执行子类的构造方法.
作者: 常登凯    时间: 2011-12-8 00:53
楼上说的很详细了,子类不继承父类的构造函数,但是会默认调用父类的无参构造函数,假如父类定义了多个构造函数,那么我们知道系统不会自动为父类再生成无参构造函数了,所以此时子类的构造函数若是没有清楚的写明调用父类的那个构造函数的话,子类就会仍然调用事实上不存在的父类的无参构造函数,此时就会报错。。所以一般来说父类定义多个构造函数的时候应该手动写一个无参的构造函数;而且子类在调用构造函数时应该写明调用父类的那个构造函数
作者: zclove898    时间: 2011-12-8 01:02
周胜 发表于 2011-12-8 00:47
java继承中对构造函数是不继承的,只是调用(隐式或显式)。

以下是例子:

很受用,谢谢了
作者: 方书堂    时间: 2011-12-8 10:14
周胜 发表于 2011-12-8 00:47
java继承中对构造函数是不继承的,只是调用(隐式或显式)。

以下是例子:

写的很详细。同样受教了
作者: 周敏2011nc    时间: 2011-12-8 10:48
父类中的构造方法可有可无,编译器会为没有用构造方法的的类创建一个默认的构造方法
在子类中,如果不写构造方法,编译器同样会加上默认的构造方法,并调用父类的默认构造方法
在子类中,如果写了子类的构造方法,而不写调用父类的构造方法,编译器会隐式的调用父类的默认构造方法
在子类中,如果写了子类的构造方法,并指定了调用父类的构造方法,编译器会显式的去调用父类构造方法
总结 : 在继承中,始终会显式或隐式的去调用父类的构造方法 ,显式调用(则父类的构造方法可以是默认的,也可以是自己的);隐式调用(则说明父类中只有默认构造方法)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2