黑马程序员技术交流社区

标题: 为什么子类一定要访问父类中的构造函数 [打印本页]

作者: 癞蛤蟆    时间: 2014-6-16 12:51
标题: 为什么子类一定要访问父类中的构造函数


作者: 来男.    时间: 2014-6-16 12:52
本帖最后由 来男. 于 2014-6-16 13:04 编辑

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

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

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

楼主可不可以呀?


作者: 华子    时间: 2014-6-16 12:54
因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。
作者: 癞蛤蟆    时间: 2014-6-16 12:58
华子 发表于 2014-6-16 12:54
因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。 ...

是这样啊  谢谢了
作者: 华子    时间: 2014-6-16 12:59
癞蛤蟆 发表于 2014-6-16 12:58
是这样啊  谢谢了

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

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

结论:
子类中的所有的构造函数,都会访问父类中的空参数的构造函数,
因为子类的每一个构造函数的第一行都会有一个隐式的super()语句。
当父类中没有空参数的构造函数时,子类必须手动super()语句来访问父类中的构造函数。
当然子类的构造函数中也可以手动指定zhis()语句来访问本类中的构造函数,
但子类至少会有一个构造函数来访问父类的构造函数。

作者: Alan_Kwan    时间: 2014-6-16 15:16
其实我觉得这是一个体现面向对象思想,减少代码重复的一个点。JAVA认为子类会继承父类的构造函数中对成员变量的初始化,为了减少代码的重复,所以如此。。

纯属自我理解。
作者: 墓____夜    时间: 2014-6-16 23:27
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 23:28
给加技术分啊、
作者: sam9204    时间: 2014-6-16 23:37
来男. 发表于 2014-6-16 13:02
原因:子类的所有构造函数中的第一行,其实都有一条隐身的语句super();
解释:super()表示父类的构造函数并 ...

很好,受教了
作者: 华子    时间: 2014-6-16 23:43
癞蛤蟆 发表于 2014-6-16 12:58
是这样啊  谢谢了

不谢不谢
作者: 江海豪    时间: 2015-10-11 21:35
1:子类继承了父类的属性,如果要使用父类的属性必须初始化,创建子类对象,必须先初始化父类属性
                                必须调用父类的构造方法。
                        2:为什么调用父类无参的构造函数
设计java语言之时,只知道编译器会默认添加无参的构造函数,有参的无法确定。
                                但是可以通过super关键字显式调用父类指定构造函数。
                        3:为什么super()this()语句要放在构造函数的第一行
                                子类可能会用到父类的属性,所以必须先初始化父类。
作者: 夕风秋凉    时间: 2015-10-27 02:03
以后这样理解吧兄弟,我也是刚学,也要去北京,构造儿子,就得构造个爸爸,没爸爸,儿子出不来,所以得调用爸爸构造方法,至于怎么调用就不必说了




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