Вопрос-ответ

How to override toString() properly in Java?

Как правильно переопределить toString() в Java?

Звучит немного глупо, но мне нужна помощь по моему toString() методу, и это очень раздражает. Я попытался поискать в Интернете, потому что toString это тот, где он облажался и "не находит детский конструктор # 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() методов, которую я создал ранее, но это совершенно новое, поэтому оно никогда не работало.

Помогите?

Переведено автоматически
Ответ 1

toString Должно возвращать String.

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

Я предлагаю вам использовать возможности вашей IDE для генерации toString метода. Не кодируйте его вручную.

Например, Eclipse может это сделать, если вы просто щелкните правой кнопкой мыши на исходном коде и выберите Source > Generate toString

Ответ 2

Java toString() метод

Если вы хотите представить какой-либо объект в виде строки, появляется метод toString().

Метод toString() возвращает строковое представление объекта.

Если вы печатаете какой-либо объект, компилятор java внутренне вызывает метод toString() для объекта. Таким образом, переопределение метода toString() возвращает желаемый результат, это может быть состояние объекта и т.д. зависит от вашей реализации.

Преимущество метода Java toString()

Переопределяя метод toString() класса Object, мы можем возвращать значения объекта, поэтому нам не нужно писать много кода.

Вывод без метода 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() и щелкните по нему правой кнопкой мыши.Затем нажмите "Открыть объявление" и посмотрите, откуда взялся суперкласс toString().

Ответ 3

Как объясняли другие, toString это не то место, где можно создавать экземпляр вашего класса. Вместо этого toString метод предназначен для создания строки, представляющей значение экземпляра вашего класса, сообщающей, по крайней мере, о наиболее важных полях данных, хранящихся в этом объекте. В большинстве случаев, toString используется для отладки и ведения журнала, а не для вашей бизнес-логики (за исключением некоторых исторических методов, таких как Integer.toString()).

Чтобы сгенерировать текст, представляющий значение объекта для отображения пользователю, добавьте другой метод. Люди часто называют метод чем-то вроде getDisplayName. Например, DayOfWeek::getDisplayName и Month::getDisplayName.

StringJoiner

Начиная с Java 8 и более поздних версий, самым современным способом реализации 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.
}

Персона[ имя = Алиса | телефон = 555.867.5309 ]


record

Java 16 предлагает новый способ краткого определения класса, основной целью которого является прозрачная и неизменяемая передача данных: record.

Вы определяете запись, просто перечисляя тип и имя каждого поля-члена. Компилятор неявно создает конструктор, геттеры, equals & hashCode, и toString.

Реализация по умолчанию toString

Реализация по умолчанию 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() ;

Вы можете переопределить реализацию по умолчанию своей собственной. Переопределения обычно не требуются, учитывая назначение записи как простого носителя данных.

Ответ 4

Вы можете создать новый объект в toString(). используйте

return "Name = " + this.name +" height= " + this.height;

вместо

return Kid(this.name, this.height, this.bDay);

Вы можете изменить возвращаемую строку по мере необходимости. Существуют другие способы сохранения даты вместо calander.

java