Путаница относительно переопределения метода toString () в классе (класс данных или POJO) и вызова list.toString ()? - PullRequest
2 голосов
/ 28 мая 2020

У меня есть такая реализация

static class InnerClassStudent{
        String name;
        int age;

        InnerClassStudent(String name,int age){
            this.name = name;
            this.age = age;
        }


        @Override
        public String toString() {
            return "name :" + name + "," + "age: " + age;
        }
    }

И затем я создаю, добавляю и распечатываю элемент в списке.

List<InnerClassStudent> listOfInnerClassStudent = new ArrayList<InnerClassStudent>();

//add items

//print items
 System.out.println("InnerClasslist : " + listOfInnerClassStudent.toString());

Тогда на выходе получается

InnerClasslist : [name :Mr.B,age: 21, name :Mr.Y,age: 19, name :Mr.C,age: 30]

Итак, здесь у меня есть некоторая путаница относительно метода toString (). Я вызываю list.toString () , что означает, что toString () должна быть функцией внутри класса List или его родительского класса.

Итак, его фактическая реализация находится в Object. java

  public String toString() {
        return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
    }

Итак, мой вопрос и замешательство в том, что когда я переопределяю toString () в моем требуемом классе, как все это работает вместе, чтобы распечатайте список элементов, упомянутый в методе Overridden toString ().

Надеюсь, я достаточно ясно сформулировал свой вопрос. Спасибо.

1 Ответ

1 голос
/ 28 мая 2020

ArrayList имеет собственную реализацию toString, унаследованную от AbstractCollection

public class ArrayList<E> extends AbstractList<E>

определения AbstractList,

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> 

,

public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }
...