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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余雷 中级黑马   /  2013-5-2 11:48  /  1988 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余雷 于 2013-5-3 12:15 编辑

我想知道在子类的构造函数中为什么要调用父类的构造函数?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

11 个回复

倒序浏览
构造函数是用于初始化的。
因为子类继承父类,创建对象的时候就要继承初始化后的父类的成员变量和成员函数。
回复 使用道具 举报
  因为你继承了父类,子类中绝对有一行隐匿  代码访问父类。  子类访问,如果父类中没有抽象实现,也可以覆盖父类的方法。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
先小小纠正一下,java里面一般不叫函数,叫方法,这是Java的一个小习惯。
你这个问题原因很简单。
首先,任何类都有构造方法,难怕是你不写,也会默认你有一个有无参构造方法。,所以你的A里面就会有一个叫A()的构造方法。
当你new A()时,默认你有一个有无参构造方法A()的方法里的第一句,会自动加上一个super();的方法,这句就是调用父类构造方法的意思,这是java规定的规则。
你可以尝试一下,在A里写一个构造方法:
A(){
super();   //这个一定要放在第一句
System.out..XX;
}
这与你不写super()这句效果是一样的,因如果没写,java会默认在第一句加上super。

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
首先要明确一点,就是由于先有父类后有子类,所以生成子类之前要首先有父类
当你创建一个子类对象时,会调用它的构造函数,假如它的构造函数里没有调用父类的构造函数,那如何完成父类的初始化动作?如果不能对父类进行初始化动作,就不存在
先有父类后有子类这个说法了
所以整个过程就是:
创建子类的实例时,首先要执行子类的构造函数,但是由于子类继承父类,所以子类的缺省构造函数自动调用父类的缺省构造函数。先产生父类的实例,然后再产生子类的实例。

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
  这个问题貌似有好多人问过  - -!    其实要明白这个我觉得你应该首相明白什么是面向对象编程  比如说 你要实现许多小动物  猫,狗,松鼠之类的, 你在写代码的时候会发现其实这些小动物有许多共同的特性, 这时你就会想要一种简便的写法 这种共同的方法我能不能只写一次呢,这时候就出现了这个父类也就是动物,你写了动物,那猫,狗什么的都从子类继承那父类的方法不就自然而然的有了  方便了编程  呵呵    都是个人理解 说的不好还请见谅

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
在子类的每一个构造函数中,都会调用父类的构造函数。调用哪一个构造函数,这里分两种情况:
(1)不显式的用super来指定。这种情况下,会默认的调用无参数的构造函数。如果父类中没有无参数的构造函数,那么程序就会出错,就像以上那个例子。把A.java中的那个构造函数去掉,程序就能通过编译。如果一个类中,没有一个构造函数,那么编译器就会给这个类加上一个无参构造函数。
(2)显式的使用super来指定调用哪一个构造函数。在B.java的构造函数中加上super(1),程序也可以通过编译。
  1. A.java
  2. class A{
  3. public A(){
  4. System.out.println("A无参数构造函数被调用");
  5. }
  6. public A(int i){
  7. System.out.println("A有参数构造函数被调用");
  8. }
  9. }
  10. B.java
  11. class B extends A{
  12. public B(){
  13. }
  14. public B(int i){
  15. }
  16. }
  17. public static void main(String[] args){
  18. new B(1);
  19. }
  20. }
复制代码
这个程序打印:无参数的构造函数被打印。而不是:有参数的构造函数被打印。你只要不使用super来指定,他就会默认的去调用父类无参数的构造函数。

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
在子类的对象进行初始化时,父类的构造函数也会运行,因为子类的构造函数默认第一行有一条隐匿的语句super();
而super()会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
在多态中之所以能够把子类对象赋给父类引用,就是靠的子类无参构造函数中默认有一个super(),如果是有参构造函数中有个有参的super(...,...)是为了沿袭父类构造函数中初始化的属性,另外要是多态中的子类对象要是带参赋给了父类引用,此时这个带参的super就起到了很关键的作用。如果不加super(),先别说它会报错,那java中的多态的面子何在。。。
回复 使用道具 举报
我来要黑马币的T T
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马