Переопределение toString Java
Всем здравствуйте! Кто нибудь может мне помочь с одним моментом, я пишу программу, которая принимает в список ArrayList объекты разных классов, а именно, от trial_exam, trial_test и trial_final_exam , которые наследуются от супер класса Trial, и, для того, чтобы вывести эти объекты с переменными, необходимо переопределить метод toString, но, когда я переопределяю этот метод в супер классе, я не могу обращаться к переменным наследников, так вот, кто нибудь может мне подсказать, как переопределить метод в супер классе, чтобы можно было брать переменные наследников?) Класс Main:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main < public static void main(String[] args) throws IOException < String number = null; ArrayListTrialArrayList = new ArrayList(); do < System.out.println("Добро пожаловать! Выберите интересующий вас вариант"); System.out.println("1. Добавить новый элемент"); System.out.println("2. Удалить элемент по индексу"); System.out.println("3. Вывод всех элементов в консоль"); System.out.println("4. Сравнение двух элементов"); System.out.println("5. Выход"); System.out.print(">"); Scanner scaner = new Scanner(System.in); do < BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); number = reader.readLine(); >while (!isNumeric(number) || !prov_na_diap(number)); //System.out.println(num_int); switch (number) < case "1": System.out.println("Ок, давайте добавим новый элемент, только, нажмите: "); System.out.println("1 - если, вы хотите добавить элемент, типа \"Экзамен\""); System.out.println("2 - если, вы хотите добавить элемент, типа \"Тест\""); System.out.println("3 - если, вы хотите добавить элемент, типа \"Финальный экзамен\""); do < BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); number = reader.readLine(); >while (!isNumeric(number) || !prov_na_diapazon(number)); //Посмотреть позже String name = null; String score_test = null; String name_stud = null; int numer = 0; int score = 0; int year = 0; if (number.equals("1")) < System.out.print("Введите название билета: "); name = scaner.nextLine(); System.out.print("Введите оценку: "); score = scaner.nextInt(); while (true) < System.out.print("Введите номер билета: "); if (!scaner.hasNextInt()) < System.out.println("Некорректные данные, попробуйте снова!"); scaner.nextLine(); >else < numer = scaner.nextInt(); scaner.nextLine(); break; >> trial_exam exam = new trial_exam(name, numer, score); TrialArrayList.add(exam); System.out.println(exam.name_of_tick + " " + exam.num_of_tick + " " + exam.score); > else if (number.equals("2")) < System.out.print("Введите название теста: "); name = scaner.nextLine(); System.out.print("Введите оценку(зачёт\\незачёт): "); score_test = scaner.nextLine(); while (true) < System.out.print("Введите номер варианта: "); if (!scaner.hasNextInt()) < System.out.println("Некорректные данные, попробуйте снова!"); scaner.nextLine(); >else < numer = scaner.nextInt(); scaner.nextLine(); break; >> trial_test test = new trial_test(name, numer, score_test); TrialArrayList.add(test); System.out.println(test.test_name + " " + test.num_of_var + " " + test.test); > else if (number.equals("3")) < System.out.print("Введите имя научного руководителя: "); name = scaner.nextLine(); System.out.print("Введите имя студента: "); name_stud = scaner.nextLine(); while (true) < System.out.print("Введите год выпуска: "); if (!scaner.hasNextInt()) < System.out.println("Некорректные данные, попробуйте снова!"); scaner.nextLine(); >else < year = scaner.nextInt(); scaner.nextLine(); break; >> while (true) < System.out.print("Введите оценку: "); if (!scaner.hasNextInt()) < System.out.println("Некорректные данные, попробуйте снова!"); scaner.nextLine(); >else < numer = scaner.nextInt(); scaner.nextLine(); break; >> trial_final_exam final_exam = new trial_final_exam(name, name_stud, year, numer); TrialArrayList.add(final_exam); System.out.println(final_exam.title_of_the_rep + " " + final_exam.students_name + " " + final_exam.year_of_issue + " " + final_exam.score); > break; case "2": System.out.println("Ок, давайте удалим элемент, только, нажмите: "); System.out.println("1 - если, вы хотите удалить элемент, типа \"Экзамен\""); System.out.println("2 - если, вы хотите удалить элемент, типа \"Тест\""); System.out.println("3 - если, вы хотите удалить элемент, типа \"Финальный экзамен\""); do < BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); number = reader.readLine(); >while (!isNumeric(number) || !prov_na_diapazon(number)); if(number.equals("1")) < if(TrialArrayList.size() == 0) < System.out.println("Ваш список пуст, прежде всего, добавте в него элементы"); break; >else < System.out.println("Ваш список элементов в списке: "); System.out.println(TrialArrayList.toString()); >> break; case "3": break; case "4": break; case "5": System.out.println("Спасибо за работу, до свидания"); break; > >while (Integer.parseInt(number) != 5); > public static boolean isNumeric(String str) < try < Double.parseDouble(str); return true; >catch (NumberFormatException e) < System.out.println("Некорректный ввод, пожалуйста, повторите попытку"); return false; >> public static boolean prov_na_diap(String str)< int str_to_int = Integer.parseInt(str); if ((str_to_int >= 1 & str_to_int > public static boolean prov_na_diapazon(String str)< int str_to_int = Integer.parseInt(str); if ((str_to_int >= 1 & str_to_int > @Override public String toString() < return super.toString(); >>
Класс Trial:
import java.security.PublicKey; import java.util.Objects; public class Trial < String test; int score; public String toString(String tNName, int num, String resTest)< return "Тест по предмету: " + tNName + ", номер варианта: " + num + ", оценка: " + resTest; >public String toString(String nameTick, int numTic, int resExam) < return "Название билета " + nameTick + ", номер билета: " + numTic + ", оценка: " + resExam; >public String toString(String nameDio, String nameStud, int yearOfIs, int resExam) < return "Название диплома: " + nameDio + ", имя студента: " + nameStud + ", год выпуска: " + yearOfIs + ", ооценка: " + resExam; >@Override public boolean equals(Object o) < if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Trial trial = (Trial) o; return score == trial.score && Objects.equals(test, trial.test); >@Override public int hashCode() < return Objects.hash(test, score); >@Override public String toString() < return >>
Класс trial_exam:
public class trial_exam extends Trial < String name_of_tick; int num_of_tick; trial_exam(String name_of_tick, int num_of_tick, int score)< this.name_of_tick = name_of_tick; this.num_of_tick = num_of_tick; this.score = score; >public String toString() < return "trial_exam'; > >
Класс trial_test:
public class trial_test extends Trial < String test_name; int num_of_var; trial_test(String test_name, int num_of_var, String test)< this.test_name = test_name; this.num_of_var = num_of_var; this.test = test; >@Override public String toString() < return "trial_test'; > >
Класс trial_final_exam:
public class trial_final_exam extends Trial < String title_of_the_rep; String students_name; int year_of_issue; trial_final_exam(String title_of_the_rep, String students_name, int year_of_issue, int score)< this.title_of_the_rep = title_of_the_rep; this.students_name = students_name; this.year_of_issue = year_of_issue; this.score = score; >@Override public String toString() < return "trial_final_exam'; > >
Переопределение метода Java toString () для вывода значений ArrayList
В этой статье мы разберемся с тем, почему нужно переопределение метода Java toString для отображения содержимого ArrayList .
Обновлено: 2022-07-23 17:15:28 Вадим Дворников автор материала
Задача
Предположим, что мы хотим сохранить несколько записей Employee в Collection , предпочтительно через ArrayList для более быстрого доступа. Каждый раз, когда мы извлекаем записи, они должны выводиться в определенном формате. Есть два варианта реализации.
Вариант 1: Предоставление и реализация метода toString () в классе Employee
- Переопределите метод toString() ;
- Определите формат кода внутри метода toString() .
Начнем с кода toString Java для реализации вышеуказанного решения.
Класс Employee
- Содержит четыре атрибута: id , name , age , designation ;
- Конструктор с четырьмя аргументами;
- Переопределяет метод toString () , предоставляющий формат для вывода информации о сотруднике.
Employee.java
package in.bench.resources.override.tostring; public class Employee < // внутренние переменные private int employeeId; private String employeeName; private int employeeAge; private String employeeDesignation; // Конструктор с четырьмя аргументами public Employee(int employeeId, String employeeName, int employeeAge, String employeeDesignation) < super(); this.employeeId = employeeId; this.employeeName = employeeName; this.employeeAge = employeeAge; this.employeeDesignation = employeeDesignation; >// переопределение метода toString() @Override public String toString() < return "Employee [employeeId=" + employeeId + ", employeeName=" + employeeName + ", employeeAge=" + employeeAge + ", employeeDesignation=" + employeeDesignation + "]"; >>
Основной класс — для хранения и извлечения записей сотрудников
- Используется для хранения и извлечения записей сотрудников в toString ;
- В ArrayList хранятся все записи сотрудников;
- Для извлечения записей сотрудников используется улучшенный цикл forEach .
StoreAndRetrieveEmployeeRecords.java
package in.bench.resources.override.tostring; import java.util.ArrayList; public class StoreAndRetrieveEmployeeRecords < public static void main(String[] args) < // создаем объект ArrayList для хранения записей сотрудников ArrayListempRecords = new ArrayList(); // добавляем записи сотрудников в объект AL empRecords.add(new Employee(101, "SJ", 19, "Writer")); empRecords.add(new Employee(102, "RS", 17, "Developer")); empRecords.add(new Employee(103, "ZR", 25, "Supporter")); empRecords.add(new Employee(104, "IL", 27, "Manager")); empRecords.add(new Employee(105, "SR", 15, "Marketer")); // извлекаем записи сотрудников с помощью улучшенного цикла forEach for(Employee emp : empRecords) < System.out.println(emp); >> >
Результат
Employee [employeeId=101, employeeName=SJ, employeeAge=19, employeeDesignation=Writer] Employee [employeeId=102, employeeName=RS, employeeAge=17, employeeDesignation=Developer] Employee [employeeId=103, employeeName=ZR, employeeAge=25, employeeDesignation=Supporter] Employee [employeeId=104, employeeName=IL, employeeAge=27, employeeDesignation=Manager] Employee [employeeId=105, employeeName=SR, employeeAge=15, employeeDesignation=Marketer]
Вариант 2: Возвращаемся к нашему основному вопросу
Почему нужно переопределить метод toString() для отображения содержимого ArrayList ?
В приведенном выше примере :
- Мы переопределили метод toString Java ;
- Предоставили детали реализации для вывода информации о сотрудниках в определенном формате;
- Благодаря переопределению метода toString() можно отображать информацию о сотрудниках в желаемом формате.
Пойдем еще дальше и посмотрим, что произошло бы, если бы мы не переопределили метод toString () .
Класс Employee
- Это тот же класс сотрудников, содержащий четыре атрибута: Id , name , age , designation ;
- Конструктор с четырьмя аргументами;
- Но в этом случае не переопределяется метод toString() . Это означает, что по умолчанию будет вызван метод toString() класса Object .
Employee.java
package in.bench.resources.override.tostring; public class Employee < // внутренние переменные private int employeeId; private String employeeName; private int employeeAge; private String employeeDesignation; // Конструктор с четырьмя аргументами public Employee(int employeeId, String employeeName, int employeeAge, String employeeDesignation) < super(); this.employeeId = employeeId; this.employeeName = employeeName; this.employeeAge = employeeAge; this.employeeDesignation = employeeDesignation; >>
Примечание : метод toString() не переопределяется.
Основной класс — для хранения и извлечения записей сотрудников
Это тот же самый класс, который используется в первом варианте toString Java .
package in.bench.resources.override.tostring; import java.util.ArrayList; public class StoreAndRetrieveEmployeeRecords < public static void main(String[] args) < // создаем объект ArrayList object для хранения записей сотрудников ArrayListempRecords = new ArrayList(); // добавляем записи сотрудников в объект AL empRecords.add(new Employee(101, "SJ", 19, "Writer")); empRecords.add(new Employee(102, "RS", 17, "Developer")); empRecords.add(new Employee(103, "ZR", 25, "Supporter")); empRecords.add(new Employee(104, "IL", 27, "Manager")); empRecords.add(new Employee(105, "SR", 15, "Marketer")); // извлекаем записи сотрудников с помощью улучшенного цикла forEach for(Employee emp : empRecords) < System.out.println(emp); >> >
Результат
in.bench.resources.override.tostring.Employee@1db9742 in.bench.resources.override.tostring.Employee@106d69c in.bench.resources.override.tostring.Employee@52e922 in.bench.resources.override.tostring.Employee@25154f in.bench.resources.override.tostring.Employee@10dea4e
Заключение
- Консоль выводится без метода toString() ;
- Представление информации о каждом сотруднике в шестнадцатеричном формате;
- Qualified_class_name@HashCode_in_HEX_format ( то есть имя класса, за которым следует символ @ , а затем хэшкод для Object в шестнадцатеричном формате );
- Поэтому важно переопределить метод toString () для вывода значений объекта ArrayList в желаемом формате.
Альтернативный способ
Другой способ, с помощью которого можно не использовать реализацию метода toString() для вывода значений ArrayList , заключается в том, чтобы включить методы getter и setter и вызвать их соответственно для установки и извлечения значений.
Как использовать метод toString() Java
Каждый класс в Java является дочерним классом для класса Object . Класс Object содержит метод toString() . Он используется для получения строкового представления объекта. Каждый раз, когда мы пытаемся вывести ссылку на Object , вызывается метод toString() .
Если мы не определили в классе метод toString() , то будет вызван метод toString() класса Object .
Метод toString() Java: синтаксис
public String toString() < return getClass().getName()+"@"+Integer.toHexString(hashCode()); >// программа Java для демонстрации // работы метода toString() class Best_Friend < String name; int age; String college; String course; String address; Best_Friend (String name, int age, String college, String course, String address) < this.name = name; this.age = age; this.college = college; this.course = course; this.address = address; >public static void main(String[] args) < Best_Friend b = new Best_Friend("Gulpreet Kaur", 21, "BIT MESRA", "M.TECH", "Kiriburu"); System.out.println(b); System.out.println(b.toString()); >>
Best_Friend@232204a1 Best_Friend@232204a1
Пояснение : В приведенной выше программе мы создаем объект класса Best_Friend и предоставляем всю информацию о друге. Но когда мы пытаемся вывести Object , мы отображаем данные из classname@HashCode_in_Hexadeciaml_form . Если нужна соответствующая информация об объекте Best_friend , тогда нужно переопределить метод toString Java класса Object в классе Best_Friend .
// программа Java для демонстрации // работы метода toString() class Best_Friend < String name; int age; String college; String course; String address; Best_Friend (String name, int age, String college, String course, String address) < this.name = name; this.age = age; this.college = college; this.course = course; this.address = address; >public String toString() < return name + " " + age + " " + college + " " + course + " " + address; >public static void main(String[] args) < Best_Friend b = new Best_Friend("Gulpreet Kaur", 21, "BIT MESRA", "M.TECH", "Kiriburu"); System.out.println(b); System.out.println(b.toString()); >>
Gulpreet Kaur 21 BIT MESRA M.TECH Kiriburu Gulpreet Kaur 21 BIT MESRA M.TECH Kiriburu
Примечание . Во всех классах контейнерах, коллекциях, классах String , StringBuffer , StringBuilder метод toString Java переопределяется для значимого представления String . Поэтому настоятельно рекомендуется также переопределить метод toString() и в нашем классе.
// программа Java для демонстрации // работы метода toString() import java.util.*; class Best_Friend < String name; int age; String college; String course; String address; Best_Friend (String name, int age, String college, String course, String address) < this.name = name; this.age = age; this.college = college; this.course = course; this.address = address; >public static void main(String[] args) < Best_Friend b = new Best_Friend("Gulpreet Kaur", 21, "BIT MESRA", "M.TECH", "Kiriburu"); System.out.println(b); String s = new String("Gulpreet Kaur"); System.out.println(s); Integer i = new Integer(21); System.out.println(i); ArrayList l = new ArrayList(); l.add("BIT"); l.add("M.TECH"); System.out.println(l); >>
Best_Friend@232204a1 Gulpreet Kaur 21 [BIT, M.TECH]
Пожалуйста, оставляйте свои комментарии, если найдете ошибку в примерах использования метода toString или захотите поделиться дополнительной информацией по теме статьи.
Метод toString()
Часто необходимо узнать содержимое того или иного объекта. Для этого в классе Object языка Java определен специальный метод toString() , возвращающий символьную строку описывающую объект. При создании нового класса принято переопределение toString() таким образом, чтобы возвращающая строка содержала в себе имя класса, имена и значения всех переменных.
Следующий пример демонстрирует это:
public class Person < private String fullName; private int age; private boolean retired; . @Override public String toString() < return "Personpublic class PersonDemo4 < public static void main(String[] args) < Person person = new Person("Петров Иван Иванович", 56, false); System.out.println(person); >>
Результат выполнения программы будет такой:
Person
Чисто теоретически можно явно вызывать метод toString() — System.out.println(person.toString()) , но так не принято.
Если у класса Person не переопределен метод toString() , то при запуске класса PersonDemo4 вызовется метод toString() , определенный в классе Object . И на консоль выведется нечто такое:
oop.Person@5e2a3193
- Метод equals()
- Модификатор native