听起来有点愚蠢,但我需要我的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()
方法逻辑,但这是全新的,所以从来没有起过作用。
帮助
正如其他人所解释的,toString
不是实例化类的地方。相反,toString
方法旨在构建一个表示类实例值的字符串,至少报告该对象中存储的最重要的数据字段。在大多数情况下,toString
用于调试和记录,而不是用于业务逻辑。
要生成表示要显示给用户的对象值的文本,请添加另一个方法。人们通常将该方法命名为getDisplayName
。例如,DayOfWeek::getDisplayName
和Month::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() ;
您可以选择用自己的实现覆盖默认实现。考虑到记录作为简单数据载体的目的,通常不需要重写。
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()的来源。
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? 问题答案: 使用来代替: