2014-05-24 55 views
-4

一般在Java中,我知道,如果我们尝试打印多个对象(名为乔,史蒂夫,理查德例如对象)这样的我不明白toString方法。如何打印对象的内容?

System.out.println(Joe); 
System.out.println(Steve); 
System.out.println(Richard); 

结果将是存储位置不是对象本身。但是,如果我只在其中一个方法上调用toString方法,它将正常打印对象的内容,这就是我无法理解的。

另外,如果toString方法是一个预定义的方法,为什么我必须在我的代码中重新编写它? 谢谢。

public class Time { 
int Hours; 
int Minutes; 
int Seconds; 

public Time(int h, int m, int s){ 
    Hours = h; 
    Minutes = m; 
    Seconds = s; 
} 
public Time(){ 
    Hours = 0; 
    Minutes = 0; 
    Seconds = 0; 
} 
public int hours () 
{ 
return Hours ; 
} 
public int minutes () 
{ 
return Minutes ; 
} 
public int seconds () 
{ 
return Seconds; 
} 
public void addhour () 
{ 
if (Hours == 23) 
{ 
Hours = 0 ; 
} 
else Hours++; 
} 
public void addminute () 
{ 
if (Minutes == 59) 
    { 
Minutes = 0 ; 
addhour () ; 
    } 
else Minutes++; 
} 
public void addsecond () 
{ 
if (Seconds == 59) 
{ 
Seconds = 0 ; 
addminute () ; 
} 
else Seconds++; 
} 
public String toString(){ 
return "Time now is " + Hours + ":" + Minutes + ":" + Seconds; 
    } 
    public static void main (String[] args) { 
    Time t = new Time (23, 59, 59); 
    Time r = new Time (22, 59, 59); 
System.out.println(t) ; 
System.out.println(r) ; 
t.addhour(); 
System.out.println(t) ; 
t.addminute(); 
System.out.println(t) ; 
t.addsecond() ; 
System.out.println(t.toString()); 
        } 


} 

输出是:现在

时间是23:59:59

现在时间是22时59分59秒

现在时间是零点59分59秒

现在时间是1:0:59

现在时间是1:1:0

+0

“如果我调用toString方法上只是其中之一,将打印对象的内容通常“ - 请构建一个测试案例来证明这一点。 –

+0

toString根本不打印任何东西。它仅返回实例的基于String的表示形式,并且可以打印该表示形式。 – Stultuske

+0

您已覆盖'toString',因此当您打印对象时,将调用该代码。你期望什么? – assylias

回答

0

结果将是内存位置而不是对象本身。

没有如果你还没有覆盖toString()方法在你的类默认的toString()使用Object类的方法。即

public String toString() { 
return getClass().getName() + "@" + Integer.toHexString(hashCode()); 
} 

它打印类名及其散列值。

另外,如果toString方法是预定义的方法,为什么我必须在我的代码中重新编写它?

它被称为重写,你这样做是为了在打印对象时调用自定义的toString()而不是默认打印类名称和哈希值的对象。

1

如果Joe(一个人)是Object而不是高度,宽度等,则有两件事物体和物体属性。是他的属性。

System.out.println(Joe);<---it'll print reference 

System.out.println(Joe.height);<----It will print attribute assigned to Object 

现在关键是你并不需要,如果你正在使用System.out.println()因为println()做它隐含了你打电话toString()

它发生这样的事情

object.attribute 

进入内存中找到引用,采用该引用关联它的属性和println()电话toString()并打印值。


toString()方法是overriding这是在有类Object因为Object是超类中的所有类的实际方法。

public String toString(){ 
return "Time now is " + Hours + ":" + Minutes + ":" + Seconds; 
    } 

的另一种方式。

如果你想你可以创建方法

public String method(YourClass o) 
{ 
return o.hour+":"+o.minute+":"+o.second; 
} 
+0

但是,如何打印整个对象,而不仅仅是一个属性? – user3552587

+0

你正在做的正是你需要重写'toString',或者你可以创建一个方法,它将Object作为参数并返回该对象的所有属性的String。 –

0

它通常是打印对象的内部值的方法对象的所有属性。如果不重写,它将显示对象的默认字符串表示形式,这通常没有意义。

这不是强制性的,但在调试代码或在控制台中打印数据时通常很有用。

0

toString()是为所有对象预定义的,默认为您描述的行为。

您需要重新定义它,因为您希望的行为是独一无二的哟您作为程序员。乔应该打印“Joe”,“Joe Beluchi”还是“乔,23岁,住在纽约”。

0

在你的情况下,你将不得不重写ToString方法并对其进行自定义以打印所需的信息。

举例来说,如果你的对象是人,你可以重写的ToString(以Person类)如下:

@Override public class Person { 

return "Person{" + "Name=" + this.name + ", 
       Surname=" + this.surname + ", 
       Date of birth=" + this.birth + '}'; 


} 
相关问题