黑马程序员技术交流社区

标题: JAVA学习中的一些问题 [打印本页]

作者: 余雷    时间: 2013-5-2 11:48
标题: JAVA学习中的一些问题
本帖最后由 余雷 于 2013-5-3 12:15 编辑

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


作者: 吴传淦    时间: 2013-5-2 11:52
构造函数是用于初始化的。
因为子类继承父类,创建对象的时候就要继承初始化后的父类的成员变量和成员函数。
作者: 阿彪    时间: 2013-5-2 11:55
  因为你继承了父类,子类中绝对有一行隐匿  代码访问父类。  子类访问,如果父类中没有抽象实现,也可以覆盖父类的方法。
作者: 海不扬波    时间: 2013-5-2 11:56
先小小纠正一下,java里面一般不叫函数,叫方法,这是Java的一个小习惯。
你这个问题原因很简单。
首先,任何类都有构造方法,难怕是你不写,也会默认你有一个有无参构造方法。,所以你的A里面就会有一个叫A()的构造方法。
当你new A()时,默认你有一个有无参构造方法A()的方法里的第一句,会自动加上一个super();的方法,这句就是调用父类构造方法的意思,这是java规定的规则。
你可以尝试一下,在A里写一个构造方法:
A(){
super();   //这个一定要放在第一句
System.out..XX;
}
这与你不写super()这句效果是一样的,因如果没写,java会默认在第一句加上super。
作者: 403383221    时间: 2013-5-2 12:05
首先要明确一点,就是由于先有父类后有子类,所以生成子类之前要首先有父类
当你创建一个子类对象时,会调用它的构造函数,假如它的构造函数里没有调用父类的构造函数,那如何完成父类的初始化动作?如果不能对父类进行初始化动作,就不存在
先有父类后有子类这个说法了
所以整个过程就是:
创建子类的实例时,首先要执行子类的构造函数,但是由于子类继承父类,所以子类的缺省构造函数自动调用父类的缺省构造函数。先产生父类的实例,然后再产生子类的实例。
作者: 花开花落总相似    时间: 2013-5-2 12:46
  这个问题貌似有好多人问过  - -!    其实要明白这个我觉得你应该首相明白什么是面向对象编程  比如说 你要实现许多小动物  猫,狗,松鼠之类的, 你在写代码的时候会发现其实这些小动物有许多共同的特性, 这时你就会想要一种简便的写法 这种共同的方法我能不能只写一次呢,这时候就出现了这个父类也就是动物,你写了动物,那猫,狗什么的都从子类继承那父类的方法不就自然而然的有了  方便了编程  呵呵    都是个人理解 说的不好还请见谅
作者: 付银攀    时间: 2013-5-2 13:40
在子类的每一个构造函数中,都会调用父类的构造函数。调用哪一个构造函数,这里分两种情况:
(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来指定,他就会默认的去调用父类无参数的构造函数。
作者: 蔚蓝小嗨    时间: 2013-5-2 19:48
在子类的对象进行初始化时,父类的构造函数也会运行,因为子类的构造函数默认第一行有一条隐匿的语句super();
而super()会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();
作者: eternallove    时间: 2014-4-23 17:21
在多态中之所以能够把子类对象赋给父类引用,就是靠的子类无参构造函数中默认有一个super(),如果是有参构造函数中有个有参的super(...,...)是为了沿袭父类构造函数中初始化的属性,另外要是多态中的子类对象要是带参赋给了父类引用,此时这个带参的super就起到了很关键的作用。如果不加super(),先别说它会报错,那java中的多态的面子何在。。。
作者: 坏寒    时间: 2015-8-28 13:56
我来要黑马币的T T




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