gpt4 book ai didi

java - 为什么子类在向上转型时会做出响应?

转载 作者:行者123 更新时间:2023-12-02 01:18:23 26 4
gpt4 key购买 nike

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/

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