这是我的示例代码:
String str = "hello";
Object obj = (Object)str;
System.out.println(obj.toString());
我找到了Object的源代码,而toString()方法是:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
我认为示例的结果是这个Object的地址,就像[B @ 15db9742,在我将str转换为Object之后,但它仍然打印你好。为什么? Shoundn< obj使用Object的方法?任何人都可以向我解释它的原理吗?
答案 0 :(得分:5)
这是polymorphism(具体来说,运行时多态性)。您对该对象的引用类型(Object
或String
)的含义并不重要,只要该类型具有toString
(因此您的代码编译),将使用的toString
是对象本身实际拥有的那个,不一定是您的引用类型提供的那个。在这种情况下,无论您对它的引用类型是什么,对象都是String
,因此使用String#toString
。
答案 1 :(得分:2)
因为底层对象是String对象,而String类已覆盖其中的toString()
方法。
虽然左侧有Object类型,但实现的Class中的方法会被执行,而整体现象称为Polymorphism。您只是将String的形式更改为Object。
当你这样做时
Object obj = (Object)str;
这不会将String更改为Object类。您只是更改对象的类型而不是它的实际行为。
答案 2 :(得分:1)
虚方法调用意味着在给定实际实现的情况下将执行方法覆盖,而不是在引用类型中实现。
换句话说,您的String
实例仍会调用Object
中String
实现的Object
方法的覆盖,即使转换为$('tr .status')
也是如此。
答案 3 :(得分:0)
对象 obj 是(不必要的)强制转换的结果,但仍然是一个字符串.... String类实现了 toString 方法:
public String toString() {
return this;
}
通过执行以下操作验证obj是否为String:
System.out.println(str.getClass());
System.out.println(obj.getClass());
你会得到
class java.lang.String
class java.lang.String