这是工作的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());
}
}
Run Code Online (Sandbox Code Playgroud)
并运行Test类打印
MyTCup
MyTCup
i have a color .color is tee green.but brushed to red now!
Run Code Online (Sandbox Code Playgroud)
问题1:在运行时,对象C的类型是MyTCup,但它总是可以调用super方法.在初始化对象后,MyTCup中的内存中有一个方法堆栈,然后可以像运行代码那样在运行时调用吗?
问题2:没有办法在其他对象中调用super方法.我知道,c ++可以随时转换为调用父方法.为什么java设计像这样?
Jon*_*eet 70
你不能在其他对象中调用super方法 - 这会违反封装.重点是对象控制其重写方法的作用.例如,您可以覆盖集合的add方法以在某些情况下抛出异常,因此可以确保仅将"有效"项添加到集合中.如果打电话者可以用演员表绕过它,那将毫无意义!
对象调用super.foo()自身的唯一原因是通过使用父实现来启用一个调用.这取决于班级中的代码,以确保它只能做到明智.同样,要采用加法收集示例,如果集合覆盖add它,则必须有一些方法将已验证的项目添加到集合中,它将使用它super.add().
请注意,出于与encapuslation相同的原因,您只能调用父实现,而不是祖父项实现 - 因此super.foo()有效,但super.super.foo()不是.
| 归档时间: |
|
| 查看次数: |
84855 次 |
| 最近记录: |