如果子类对象被转换为超类将会发生什么

时间:2014-03-17 13:51:04

标签: 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:派生

为什么呢?如果我将一个子类对象强制转换为超类对象,那么超类对象只会引用子类对象?

4 个答案:

答案 0 :(得分:5)

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

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

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的值都是相同的:对整个示例中使用的单个字符串对象的引用。< / p>

答案 1 :(得分:1)

派生对象也是一个Base对象,当你转换它时你只改变“视图”我的意思是:你可以使用Base的每个方法,但不能使用Derived的每个方法,因为你将它看作Base对象而不是Derived对象。当你调用一个被转换为Base的方法时,它将被称为他的方法,但它是一个派生对象而不是一个Base对象(在内存中它总是一个Derived对象)所以它会看到他的方法。

总结:在内存中,您将始终拥有一个Derived对象,您只能将其视为Base对象,并且您只能使用Base方法(您不能使用派生方法)

答案 2 :(得分:0)

然后你只能访问超类的方法,类似的方法(在两者中定义)将被子类中的方法覆盖。

答案 3 :(得分:0)

投射对象不会改变对象的性质。 你试过看这篇文章吗?您可以找到问题的答案。

About casting sub-class to super-class in JAVA