扩展子类的子类中的super()构造函数?

时间:2013-05-02 03:41:22

标签: java inheritance constructor method-overriding

我不确定我的问题是否正确,但我对这些代码行感到困惑。

public class First {
    public String name() {
        return "First";
    }
}

public class Second extends First {
    public void whoRules() {
        System.out.print(super.name() + " rules");
        System.out.println(" but " + name() + " is even better");
    }
    public String name() {
        return "Second";
    }
}

public class Third extends Second {
    public String name() {
        return "Third";
    }
}

Second varSecond = new Second();
Third varThird = new Third();
varSecond.whoRules();
varThird.whoRules();

执行以上操作时,会打印出

First rules but second is even better

First rules but third is even better

为什么不会:

First rules but second is even better

Second rules but third is even better

子类是否可以成为另一个类的超类?或者只能有一个(超类)? (使用上面的示例代码) 我理解FirstSecond的超类,但SecondThird的超类? 或FirstThird的超类?

如果有10个类相互扩展(第二个扩展第一个,第三个扩展第二个,等等)所有这些类的超类是First吗?)

4 个答案:

答案 0 :(得分:3)

  

为什么不会:......“第二条规则,但第三条规则更好”

因为类Second中的super.name()引用了Second的超类,而不是实例的超类。

来自Java Language Specification表单super.Identifier是指当前对象的名为Identifier的字段,但当前对象被视为当前类的超类的实例。

  

子类是否可以成为另一个类的超类?

  

或者只能有一个(超类)?

每个类最多只能有一个直接超类,而超类又可能有超类等。

  

(使用上面的示例代码)我理解First是Second的超类,但是Second是Second的超类吗?或者首先是第三个超类?

First和Second都是Third的超类。

其次是第三个直接超类。

答案 1 :(得分:1)

Third varThird = new Third();

由于Third类没有whoRules()方法。它调用超类方法。

如果在调用期间未指定任何对象,则编译器使用“this”关键字进行调用。那就是为什么,this.name()打印“Third”作为whoRules()方法被第三个Class对象调用。因此结果 - “第一个规则,但第三个甚至更好。”

答案 2 :(得分:0)

这是因为你从Second类调用super,它从First类调用super.name()。 第二个超级永远是第一个

答案 3 :(得分:-1)

这是简单的继承。第一个是第二个超级类,第二个是超级第三类。基本上,当您创建第三类的对象时,它将继承父类的所有(非私有)属性,这些属性都是第一和第二类。

First -> Second -> Third 

超级关键字 - 在给定的示例中,您将重写(在子类中实现超类方法)子类second中的超类First的方法名称()。使用关键字super。 name()允许你调用超类的name()方法。

我希望你记住的最重要的事情是

  

java编译器调用基于Reference类型的方法而不是   对象类型

当你说

varSecond.whoRules();

在这种情况下,对象引用属于第二类

System.out.print(super.name() + " rules");//calls the name() in class First
System.out.println("but" + name()+"is even better");//calls the name() in class Second

但是当你说

varThird.whoRules();

在这种情况下,对象引用属于第三类

System.out.print(super.name() + " rules");//calls the name() in class First
System.out.println("but" + name()+"is even better");//calls the name() in class Third

只是因为name()方法是在第三类中定义的。如果你没有在第三类中定义name()方法,那么它将调用超类方法。

并回答你的另一个问题,对继承的深度没有硬限制,但通常你不会在一个好的设计中看到一个层次结构中的10个超类。