一般来说,在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
答案 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()
方法overriding
是Object类中的实际方法,因为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 + '}';
}