gpt4 book ai didi

java - java可以在其他对象而不是子类型中调用父覆盖方法吗?

转载 作者:IT老高 更新时间:2023-10-28 20:51:20 25 4
gpt4 key购买 nike

这是工作的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,但它总是可以调用 super 方法。 MyTCup内的内存中是否有初始化对象后的方法栈,然后可以像代码一样在运行时调用?

问题2:没有办法在其他对象中调用 super 方法。据我所知,c++ 可以随时转换为调用父方法。为什么在 Java 中不一样?

最佳答案

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

对象自己调用 super.foo() 的唯一原因是允许使用父实现来实现一个调用。这取决于类中的代码,以确保它只明智地做到这一点。同样,以 add-in-a-collection 为例,如果集合覆盖 add 它必须有 some 方法将经过验证的项目添加到集合中,这它会用 super.add().

请注意,出于相同的封装原因,您可以调用您的父实现,而不是祖父实现 - 所以 super.foo() 是有效的,但是 super.super.foo() 不是。

关于java - java可以在其他对象而不是子类型中调用父覆盖方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1032847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com