这里是工作java码

class Cup {
    public String sayColor() {
        return "i have a color .";
    }
}

class TCup extends Cup{
    public String sayColor(){
        System.out.println(super.getClass().getName());
        return super.sayColor()+"color is tee green.";
    }
}

class MyTCup extends TCup {
    public String sayColor(){
        System.out.println(super.getClass().getName());
        return super.sayColor()+"but brushed to red now!";
    }
}
class Test {
    public static void main(String[] args) {
        Cup c = new MyTCup();
        System.out.print(c.sayColor());
    }
}

和运行测试类印刷品

MyTCup
MyTCup
i have a color .color is tee green.but brushed to red now!

问题1:在运行时,这种类型的对象C MyTCup,但它可以随时打电话超方法。是否有一个方法堆在存储器内MyTCup后初始化的对象,然后可以通过在运行时喜欢的代码?

问题2:有没有办法叫超级方法在其他的对象。因为我知道,c++可以投叫父母一方法在任何时间。为什么不同Java?

有帮助吗?

解决方案

你不能在其他对象中调用super方法 - 这会违反封装。重点是对象控制其重写方法的作用。例如,您可以覆盖集合的 add 方法以在某些情况下抛出异常,因此它可以确保只有“有效”的方法。项目已添加到集合中。如果打电话者可以用演员来绕过它,那将毫无意义!

对象为自己调用 super.foo()的唯一原因是通过使用父实现来启用一个调用。这取决于班级中的代码,以确保它只能做到明智。再次,要采用加载项集合示例,如果集合重写 add ,则必须使用某种方式将经过验证的项目添加到集合中,它可以用 super.add()

请注意,出于与encapuslation相同的原因,您只能 调用您的父实现,而不是祖父项实现 - 因此 super.foo()是有效的,但<代码> super.super.foo()不是。

其他提示

1:

你的问题不是很清楚的。你是什么意思,"呼吁通过在运行时喜欢的代码"?如果你问如何实例c知道它有什么超级类,那么是的,类层次结构的存储器中存储,可以通过虚拟机。

2:

Java实际上不会让你投一个实例向其父母。这只是强调的一个方法上的一个实例始终使用的实例的实际类,不是它编写时类。I.e。在Java所有的方法都是什么会被称为"虚拟"在C++。为什么这决定我不知道。

编辑: 实际上乔恩的飞碟的解释非常恰好为什么你不能调用的方法的一个超级上的一个实例,一个子类,所以现在我知道:-).

你可以在子类中定义一个新的辅助方法,这样你就不会覆盖原来的 - 调用它 - 它可以调用super方法,具体取决于你想要的。

实际上你可以,但你必须使用一种方法,所以它只适用于你的代码 在超类中,添加参数“Class”。方法,如:

public String sayColor(Class classFilter){...

现在,在每次覆盖时,检查当前子类是否是指定的过滤器之一,如:

if(TCup.class!=classFilter)return super.sayColor(classFilter);
return "some text for TCup only";

我以独家方式编码。您可以添加更多参数,或者与null进行比较,这样您就可以将结果与超类结合起来,运用您的创造力:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top