这是一个简单的Java代码:
public class JTest {
public static void main(String []args) {
Integer a = new Integer(2);
Object b = a;
System.out.print("r = " + b);
}
}
所有对象在Java中都有一个父对象。 当您运行此程序时,您将获得: r = 2 为什么? 如果我对这段代码做同样的事情:
public class JTest {
public static void main(String []args) {
A a = new A();
Object b = a;
System.out.print("r = " + b);
}
}
A级是:
public class A {
int a;
}
输出将是: r = test.A@9304b1
答案 0 :(得分:6)
Integer.toString()
返回一个包含整数值的字符串。
您的类没有实现自己的toString()
,因此它使用默认的Object.toString()
实现,该实现返回对象类及其哈希码的组合。
答案 1 :(得分:4)
它将调用调用了哪个方法的toString()
方法。如果未实现的Object类默认提供一个。
尝试通过这种方式覆盖它并检查输出
public class A {
int a;
@Override
public Sring toString(){
return "A has property a = "+this.a;
}
}
答案 2 :(得分:3)
在第一个实例中,b
包含Integer
的实例,因此在打印中调用toString()
的{{1}}实现。
在第二种情况下,Integer
包含b
的实例,因此调用了A
的{{1}}实现。大概toString()
不会覆盖A
,因此您从A
(package.Class@hash)获得默认实现。
编辑(自问题发生变化):
班级toString()
仅包含Object
字段,但不会展开A
。如果您更改int
以覆盖toString(您无法扩展原始类型,如int
),您可以得到您想要的内容:
A
答案 3 :(得分:1)
执行System.out.print("r = " + b);
时,Java将调用b.toString()
。方法toString
继承自Object
。在第一种情况下,类Integer
会覆盖toString
以返回整数值。您的A
类不会丢失toString()
,因此您只获得默认值(对象类和哈希码)
答案 4 :(得分:1)
顺便说一句,如果你想要来获取已经覆盖toString()的类型的java.lang.Object样式输出,你可以使用这样的代码:
public static String toString(Object o) {
if (o == null) return null;
return o.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(o));
}
答案 5 :(得分:0)
在第一个实例中,Object有一个toString方法,因此将打印实际值。但是,如果没有像第二个实现那样的toString方法,则会获得类似于类/对象的ID
的类型答案 6 :(得分:0)
在第一种情况下,Integer类有一个'toString'方法,当与“r”+ b结合使用时,会给你一个'a'的文本表示,它将是2