本问题已经有最佳答案,请猛点这里访问。
这是我的示例代码:
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之后,但它仍然打印你好。 为什么? Shound not obj使用Object的方法? 任何人都可以向我解释它的原理吗?
欢迎来到多态。 :-)(必须有一个dupetarget为此。)
方法重写 - 您只更改引用类型,实际对象仍然是String,toString的toString返回实际字符串
请看一下这个问题:stackoverflow.com/questions/321864/
......但我找不到一个非常好的人。 但这只是我没时间去搜索。
你没有将String转换为Object - 你正在施放(在这种情况下,施法甚至是不必要的,你可以在没有施法的情况下进行Object obj = str;)。 转换不会改变(即转换)对象。
这是多态(特别是运行时多态)。无论对象的引用类型是什么(Object或String),只要该类型具有toString(因此您的代码编译),将使用的toString是对象本身实际具有的那个,不一定是您的引用类型提供的那个。在这种情况下,无论您对它的引用类型是什么,对象都是String,因此使用String#toString。
因为底层对象是一个String对象,而String类已覆盖其中的toString()方法。
虽然左侧有Object类型,但实现的Class中的方法会被执行,整个现象称为Polymorphism。您只是将String的形式更改为Object。
当你这样做
这不会改变String到Object类。您只是更改Object的类型而不是它的实际行为。
虚方法调用意味着在给定实际实现的情况下将执行方法覆盖,而不是在引用类型中实现。
换句话说,即使转换为Object,String实例仍会调用String中实现的Object方法的覆盖。
对象obj是(不必要的)强制转换的结果,但仍然是一个String ....
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