Вызов метода toString() в Java

270
31 января 2018, 13:49

Чем обусловлен безусловный вызов метода toString() в данном случае? И почему не происходит безусловного вызова второго метода?

class AnyClass{
    private Object obj;
public AnyClass(Object cif){
    obj = cif;
}
public String toString(){
    return obj.toString();
}
public String str(){
    return obj.toString();
}
}
  class AnonymClasses {
    public static void main(String[] args) {
      AnyClass ac = new AnyClass(new Integer(10));
      System.out.println(ac);
}
} 
Answer 1

Системный метод println() (вывести в поток вывода, обычно на экран) вызывает метод toString()всякий раз, когда в качестве аргумента получает какой-либо объект, так заложено в его коде.

Так как объект может иметь самую разную реализацию, то для того, чтобы его гарантировано можно было "напечатать" в классе Object определен метод toString(), который по умолчанию выводит имя объекта и еще сопутствующую информацию.

Метод println() не может знать "вид" произвольного объекта и чтобы отобразить его, обращается к методу toString(), который обязательно присутствует в любом объекте и возвращает строку, которую можно напечатать.

Даже если вы не переопределите в своем классе метод toString() будет использован метод класса Object

Вам самому не нужно вызывать этот метод, это делает системный метод печати, чтобы гарантировано получить ожидаемый результат.

Ваши собственные методы не будут вызываться системными методами, потому что они о них ничего не знают, что бы вы там не написали.

Answer 2

Просто смотрим реализации

public void print(Object obj) {
    write(String.valueOf(obj));
}

Спускаемся ниже

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

Ну как бы всё.

toString() - стандартный метод в классе Object, str - нет.

READ ALSO
Full authentication is required to access this resource

Full authentication is required to access this resource

Тестирую метод логина в Spring SecurityХочу получить статус 200, но приходит 401

298
Передача значения переменной из activity в fragment

Передача значения переменной из activity в fragment

У меня есть BusActivity, в которой я уже знаю значение переменной positionУ нее есть дочерний фрагмент BusStopFragment, который я создаю в методе SetupViewPager()

297
Ограничение длины пароля в Spring Security

Ограничение длины пароля в Spring Security

Делаю регистрацию юзераДлина пароля должна быть от 6 до 16 символов

266