toString (коллекции)

90
09 января 2021, 08:30
public class Car {
    String model;
    public Car(String model) {
        this.model = model;
    }
    @Override
    public String toString() {
        return "Car{" +
                "model='" + model + '\'' +
                '}';
    }
}

public class Test {                                         
    public static void main(String[] args) {                
        LinkedList<Car> cars = new LinkedList<>();          
        Car ferrari = new Car("Ferrari 360 Spider");        
        Car bugatti = new Car("Bugatti Veyron");            
        Car lambo = new Car("Lamborghini Diablo");          
        Car ford = new Car("Ford Mondeo");                  
        Car fiat = new Car("Fiat Ducato");                  
        cars.add(ferrari);                                  
        cars.add(bugatti);                                  
        cars.add(lambo);                                    
        System.out.println(cars);                           
        cars.addFirst(ford);                                
        cars.addLast(fiat);                                 
        System.out.println(cars);                           
    }                                                       
}                                                           

Этот код выведет в консоль:

[Car{model='Ferrari 360 Spider'}, и тд.
Если удалить toString() метод в классе Car, то мы получим:

[Car@7c75222b, и тд.

Мне интересно одно, когда мы переопределили метод toString() в классе Car и он отрабатывал, но мы же не пишем cars.toString(), а просто System.out.println(cars); и это работает, как так?

Answer 1

В реализации метода println() обратите внимание на String s = String.valueOf(x);

 /**
 * Prints an Object and then terminate the line.  This method calls
 * at first String.valueOf(x) to get the printed object's string value,
 * then behaves as
 * though it invokes <code>{@link #print(String)}</code> and then
 * <code>{@link #println()}</code>.
 *
 * @param x  The <code>Object</code> to be printed.
 */
public void println(Object x) {
    String s = String.valueOf(x);
    synchronized (this) {
        print(s);
        newLine();
    }
}

а valueOf(x) в свою очередь вызывает .toString()

/**
 * Returns the string representation of the {@code Object} argument.
 *
 * @param   obj   an {@code Object}.
 * @return  if the argument is {@code null}, then a string equal to
 *          {@code "null"}; otherwise, the value of
 *          {@code obj.toString()} is returned.
 * @see     java.lang.Object#toString()
 */
public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}
READ ALSO
Spring Boot задержка выполнения метода

Spring Boot задержка выполнения метода

У меня есть клиент-серверное приложениеСерверная часть написана на Spring boot

97
Java Дженерики. Растолкуйте объявление

Java Дженерики. Растолкуйте объявление

Java ДженерикиРастолкуйте объявление для чайников, сигнатуру объявления что делает ? super T читаю, не особо могу вникнуть

108
Распарсить сложный JSON-документ в HashSet

Распарсить сложный JSON-документ в HashSet

Имеется минимальный json-файлик с конфигами:

101
Как посмотреть тип переменной java?

Как посмотреть тип переменной java?

Я понимаю что в java "строгая типизация"Однако, если например я сделал множество приведений в коде и хочу вывести тип переменной в конце, как...

122