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:派生
为什么呢?如果我将一个子类对象强制转换为超类对象,那么超类对象只会引用子类对象?
答案 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());
text1
,object
和text2
的值都是相同的:对整个示例中使用的单个字符串对象的引用。< / p>
答案 1 :(得分:1)
派生对象也是一个Base对象,当你转换它时你只改变“视图”我的意思是:你可以使用Base的每个方法,但不能使用Derived的每个方法,因为你将它看作Base对象而不是Derived对象。当你调用一个被转换为Base的方法时,它将被称为他的方法,但它是一个派生对象而不是一个Base对象(在内存中它总是一个Derived对象)所以它会看到他的方法。
总结:在内存中,您将始终拥有一个Derived对象,您只能将其视为Base对象,并且您只能使用Base方法(您不能使用派生方法)
答案 2 :(得分:0)
然后你只能访问超类的方法,类似的方法(在两者中定义)将被子类中的方法覆盖。
答案 3 :(得分:0)
投射对象不会改变对象的性质。 你试过看这篇文章吗?您可以找到问题的答案。