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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张红 中级黑马   /  2012-3-12 17:51  /  1979 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在java继承中,子类对象在实例化时会默认调用父类中无参构造器,之后在调用本类的构造器。那么如果父类中没有无参构造器,只有有参的构造器,那么子类还会调用它吗?

7 个回复

倒序浏览
是不是父类中一定会有一个无参构造函数?除非这个构造函数被定义?
我不知道,表听我的,就是讨论
等结果
回复 使用道具 举报
子类的实例化过程:

子类的所有构造函数,默认都会访问父类中的空参数构造函数
因为子类每一个构造函数的第一行都有一句隐式super();
当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问的父类中的构造函数
当然:子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数
子类中至少会有一个构造函数会访问父类中的构造函数

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
不会,如果父类没有无参的构造器,就会调用默认构造器、
默认构造器就是编译器在你没有编写构造方法的时候默认的给你添加的构造器



package DailyTest;

public class Test {
        public static void main(String[] args){
                son s = new son();
                s.get();
        }
}

class father{
        String s = "";
        public father(String s){
                this.s = s;
                System.out.println("father class" + s);
        }
}

class son{
        public son(){
               
        }
        void get(){
               
        }
}


什么都不输出,就说明没有调用父类有参的构造函数

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1 同学,如果父类定义了其他构造函数,那么就不.

查看全部评分

回复 使用道具 举报
在java继承中,子类对象在实例化时会默认调用父类中无参构造函数,因为子类每一个构造函数内的第一行都有一句隐式super();当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数,否则有可能编译失败,就好像下面的代码
class Fu
{
        Fu(int  x)
        {
        System.out.println("fu ...."+x);
        }
       
}

class Zi extends Fu
{
       
        Zi(int x)
        {
                 //super(3);
          System.out.println("zi..."+x);
        }
}
如果没有注释的部分,就会默认调用super();,但在父类中是没这个无参函数的,所以编译失败
补充一下3楼的说法:“子类的构造函数第一行也可以手动指定this()(假设调用空参数)语句来访问本类中的构造函数
子类中至少会有一个构造函数会访问父类中的构造函数”这时必须保证父类中有空参数构造函数(自定义或默认)可以被子类空参数构造函数调用或者在子类空参数构造函数中调用自定义父类构造函数,否则编译失败,
总之,一句话,无论怎样,子类中必须会有至少一个构造函数调用父类构造函数,而且肯定在第一行
回复 使用道具 举报
本帖最后由 四海为家 于 2012-3-13 21:30 编辑

我想说的也是子类的实例化过程,可能上面的已经有朋友回答过了,但是我觉得我的答案全些:(如果有更全的,希望指点,谢谢)
子父类中的构造函数的特点:
在运行时,发现父类构造方法先运行了,然后才是子类构造函数。只是为什么呢?
原因:是因为类的所有的构造函数中,都有一句默认的隐式语句 super();会默认调用父类中空参数的构造函数。
为什么要有super默认语句呢?因为子类对象在初始化时,必须要到父类先去初始化。
为什么非要到父类中去初始化呢?那是因为,子类继承了父类,可以获取到父类中的数据。
所以在使用父类数据之前,必须要明确父类是如何对自己的成员进行初始化的。
如果父类中的没有空参数的构造函数,那么子类的构造函数就必须手动的通过super语句或this语句指定要访问的父类中的构造函数或者子类中的其他构造函数。
我们要记住的是,super语句而且一定要定义在构造函数的第一行,注意除了Object类中没有super语句,因为它是最顶层了,没有父类了,其他所有类的构造函数都必须有super语句。
回复 使用道具 举报
如果父类的构造函数自己定义了参数,而子类默认的super()代码仍然存在,要么我们在父类中手动定义空参数的构造函数,或者在子类中复写super(参数),来指明其调用的有参数的构造函数,否则的话编译时将会报错。
回复 使用道具 举报
冯建鹏 黑马帝 2012-3-14 00:46:58
8#
1、子类只继承父类的默认(缺省)构造函数,即无形参构造函数。如果父类没有默认构造函数,那子类不能从父类继承到任何构造函数。
2、子类从父类处继承来的父类默认构造函数,不能成为子类的默认构造函数。
3、在创建对象时,先调用父类默认构造函数对对象进行初始化,然后调用子类自身自己定义的构造函数。
4、如果子类想调用父类的非默认构造函数,则必须使用super来实现。
5、子类必须调用父类的构造函数。可以通过系统自动调用父类的默认构造函数,如果父类没有默认构造函数时,子类构造函数必须通过super调用父类的构造函数。

那么如果父类中没有无参构造器,只有有参的构造器,那么在运行的时候就会报错。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马