java - 如果将子类对象转换为父类(super class)会发生什么

标签 java inheritance

<分区>

class Base {
    void test() {
        System.out.println("base");
    }
}

public class Derived extends Base {
    void test() {
        System.out.println("derived");
    }

    public static void main(String args[]) {
        Derived d = new Derived();
        Base b = (Base) d;
        b.test();
    }
}

o/p:派生

为什么?如果我将子类对象转换为父类(super class)对象,父类(super class)对象将仅引用子类对象?

最佳答案

转换根本不会改变对象。结果只是对同一对象的引用,但具有不同的编译时类型。转换为父类(super class)型不会失败,它只能对表达式的编译时类型产生影响,这有时对重载解析很有用。

以同样的方式,从父类(super class)类型的表达式转换为子类类型永远不会创建新对象——它只是检查转换是否有效,结果是对与之前相同对象的引用,但是在具有子类类型的表达式中。这比转换到父类(super class)更有用,因为它可以让您访问更多成员(通常)。例如:

String text1 = "hello";
System.out.println(text1.length());

Object object = (Object) text1; // Or just Object object = text1;
// object.length() would be invalid...

String text2 = (String) object;
// text2.length() is valid again
System.out.println(text2.length());

text1objecttext2 的值都相同:对单个 字符串的引用整个示例中使用的对象。

关于java - 如果将子类对象转换为父类(super class)会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22456124/

相关文章:

java - 在 CIDR 网络 block 中查找免费前缀

java - 我仍然不明白 setTag 和 getTag 是如何工作的

c++ - VS2008 C++好像不能继承const重载方法

javascript - JS 面向对象编程。继承和apply()函数。为什么它不起作用?

javascript - Phantomjs javascript继承误区

java 继承与组合(实现堆栈)

java - eclipse 。调试时如何查看标准函数的来源?

java - Hibernate 为@ManyToOne JPA 注释属性创建 N+1 查询

java - 如何将文件作为输入并在多线程中工作?

c++ - C++ 中的流畅接口(interface)和继承