黑马程序员技术交流社区

标题: 子类的构造函数可不可以不访问父类中的构造函数? [打印本页]

作者: 曾经的迷失    时间: 2014-2-25 08:37
标题: 子类的构造函数可不可以不访问父类中的构造函数?
子类的构造函数可不可以不访问父类中的构造函数?

作者: syw02014    时间: 2014-2-25 09:47
Java中:
      在Java中,子类的构造过程中,必须 调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来,当new一个子类对象的时候,必须首先要new一个父类的对像出来,这个父类对象位于子类对象的内部,所以说,子类对象比父类对象大,子类对象里面包含了一个父类的对象,这是内存中真实的情况.构造方法是new一个对象的时候,必须要调的方法,这是规定,要new父类对象出来,那么肯定要调用其构造方法,所以:
       第一个规则:子类的构造过程中,必须 调用其父类的构造方法一个类,如果我们不写构造方法,那么编译器会帮我们加上一个默认的构造方法,所谓默认的构造方法,就是没有参数的构造方法,但是如果你自己写了构造方法,那么编译器就不会给你添加了所以有时候当你new一个子类对象的时候,肯定调用了子类的构造方法,但是在子类构造方法中我们并没有显示的调用基类的构造方法,就是没写,如:super(); 并没有这样写;
       第二个规则:如果子类的构造方法中没有显示的调用基类构造方法,则系统默认调用基类无参数的构造方法。
注意:如果子类的构造方法中既没有显示的调用基类构造方法,而基类中又没有默认无参的构造方法,则编译出错,所以,通常我们需要显示的:super(参数列表),来调用父类有参数的构造函数。

    C++中:
    一,父类没有写出构造函数,子类的构造函数可以写成“任何”形式而不用顾及父类的构造函数。例如:父类为CA,子类为CB,父类中没有写出任何构造函数,则子类中可以不写构造函数,或者构造函数可以写成以下几种:
    CB(){};
    CB():CA(){};
    CB(int a, int b){};
    CB(int a, int b):CA(){};
这几种形式都可以。即完全忽略父类的构造函数。
      二,父类只写出了一个无参构造函数,则子类可以不写构造函数,或者写成以下几种。
    CB(){};
    CB():CA(){};
    CB(int a, int b){};
    CB(int a, int b):CA(){};
即当父类只写出一个无参构造函数或者没有写构造函数效果是一样的。
       三,父类只写出了一个有参构造函数,此时,子类应该“标准”地写出构造函数,例如:
    CA(int a, int b){};
    CB(int a, int b):CA(a,b){};
或者:
    CA(int a, int b){};
    CB(int a, int b ,int c):CA(a,b){};
        四,父类有多个有参构造函数,此时,子类最少实现一个父类的构造函数即可。
        五,父类有多个有参函数和一个无参构造函数。,此时,子类只需实现一个父类的构造函数即可,不管子类实现的是有参构造函数还是无参构造函数。
这时候应该注意,即使子类写成CB(){};也是正确的,说明父类的无参构造函数可以忽略。甚至写成CB(int a, int b){};也是正确的。
总结:
    1,当父类有显式写出的构造函数时,子类最低限度的实现父类中的一个。
    2,当父类没有显式写出构造函数时,子类可以不写构造函数或者“自由”书写构造函数;更为普遍的规律总结如下:子类的构造函数以最少满足父类的一个构造函数为准。


作者: 张继鲁    时间: 2014-2-25 10:15
先是有父类,然后才有子类,父类都没有,子类如何存在呢 ?在调用构造方法的时候,是先调用父类的构造方法,在调用子类的构造方法,是因为有继承关系存在时,子类要把父类的内容继承下来。


作者: kkopopo    时间: 2014-2-25 10:24
  1. class Father{
  2.         Father(){
  3.                
  4.         }
  5.         Father(int x){
  6.                
  7.         }
  8.        
  9. }
  10. class Children extends Father{
  11.         Children(){
  12.                 super();
  13.         }
  14.         Children(int x){
  15.                 this();
  16.         }
  17.        
  18. }
复制代码

作者: chenfc8578    时间: 2014-2-26 00:02
直接使用super()就可以调用,但必须放在首行
作者: 枫露    时间: 2014-2-26 10:23
我通俗的理解:子承父业;
作者: zxg08042810    时间: 2014-2-26 11:36
不可以,必须调用
作者: 木多米    时间: 2014-3-9 23:13
不可以,必须调用,因为构造函数初始化要先进行。
作者: 欧阳疯    时间: 2014-3-10 10:27
不 行 的 .这 是 OOP的 最 基 本 实 现 原 理 .
一 个 空 的 构 造 函 数 ,看 起 来 虽 然 啥 也 没 干 ,其 实 OOP的 编 绎 器 是 从 这 里 开 始 动 工 建 造 我 们 写 好 的 类 中 的 信 息 .子 类 是 继 成 父 类 的 , 子 类 就 会 包  父 类 的 信 息 ,在 构 造 一 个 子 类 时 父 类 中 的 信 息 要 靠 父 类 的 构 造 方 来 完 成 .




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