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

标签 java upcasting

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/

相关文章:

java - 我如何分析一个非常大的 Java webapp?

java - 手机锁定时获取用户在Android中的位置

java - 如果我已经完成向上转换,为什么要重写从子类调用的方法?

c++ - 我可以使用 C 风格的转换将派生类转换为私有(private)基类吗?

c++函数参数,自动向上转换多个模板类

java - 从命令行运行时http连接超时

java - 如何将 JButton 放置在小程序的底部?

java - Spring 3 MVC - 在生产中找不到 Url 映射 (404)

java - 在 Java 中向上转换子类引用

C++——向上转型和向下转型