将String转换为Object时调用toString()

时间:2017-05-09 09:58:43

标签: java

这是我的示例代码:

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的方法?任何人都可以向我解释它的原理吗?

4 个答案:

答案 0 :(得分:5)

这是polymorphism(具体来说,运行时多态性)。您对该对象的引用类型(ObjectString)的含义并不重要,只要该类型具有toString(因此您的代码编译),将使用的toString是对象本身实际拥有的那个,不一定是您的引用类型提供的那个。在这种情况下,无论您对它的引用类型是什么,对象都是String,因此使用String#toString

答案 1 :(得分:2)

因为底层对象是String对象,而String类已覆盖其中的toString()方法。

虽然左侧有Object类型,但实现的Class中的方法会被执行,而整体现象称为Polymorphism。您只是将String的形式更改为Object。

当你这样做时

Object obj = (Object)str;

这不会将String更改为Object类。您只是更改对象的类型而不是它的实际行为。

答案 2 :(得分:1)

虚方法调用意味着在给定实际实现的情况下将执行方法覆盖,而不是在引用类型中实现。

换句话说,您的String实例仍会调用ObjectString实现的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