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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 唐学松 于 2012-2-25 18:08 编辑

RT
父类无参默认构造函数,创建子类时能否有参自定义构造函

6 个回复

倒序浏览
可以的,编写代码试一下就知道了。
回复 使用道具 举报

要深刻理解java中的继承问题   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

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();
回复 使用道具 举报
让我们先来看原理,超类构造函数始终会被调用,与是否显式调用super()无关。
如果没有显式调用super(),则会在子类构造函数体中的第一条语句前自动插入不包含参数的调用。
这意味着,如果您在子类中定义了一个构造函数,并且超类构造函数使用了一个或多个参数,就必须使用正确数量的参数显式调用此超类构造函数,
否则将出现错误(错误提示:未在基类**中找到相应的构造函数)。
类是不能有多个无参的构造函数的
父类只能有一个无参构造方法,并且你没写的话系统会自动给你的程序生成一个。
super()出现在子类构造方法的第一行,不写也可以,系统会自动加上,但是如果是调用父类有参数的构造方法,则必须写super(参数1,参数2,···),这时系统就不会自动加上super()了
回复 使用道具 举报
子类当然可以建立自己的构造函数。


  1. class Fu
  2. {
  3.         Fu(){} //默认空构造函数
  4. }
  5. class Zi extends Fu
  6. {
  7.         Zi(String name)
  8.         {
  9.                 System.out.println(name);
  10.         }
  11. }
  12. class Demo
  13. {
  14.         public static void main(String[] args)
  15.         {
  16.                 Zi z = new Zi("lisi");
  17.         }
  18. }
复制代码

评分

参与人数 1黑马币 +2 收起 理由
唐学松 + 2 你的解释最给力很清晰

查看全部评分

回复 使用道具 举报
我觉得这是覆写overriding和重载overloading的概念有混淆:
1,构造函数不能被覆写,因为覆写是不改变返回值类型,函数名和参数列表;
     显然子类的构造函数总不能用父类的名字吧,而且构造函数也根本没有返回值。
2,父类定义的通用的或者抽象的方法,比如Object的equals()方法,经常会被各个子类拿来重写,但返回值始终是boolean。
     某一个类中的几个方法,因为返回值类型不同,参数列表不同,甚至只有函数名相同,这就是重载了。
3,我认为,多态的实现就是通过这两种对函数的自动匹配调用,和类的函数继承来实现的。
     认识浅薄,还请指正。
回复 使用道具 举报
朱皓 中级黑马 2012-2-25 17:18:01
7#
子类在创建对象时,会首先调用父类的构造方法,如果显示调用父类的构造,就不会去调用默认的构造方法
如果没有显示调用就会去调用默认的构造方法,即使父类一个构造方法没有写,JAVA虚拟机也会提供一个默认的
这也符合要有儿子必先有父亲的说法,如果父类还有父类,那么他也遵循上面的这种规则
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马