当前位置: 首页 > 知识库问答 >
问题:

如何在Java中正确重写toString()?

顾超
2023-03-14

听起来有点愚蠢,但我需要我的toString()方法的帮助,这很烦人。我试着在网上查找,因为toString是一个出错和“找不到Kid constructor#2”的程序,尽管它在那里,我甚至会做其他事情,但它不起作用。好吧,这太多了,下面是我的代码:

import java.util.*; 
   class Kid {  
      String name; 
      double height; 
      GregorianCalendar bDay; 

      public Kid () { 
         this.name = "HEAD";
         this.height = 1; 
         this.bDay = new GregorianCalendar(1111,1,1); 
      } 

      public Kid (String n, double h, String date) {
      // method that toString() can't find somehow
         StringTokenizer st = new StringTokenizer(date, "/", true);
         n = this.name;
         h = this.height;
      } 

      public String toString() { 
         return Kid(this.name, this.height, this.bDay);
      } 
   } //end class 

好的,所以我上面的toString(我知道,我的第三个参数是关闭的,应该是字符串)是关闭的。如果我硬编码第三个值,它就会失控,说它找不到这个(上面)。那么我怎么才能得到日期并把它分开呢?

下面是调用此的类

class Driver {   
   public static void main (String[] args) {   
      Kid kid1 = new Kid("Lexie", 2.6, "11/5/2009");   
      System.out.println(kid1.toString());
   } //end main method 
} //end class  

我试着研究多个构造器,但真的没用。我试着研究toString()方法,并尝试使用我之前创建的toString()方法逻辑,但这是全新的,所以从来没有起过作用。

帮助

共有3个答案

秦弘亮
2023-03-14

正如其他人所解释的,toString不是实例化类的地方。相反,toString方法旨在构建一个表示类实例值的字符串,至少报告该对象中存储的最重要的数据字段。在大多数情况下,toString用于调试和记录,而不是用于业务逻辑。

要生成表示要显示给用户的对象值的文本,请添加另一个方法。人们通常将该方法命名为getDisplayName。例如,DayOfWeek::getDisplayNameMonth::getDisplayName

在Java8及更高版本中,实现toString的最现代方法是使用StringJoiner类。正如医生所说:

StringJoiner用于构造由分隔符分隔的字符序列,可以选择以提供的前缀开头,以提供的后缀结尾。

这样使用:

@Override
public String toString ()
{
    return new StringJoiner(                           // In Java 8 and later, StringJoiner is used to construct a sequence of characters separated by a delimiter and optionally starting with a supplied prefix and ending with a supplied suffix.
                " | " ,                                // Delimiter
                Person.class.getSimpleName() + "[ " ,  // Prefix
                " ]"                                   // Suffix
            )
            .add( "name=" + name )                     // Append
            .add( "phone=" + phone )                   // Append
            .toString();                               // Convert entire sequence to a single `String` object.
}

人[姓名=Alice|电话=555.867.5309]

Java16提供了一种新的方法来简要定义一个类,该类的主要目的是以透明和不变的方式进行数据通信:record。

只需列出每个成员字段的类型和名称即可定义记录。编译器隐式地创建构造函数getter,equals

toString的默认实现包括每个成员字段。

public Kid ( String name , double height , LocalDate birthDate ) {} 

像任何其他对象一样实例化。

Kid alice = new Kid( "Alice" , 6.1d , LocalDate.of( 2019 , Month.April , 23 ) ) ;
String output = alice.toString() ;

您可以选择用自己的实现覆盖默认实现。考虑到记录作为简单数据载体的目的,通常不需要重写。

向安福
2023-03-14

JavatoString()方法

如果要将任何对象表示为字符串,则会出现toString()方法。

方法返回对象的字符串表示形式。

如果您打印任何对象,java编译器会在内部调用对象上的toString()方法。因此重写toString()方法,返回所需的输出,它可以是对象的状态等。这取决于您的实现。

Java toString()方法的优点

通过重写Object类的toString()方法,我们可以返回对象的值,因此我们不需要编写太多代码。

没有toString()方法的输出

class Student{  
 int id;  
 String name;  
 String address;  

 Student(int id, String name, String address){  
 this.id=id;  
 this.name=name;  
 this.address=address;  
 }  

 public static void main(String args[]){  
   Student s1=new Student(100,”Joe”,”success”);  
   Student s2=new Student(50,”Jeff”,”fail”);  

   System.out.println(s1);//compiler writes here s1.toString()  
   System.out.println(s2);//compiler writes here s2.toString()  
 }  
}  

Output:Student@2kaa9dc
       Student@4bbc148

你可以在上面的例子中看到#1。打印s1和s2会打印对象的哈希代码值,但我想打印这些对象的值。由于java编译器在内部调用toString()方法,重写此方法将返回指定的值。让我们用下面的例子来理解它:

Example#2

Output with overriding toString() method

class Student{  
 int id;  
 String name;  
 String address;  

 Student(int id, String name, String address){  
 this.id=id;  
 this.name=name;  
 this.address=address;  
 }  

//overriding the toString() method  
public String toString(){ 
  return id+" "+name+" "+address;  
 }  
 public static void main(String args[]){  
   Student s1=new Student(100,”Joe”,”success”);  
   Student s2=new Student(50,”Jeff”,”fail”);  

   System.out.println(s1);//compiler writes here s1.toString()  
   System.out.println(s2);//compiler writes here s2.toString()  
 }  
} 

Output:100 Joe success
       50 Jeff fail

注意,toString()主要与Java中的多态性概念有关。在Eclipse中,尝试单击toString()并右键单击它。然后,单击Open Declaration并查看超类toString()的来源。

盛建德
2023-03-14

toString应该返回一个字符串

public String toString() { 
    return "Name: '" + this.name + "', Height: '" + this.height + "', Birthday: '" + this.bDay + "'";
} 

我建议您利用IDE的特性来生成toString方法。不要手工编码。

例如,如果您只需右键单击源代码并选择Source,Eclipse就可以这样做

 类似资料:
  • 问题内容: 我需要在我的没有超类的对象中实现一个深层克隆。 处理超类(即)引发的检查的最佳方法是什么? 一位同事建议我按以下方式处理: 对我来说,这似乎是一个不错的解决方案,但我想将其扔给StackOverflow社区,以查看是否有我可以提供的其他见解。 问题答案: 你绝对必须使用吗?大多数人都同意是坏的。 如果你已经阅读了我书中有关克隆的内容,尤其是你在两行之间阅读的话,你会知道我认为它clon

  • 问题内容: 当我在Python中打开FIFO(命名管道)进行写入时,发生了非常奇怪的事情。考虑一下当我尝试打开FIFO以便在交互式解释器中进行写入时发生的情况: 以上行将阻塞,直到我打开另一个解释器并键入以下内容: 我不明白为什么我必须等待打开管道进行读取,但是让我们跳过它。上面的代码将阻塞,直到有可用的数据为止。但是,假设我回到第一个解释器窗口并输入: 预期的行为是,在第二个解释器上,对的调用将

  • 问题内容: 我需要方法方面的帮助,这非常令人讨厌。我尝试在线查找,因为那是一个正在搞砸的地方,即使在那里,它也“找不到2号Kid构造函数”,我什至会做其他事情,但它不起作用。好了,所以这是我的代码: 好的,所以我上面的toString(我知道,我的第三个参数已关闭,应该是String)已关闭。如果我在第三件事中硬编码一个值,它就会变成麻烦,并说找不到它(上面)。那么如何获取日期并将其拆分呢? 调用

  • 问题内容: 我想重写我的Python类和方法。我的用例是通常的用例:我有一些要处理的特殊名称,并且我希望其他任何行为都具有默认行为。因为,似乎我可以通过提高请求默认行为。但是,我怎样才能做到这一点呢?这是一个简单的示例,使用不可变字段“A”,“ B”和“ C”实现一个类。 用什么代替问号?对于老式类,答案显然是,但是文档表明这对于新型类是错误的。 问题答案: 它的 在Python 2中,或 在Py

  • 问题内容: 我正在nodejs / expressjs中构建购物车应用程序。在用户登录后重定向到正确的页面时,我遇到了一些问题。我发现有几篇文章密切相关,但是我从给定的文章中进行修复的所有尝试都没有成功。 发生的情况是,用户输入其登录信息,然后单击登录按钮。Ajax请求将数据发送到此访问功能。该功能首先检查用户是否存在于数据库中。如果是,那么它将继续比较bcrypt密码,如果它们相等,则它们成功登

  • 问题内容: 好的,所以我一直在尝试使用以下代码加载BufferedImage: 但是,这在运行时给了我一个类型转换错误,那么如何正确加载BufferedImage? 问题答案: 使用来代替: