黑马程序员技术交流社区

标题: 继承的问题 [打印本页]

作者: Asan    时间: 2013-4-17 19:51
标题: 继承的问题
  1. package cn.learn.test;

  2. public class Test {


  3. public static void main(String[] args) {
  4. Student s = new Student();

  5. }

  6. }
  7. class Person{
  8. Person(){
  9. System.out.println("调用父类的构造方法!");
  10. }
  11. }
  12. class Student extends Person{
  13. Student(){
  14. System.out.println("调用子类的构造方法!");
  15. }
  16. }
复制代码
为什么我的main方法里之创建了学生类,但打印结果为甚打印了
调用父类的构造方法!
调用子类的构造方法!


作者: 杨冉    时间: 2013-4-17 20:39
因为子类实例化的时候一定会调用父类的无参构造方法的。其实在子类的代码里,隐藏了一个super();也就是父类的无参构造方法:
  1. public class Test {

  2.         public static void main(String[] args) {

  3.                 Student s = new Student();

  4.         }

  5. }

  6. class Person {

  7.         Person() {

  8.                 System.out.println("调用父类的构造方法!");

  9.         }

  10. }

  11. class Student extends Person {

  12.         Student() {

  13.                 super();        //这个是隐藏的,调用父类的构造方法

  14.                 System.out.println("调用子类的构造方法!");

  15.         }

  16. }
复制代码

作者: 艾萱    时间: 2013-4-17 20:49
在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行都有一条隐式的super(),super()会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();。
作者: PANZERLEADER    时间: 2013-4-17 21:01
  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 Student s = new Student();

  4.         }

  5. }

  6. class Person {
  7.         Person() {
  8.                 System.out.println("调用父类的构造方法!");
  9.         }
  10. }

  11. class Student extends Person {
  12.         Student() {
  13.                 //子类会强制调用父类无参的构造方法,并且这个语句是隐藏的,即
  14.                 //super();
  15.                 System.out.println("调用子类的构造方法!");
  16.         }
  17. }
复制代码
并且,如果父类中没有无参的构造方法,比如下面这种情况:
  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 Student s = new Student();

  4.         }

  5. }

  6. class Person {
  7. //这里因为只定义一个有参数的构造方法,把默认的无参构造方法清除了,导致编译报错。
  8.         Person(String name) {
  9.                 System.out.println("调用父类的构造方法!");
  10.         }
  11. }

  12. class Student extends Person {
  13.         Student() {
  14.                 //子类会强制调用父类无参的构造方法,并且这个语句是隐藏的,即
  15.                 //super();
  16.                 System.out.println("调用子类的构造方法!");
  17.         }
  18. }
复制代码
这样的情况下,因为父类没有无参的构造方法,程序是无法编译的。

但是,如果把隐藏的构造方法改成有参数的,则程序可以编译通过,即:
  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 Student s = new Student();

  4.         }

  5. }

  6. class Person {
  7.         Person(String name) {
  8.                 System.out.println("调用父类的构造方法!");
  9.         }
  10. }

  11. class Student extends Person {
  12.         Student() {
  13.                 //子类会强制调用父类无参的构造方法,并且这个语句是隐藏的,即
  14.                 //super();
  15. //这里,将子类的构造方法中隐藏的super()显式写成super(字符串),也就是父类的构造方法,程序可以通过编译
  16.                 super("string");
  17.                 System.out.println("调用子类的构造方法!");
  18.         }
  19. }
复制代码
总结下:
1、子类构造方法默认调用父类的无参构造方法,隐含调用语句super()。
2、父类构造方法如果没有无参的构造方法,子类可以显式的调用父类有参数的构造方法,即super(父类构造方法的参数类型),也可以通过编译。







作者: 梁志兵    时间: 2013-4-17 21:05
package cn.learn.test;



public class Test {





public static void main(String[] args) {

Student s = new Student();



}



}

class Person{

Person(){

System.out.println("调用父类的构造方法!");

}

}

class Student extends Person{

Student(){
     super(); //这里会有个默认的父类的构造函数,不写 super(); 也会有
System.out.println("调用子类的构造方法!");

}

}


作者: 刘兆华    时间: 2013-4-17 23:44
这就是类与类之间使用extends关键字产生的继承关系的特性。在子类的构造函数中如果你不写super(),运行时,虚拟机会在子类构造函数自动添加上去一个super()来调用父类构造函数。
作者: 16463535    时间: 2013-4-18 18:49
希望你看一下毕老师的视频,关于继承这部分的。

因为 子类的构造方法中,你没有写明 要调用父类哪一个构造方法的时候,会有一条 隐式的 super() ,代表调用父类的空参数构造方法。

当然了,你也可以写明调用父类的哪一个构造方法,用参数来区分。你传递什么样的参数,就会调用与之对应的构造方法。




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