出乎意料的是,我遇到了这个:
public class demo {
void multiply(){
System.out.println("HELLO WORLD!")
}
}
public static void main(String args[]){
demo e=new demo();
demo e1=new demo();
System.out.println(e);
System.out.println(e1);
}
}
我执行代码时得到的奇怪输出是:
演示@ 6e1408
演示@ e53108
或者
演示@ 1888759
演示@ 6e1408
有人可以向我解释发生了什么事吗? 我得到的值,这是一个对象的默认值,还是我错过了什么?
答案 0 :(得分:3)
您看到的toString()
返回值
默认对象的实现
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Object
没有默认值,但其成员变量的默认值为based on its type
答案 1 :(得分:1)
您要打印的班级必须override
toString()
方法。
现在它正在打印Object
类toString()
方法的默认实现。
返回对象的字符串表示形式。通常,toString方法返回一个“文本表示”此对象的字符串。结果应该是一个简洁但信息丰富的表示,便于人们阅读。建议所有子类都覆盖此方法。
类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@”和对象的哈希码的无符号十六进制表示组成。换句话说,此方法返回一个等于值的字符串: getClass()。getName()+'@'+ Integer.toHexString(hashCode())
Returns:
a string representation of the object.
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
所以在你的演示类Ovveride toString()
方法中获得所需的O / P.
public class Demo{
----
@Override
public String toString() {
//return something
}
}
答案 2 :(得分:1)
这是对象的默认toString()
方法的结果,该方法打印出类名和哈希码。实际上,您可以通过覆盖要打印的对象类中的toString()
方法来更改此设置。但是,您不必打印对象本身,而是必须在对象上调用toString()
。例如:
public class demo{
void multiply(){
System.out.println("HELLO WORLD!")
}
public String toString() {
return "This is the class, demo.";
}
public static void main(String args[]){
demo e=new demo();
demo e1=new demo();
System.out.println(e.toString());
System.out.println(e1.toString());
}
}
P.S:当对象未初始化时,对象的“默认值”为null
。但是,对象中的默认值由构造函数中的任何内容定义。我建议你更多地研究对象和类。
答案 3 :(得分:0)
您看到的值是内存中的对象地址,值不同的事实表明它不是同一个对象。如果要更改出来的内容,请覆盖.toString()方法。
答案 4 :(得分:0)
实际上默认情况下,对象的toString
方法返回someObjectClassname@hashcodenumber
。要打印所需的输出,您必须覆盖toString
方法
答案 5 :(得分:0)
术语“对象的默认值”并不十分正确。对象不是默认值,引用是,并且它们默认为null
,如Data Types上的文档中所述。
您看到的程序输出是toString()的默认实现返回的String
。当您致电PrintStream.println(Object) System.out.println(demo)
时,PrimeStream需要转换传递的对象,在这种情况下,您的Demo
对象转换为String
,只需调用其toString()方法即可。
如果您未在课程中覆盖toString(),则会获得默认行为。