0

我们今天在我的计算机科学讲座中讨论了继承,并讨论了从其他类访问方法。我的一位同学询问子类如何访问最高父类方法,我的教授也对此感到好奇,并建议如下:

super.super.toString();

也许能够工作,但事实并非如此。出于好奇,我试图自己解决这个问题并想出了这个:

public class A {
    public static void main(String[] args){
        B b = new B();
        C c = new C();

        System.out.println(b.toString());
        System.out.println(c.toString());
    }

    public String toString(){
        return "Class A";
    }
}

class B extends A {
    public String toString(){
        return "Class B";
    }
}

class C extends B {
    public String toString(){
        return A.class.toString();
    }
}

成功了,现在在测试各种东西时我偶然发现了这个:(这都将在 C 类中完成)

super.toString();

似乎做同样的事情:

B.class.toString();

我的问题是两者之间有什么区别,还是完全相同?同样在我上面的代码中,这是从子类调用方法的正确方法吗?

4

4 回答 4

3

不,B.class.toString()将调用类toString()上的方法Class。这甚至与 call完全不同super.toString()

没有办法调用fromA的实现,绕过。基本上,这会破坏封装。toString()CA

于 2013-03-01T19:59:58.477 回答
3

不,它们不是一回事。假设您是super.toString()从您的 class调用,这将C调用toString()on B,这将返回“Class B”。

当您调用A.class.toString()或根本不调用任何超类方法时,B.class.toString()您正在调用toString.Class

于 2013-03-01T20:00:11.067 回答
3
class Parent{
   public void foo(){

   }
}


class Child extends Parent{

   @Override
   public void foo(){
       super.foo(); //will call the parent class foo method
   }
}

class ChildOfChild extends Child{

    public void bar(){
        super.foo(); //this actually is the method of the Parent that is actually called at the end as Child calls super.foo();
    }
}

super.toString();并且B.class.toString()完全不同。在后面,您将调用类 literaltoString()的方法。

如示例所示,如果子子类调用层次结构中定义的方法,则取决于实现将调用哪个方法。如果直接父级覆盖该方法并且不调用,则无法调用super.method()(父级的方法)。这就是继承的工作原理。

如果直接父级没有覆盖该方法并且您从子子类调用方法,则将调用直接父级的父级方法。

于 2013-03-01T20:00:41.777 回答
1

如果您尝试访问 toString() 中的任何状态,您将很快看到您没有做您认为您正在做的事情。

SomeClass.class 是一个特殊的构造。 有关确切定义,请参见http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.2 。

您可能不会使用 super.super,因为 Java 实际上旨在强制您正确使用对象和面向对象的模式。不应允许您跳过父类的实现,因此是不允许的。与其他不太严格的语言相比,这实际上是关于 Java 的抱怨之一,但它确实迫使你真正考虑你的类层次结构和你在做什么。

于 2013-03-01T20:08:53.980 回答