Search code examples
javalistclasstostring

Confusion regarding Overriding toString() method in a Class(Data class or POJO) and calling list.toString()?


I have this kind of implementation

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;
        }
    }

And then I create, add and print the item in List.

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

//add items

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

Then the output is

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

So, here I have some confusion regarding the toString() Method. I am calling list.toString(), which means toString() needs to be a function of inside List class or its parent class.

So, its actual implementation is in Object.java

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

So, my question and confusion is, when I Override the toString() in my required class, how does it all work together to print the List Of Items accordingly mentioned in the Overridden toString() method.

I hope I have made my question clear enough. Thank You.


Solution

  • ArrayList has its own implementation of toString inherited from AbstractCollection

    public class ArrayList<E> extends AbstractList<E>
    

    AbstractList definition,

    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(' ');
            }
        }