1

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

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

一个子类可以成为另一个类的超类吗?还是只能有一个(超类)?(使用上面的示例代码)我知道这First是一个超类Second,但它是Second一个超类Third?或者是First超类Third

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

4

4 回答 4

3

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

因为super.name()在类中 Second 指的是 Second 的超类,而不是实例的超类。

来自Java 语言规范super.Identifier 形式是指当前对象的名为 Identifier 的字段,但当前对象被视为当前类的超类的实例。

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

是的。

还是只能有一个(超类)?

每个类最多可以有一个直接超类,而后者又可以有它的超类,等等。

(使用上面的示例代码)我知道 First 是 Second 的超类,但 Second 是 Third 的超类吗?还是 First 是 Third 的超类?

First 和 Second 都是 Third 的超类。

Second 是 Third 的直接超类。

于 2013-05-02T03:44:56.093 回答
1
Third varThird = new Third();

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

如果调用过程中没有指定对象,编译器使用“this”关键字进行调用。所以这就是为什么 this.name() 打印“第三”,因为 whoRules() 方法被第三个 Class 对象调用。因此结果 - “第一个规则,但第三个更好。”

于 2013-05-02T04:00:31.980 回答
0

这是因为您从第二类调用 super ,它从第一类调用 super.name() 。第二的超级永远是第一

于 2013-05-02T04:09:02.673 回答
-1

这是简单的继承。First 是 Second 的超类, Second 是 Third 的超类。基本上,当您创建类 Third 的对象时,它将继承父类的所有(非私有)属性,即类 First 和 Second。

First -> Second -> Third 

Super 关键字- 在给定的示例中,您正在覆盖(在子类中实现超类方法)超类的方法 name() First 在子类中的第二个。使用关键字 super.name() 可以调用 name()超类的方法。

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

java 编译器根据引用类型而不是对象类型调用方法

当你说

varSecond.whoRules();

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

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();

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

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() 方法是在类 Third 中定义的。如果您没有在类 Third 中定义 name() 方法,它将调用超类方法。

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

于 2013-05-02T04:31:32.513 回答