我不太了解toString方法。如何打印对象的内容?

时间:2014-05-24 12:33:10

标签: java object tostring

一般来说,在java中,我知道如果我们尝试打印多个对象(例如名为Joe,Steve,Richard的对象)那样

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

现在时间是0:59:59

现在时间是1:0:59

现在时间是1:1:0

5 个答案:

答案 0 :(得分:1)

如果Joe(一个人)是Object而不是身高,宽度等,你有两件事对象和对象的属性。是他的属性。

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

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

现在请注意,如果您使用toString(),则不需要致电System.out.println(),因为println()会隐式为您执行此操作。

发生类似这样的事情

object.attribute

进入内存查找引用将该引用与其关联的属性和println()调用toString()相关联并打印值。


您的toString()方法overridingObject类中的实际方法,因为Object是所有类的超类。

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

另一种方式。

如果要获取Object的所有属性,可以创建方法

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

答案 1 :(得分:0)

  

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

否如果您没有在类中重写toString()方法,则使用Object类的默认toString()方法。即

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

打印类名及其哈希值。

  

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

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

答案 2 :(得分:0)

这通常是打印Object的内部值的一种方法。如果你不重写它将显示对象的默认字符串表示,这通常是没有意义的。

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

答案 3 :(得分:0)

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

您需要重新定义它,因为您作为程序员的所需行为是独一无二的。应该反对Joe打印&#34; Joe&#34;,&#34; Joe Beluchi&#34;或者#34;乔,23岁,住在纽约&#34;。

答案 4 :(得分:0)

在您的情况下,您必须覆盖ToString方法并对其进行自定义,以便打印所需的信息。

例如,如果你的对象是人,你可以覆盖ToString(在Person类中),如下所示:

@Override public class Person {

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


}