黑马程序员技术交流社区

标题: 一个关于继承的小小问题,一丝疑惑 [打印本页]

作者: 宋超2356    时间: 2014-3-27 16:23
标题: 一个关于继承的小小问题,一丝疑惑
本帖最后由 宋超2356 于 2014-3-27 16:47 编辑
  1. class SuperClass {
  2.     private int n;
  3.          
  4.          
  5.     SuperClass() {
  6.         System.out.println("SuperClass()");
  7.     }
  8.    
  9.    
  10.   
  11.     /*SuperClass(int n) {
  12.         System.out.println("SuperClass(" + n + ")");   这里都注释掉了
  13.         this.n = n;
  14.     }*/
  15. }

  16. class SubClass extends SuperClass {
  17.     private int n;
  18.    
  19.     SubClass(int n) {
  20.                     //super(n);
  21.         System.out.println("SubClass(" + n + ")");
  22.         this.n = n;
  23.     }
  24.    
  25.     SubClass() {
  26.                     //super();
  27.         System.out.println("SubClass()");
  28.     }
  29. }

  30. public class Test {
  31.     public static void main(String arg[]) {
  32.         SubClass sc1 = new SubClass(400);
  33.         SubClass sc2 = new SubClass();
  34.     }
  35. }
复制代码

所有继承不是都要有调用父类的构造函数么,就是都要写上super()在子类构造函数的第一行,这样的没调用也都可以执行?是什么机制?
作者: syusikoku    时间: 2014-3-27 16:32
是会调用啊。因为你创建了子类的实例对象。这样在子类的构造方法调用之前,就要先调用父类的构造方法为父类的成员变量进行初始化。父类的成员变量变量完成初始化之后才会调用子类的构造方法为子类进行初始化。
作者: 橸瑩膤漃寞林    时间: 2014-3-27 16:53
SubClass sc1 = new SubClass(400);
        SubClass sc2 = new SubClass();这两句话在执行时,都要先调用父类,
执行结果是这样的,
SuperClass()
SubClass(400)
SuperClass()
SubClass()
作者: 橡皮-leo    时间: 2014-3-27 17:14
本帖最后由 橡皮-leo 于 2014-3-27 17:21 编辑

  SubClass() {                     //super();         System.out.println("SubClass()");     }因为在子类继承父类的,在创建子类对象的时候,子类的构造函数第一句会默认有一个super()访问父类的构造函  SubClass sc1 = new SubClass(400);
当子类对象创建的时候 优先访问了父类的构造函:SuperClass() 接着访问带400参数的子类函数:SubClass(400),当SubClass sc2 = new SubClass();创建了第二对象时再次访问了父类的构造函数,接着访问子类的SubClass().

作者: 杨殿生    时间: 2014-3-27 17:54
调用了子函数对象才会调用父类的构造函数,不调用子类对象是不会调用父类构造函数的




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