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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

癞蛤蟆

初级黑马

  • 黑马币:7

  • 帖子:6

  • 精华:0

© 癞蛤蟆 初级黑马   /  2014-6-16 12:51  /  13365 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币

最佳答案

查看完整内容

原因:子类的所有构造函数中的第一行,其实都有一条隐身的语句super(); 解释:super()表示父类的构造函数并会调用于参数相对应的父类中的构造函数。子类中,它在调用父类中空参数的构造函数。因为子类继承父类,会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。 特注:1、子类中所有的构造函数都会默认访问父类中的空参数的构 ...

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

16 个回复

倒序浏览
本帖最后由 来男. 于 2014-6-16 13:04 编辑

原因:
子类的所有构造函数中的第一行,其实都有一条隐身的语句super();

解释:
super()表示父类的构造函数并会调用于参数相对应的父类中的构造函数。子类中,它在调用父类中空参数的构造函数。因为子类继承父类,会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。

特注:
1、子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();
2、若父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数;
3、若子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数。

楼主可不可以呀?

点评

好厉害!!!  发表于 2014-6-16 13:04

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。
回复 使用道具 举报
华子 发表于 2014-6-16 12:54
因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。 ...

是这样啊  谢谢了
回复 使用道具 举报
癞蛤蟆 发表于 2014-6-16 12:58
是这样啊  谢谢了

必须的,我的黑马币啊
回复 使用道具 举报
因为任何对象的创建必须通过构造函数,子类无论你写不写构造函数都是对父类构造函数的重写或重载
回复 使用道具 举报
要初始化啊
回复 使用道具 举报
xp8812 中级黑马 2014-6-16 13:38:02
8#
因为没有父亲就没有儿子啊,父类就是父亲,子类就是儿子啊,子类是基于父类创造出来的。
回复 使用道具 举报
为什么子类一定要访问父类的构造函数呢?
因为父类中的数据,子类可以直接获取,所以子类对象在建立是需要先查看父类是如何对这些数据进行初始化的,所以子类对象在初始化时一定要先访问下父类当中的构造函数。
如果要访问父类中指定的构造函数, 可以通过手动定义super()语句的方式来指定

注意:super()语句一定要定义在构造函数的第一行。

结论:
子类中的所有的构造函数,都会访问父类中的空参数的构造函数,
因为子类的每一个构造函数的第一行都会有一个隐式的super()语句。
当父类中没有空参数的构造函数时,子类必须手动super()语句来访问父类中的构造函数。
当然子类的构造函数中也可以手动指定zhis()语句来访问本类中的构造函数,
但子类至少会有一个构造函数来访问父类的构造函数。
回复 使用道具 举报
其实我觉得这是一个体现面向对象思想,减少代码重复的一个点。JAVA认为子类会继承父类的构造函数中对成员变量的初始化,为了减少代码的重复,所以如此。。

纯属自我理解。
回复 使用道具 举报
public class Demo {
        public static void main(String[] args) {
                Father f = new Son();                //多态 父类引用指向子类对象
        }
}

class Father {
        public Father() {
                super(); // 父类super()会先访问object的构造函数
                System.out.println("父类的构造函数");
        }
}

class Son extends Father {
        public Son() {
                super(); // 子类super()会先访问父类的构造函数 再执行子类构造函数
                System.out.println("子类的构造函数");
        }
}
/*
* 所有类的构造函数  中 默认第一行就是super() 会先调用父类的构造函数   
*/
回复 使用道具 举报
给加技术分啊、
回复 使用道具 举报
来男. 发表于 2014-6-16 13:02
原因:子类的所有构造函数中的第一行,其实都有一条隐身的语句super();
解释:super()表示父类的构造函数并 ...

很好,受教了
回复 使用道具 举报
癞蛤蟆 发表于 2014-6-16 12:58
是这样啊  谢谢了

不谢不谢
回复 使用道具 举报
1:子类继承了父类的属性,如果要使用父类的属性必须初始化,创建子类对象,必须先初始化父类属性
                                必须调用父类的构造方法。
                        2:为什么调用父类无参的构造函数
设计java语言之时,只知道编译器会默认添加无参的构造函数,有参的无法确定。
                                但是可以通过super关键字显式调用父类指定构造函数。
                        3:为什么super()this()语句要放在构造函数的第一行
                                子类可能会用到父类的属性,所以必须先初始化父类。
回复 使用道具 举报
夕风秋凉 来自手机 中级黑马 2015-10-27 02:03:58
16#
以后这样理解吧兄弟,我也是刚学,也要去北京,构造儿子,就得构造个爸爸,没爸爸,儿子出不来,所以得调用爸爸构造方法,至于怎么调用就不必说了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马