黑马程序员技术交流社区

标题: 多层继承中构造方法的调用,求高手解答~ [打印本页]

作者: 双皮奶    时间: 2014-7-9 18:05
标题: 多层继承中构造方法的调用,求高手解答~
多层继承中,最底层的类能指定调用最顶层类的构造方法吗?比如A继承B,B继承C,A能直接用super指定调用C中的某个构造方法吗?
作者: 001可望成功    时间: 2014-7-9 18:26
super只是调用父类的构造方法,例如A继承B,B继承C,实例化A是,先调用C的构造方法,在调用B的构造方法,最后调用A的构造方法
作者: lancerjs    时间: 2014-7-9 19:23
本帖最后由 lancerjs 于 2014-7-9 19:26 编辑

Java中子类只能直接调用父类的构造,不能直接调用超类中的构造.
但所有构造方法中默认情况下都有一个隐藏的super(),所以要想调用超类中的空参构造是不需要做任何处理的,
子类想调用超类中的有参构造时,需要在父类的一个构造方法中的第一行使用super指向超类中的有参构造,然后在子类的一个构造方法中的第一行使用super指向父类的这个构造方法.

下面这段代码你可以自己添加main方法,使用A的两个构造分别创建对象试验一下,应该就能明白了
  1. class C {
  2.         // C的空参构造
  3.         public C() {
  4.         }

  5.         // C的有参构造
  6.         public C(int c) {
  7.         }
  8. }

  9. class B extends C {
  10.         // B的无参构造,第一行有隐藏的super()
  11.         public B() {
  12.         }

  13.         // 要在B的子类中调用C的有参构造,需要在B的一个构造中提供C的有参构造的调用
  14.         public B(int b) {
  15.                 // 通过super(传递一个参数)调用B的有参构造
  16.                 super(b);
  17.         }
  18. }

  19. class A extends B {
  20.         // A的无参构造,第一行有隐藏的super()
  21.         public A() {
  22.         }

  23.         // A想调用C的有参构造,就要调用B中调用了C的有参构造的构造方法
  24.         public A(int a) {
  25.                 super(a);
  26.         }
  27. }
复制代码




作者: 渴望学习    时间: 2014-7-9 19:45
不能,super是调用父类,而且你调用C中的某个构造也没有意义啊,因为B已经继承了C,拥有了C的变量和函数,你调用B的构造函数,B会调用C的,这不是一样的道理吗?
作者: doubandddk    时间: 2014-7-9 22:15
不能直接调用,你可以在B类中的一个构造方法中调用C类那个向北调用的构造方法,然后在A类中带调用B类中的那个构造方法;
作者: 双皮奶    时间: 2014-7-9 23:11
001可望成功 发表于 2014-7-9 18:26
super只是调用父类的构造方法,例如A继承B,B继承C,实例化A是,先调用C的构造方法,在调用B的构造方法,最 ...

谢谢~~~:)

作者: 双皮奶    时间: 2014-7-9 23:15
lancerjs 发表于 2014-7-9 19:23
Java中子类只能直接调用父类的构造,不能直接调用超类中的构造.
但所有构造方法中默认情况下都有一个隐藏的s ...

谢谢,回复很详细
作者: 双皮奶    时间: 2014-7-9 23:17
doubandddk 发表于 2014-7-9 22:15
不能直接调用,你可以在B类中的一个构造方法中调用C类那个向北调用的构造方法,然后在A类中带调用B类中的那 ...

thanks  多谢指导
作者: blue_sky    时间: 2014-7-9 23:53
2楼说的很详细了。。。。
作者: 郑飞    时间: 2014-7-10 08:17
lancerjs 发表于 2014-7-9 19:23
Java中子类只能直接调用父类的构造,不能直接调用超类中的构造.
但所有构造方法中默认情况下都有一个隐藏的s ...

public C(int c) {
//这里控制台输出点东西多直观啊:P
        }


作者: jwx555    时间: 2014-7-10 09:37
本帖最后由 jwx555 于 2014-7-10 09:39 编辑

这个是我抽到的基础测试题,person,student,goodstudent 三个类 依次继承。想要证实自己的判断最好的方法就是运行一段代码测试。
  1. public class Test09 {
  2.         public static void main(String args[]){
  3.                 GoodStudent gs1 = new GoodStudent() ;
  4.                 //gs1 的输出结果是最顶层的父类person 到最下面的 goodstudent的全部构造方法依次被调用
  5.                
  6.                
  7.                 GoodStudent gs2 = new GoodStudent("xiaoming") ;
  8.                 //gs2的输出是Person的特定参数的构造方法被调用。
  9.         }

  10. }

  11. class Person {
  12.         Person(){
  13.                 System.out.println("this is a person") ;
  14.         }
  15.         
  16.         Person(String age){
  17.                 System.out.println("this person is " + age) ;
  18.         }
  19.         
  20. }

  21. class Student extends Person {
  22.         
  23.         Student(){
  24.                 System.out.println("this is a student") ;
  25.         }
  26.         
  27.         Student(String name){
  28.                 super(name) ;
  29.         }
  30.         
  31. }

  32. class GoodStudent extends Student {
  33.         GoodStudent(){
  34.                 System.out.println("this is a good student");
  35.         }
  36.         GoodStudent(String name){
  37.                 super(name) ;
  38.         }
  39. }
复制代码


上面的代码,好学生继承学生,学生基础人。三个类。

自行编译运行一次就一目了然。
当然,需要你稍微改改测试不同的数据可以理解的更深刻一些。
唯一要注意的,无参构造方法不写super 系统就会默认给你加一个







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