interface Readable {
public void printTitle();
}
class WebText implements Readable {
public String title;
public void printTitle(){
System.out.println("This Webpage title is "+ title);
}
public void setTitle(String title){
this.title = title;
}
}
class Blog extends WebText {
public void printTitle(){
System.out.println("The Blog title is " + title);
}
}
class ReadingTester{
public static void main(String [] arg) {
Blog b1 = new Blog();
WebText b2 = new Blog();
b1.setTitle("How to upcast");
b2.setTitle("Dangers of upcasting");
b1.printTitle();
b2.printTitle();
}
}
上面的代码是我正在做的作业,但我真的不确定发生了什么。当我运行代码时,它输出:
博客标题是:如何向上转型
博客标题是:向上转型的危险
我感到困惑的是为什么第二个打印出“博客标题是”而不是“这个网页标题是:”。既然 b2 被向上转换为 WebText,那么该类不应该是响应的类吗?我在网上找到的所有内容都表明向上转型是安全的,但这是否是不安全的一个例子?我真的很困惑,非常感谢您的帮助,非常感谢!
最佳答案
博客
中的printTitle
覆盖WebText
中的printTitle
。由于 b2
在运行时实际上是 Blog
的一个实例,因此调用 printTitle
将调用 Blog
中的实例,即使在编译时,b2
的类型为 WebText
。这是一种多态性。
这种行为实际上是可取的,因为它允许您拥有一个 WebText
类型的变量,该变量能够存储许多不同类型的 Web 文本,包括博客、新闻文章和堆栈溢出答案。每种类型都可以选择以不同的方式打印其标题。 This post might help you understand why we do this better .
Why is this said to be safe then?
这是安全的,因为它不会引发异常。它是不安全的,如 b2.printTitle
中的那样可能不会调用 WebText
中的方法,但无论如何您不应该首先假设这一点,除非该方法是最终
。
关于java - 为什么子类在向上转型时会做出响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58179684/