2

Чем обусловлен безусловный вызов метода 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);
}
} 
pavlofff
  • 36,765

2 Answers2

11

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

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

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

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

Ну как бы всё.

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

pavel
  • 9,864
  • Спасибо за ответ. То есть если в классе используются объекты разных типов и в этом же классе описаны стандартные методы для этих типов то эти методы будут безусловно применены к объектам? Если да, то для чего это нужно? – Александр Кочуров Jan 30 '18 at 11:07
  • 1
    @АлександрКочуров думаю вам стоит прочитать о стандартных методах класса Object и о наследовании/полифморфизме в Java. Возможно что-то отсюда https://ru.stackoverflow.com/questions/416634/%d0%9a%d0%bd%d0%b8%d0%b3%d0%b8-%d0%b8-%d1%83%d1%87%d0%b5%d0%b1%d0%bd%d1%8b%d0%b5-%d1%80%d0%b5%d1%81%d1%83%d1%80%d1%81%d1%8b-%d0%bf%d0%be-java вам поможет. – pavel Jan 30 '18 at 11:08
  • Я знаю что все классы наследуются от Object и наследуют его методы и что в этом случае я переопределяю этот метод, но почему он вызывается тогда когда я его не вызывал мне не понятно. Если я создам свой класс, расширю им AnyClass и переопределю его метод, то он не будет безусловно вызван как в случае с наследованием от Object. И если бы я хотел прочитать целую книгу чтобы найти ответ, я бы так и сделал. – Александр Кочуров Jan 30 '18 at 11:59
  • @АлександрКочуров Вы можете вообще убрать из своего класса метод toString(), он всё равно будет работать потому что, есть в родительском классе Object. – Igor Kudryashov Jan 30 '18 at 12:00
  • Я это понимаю. Но почему переопределенный метод вызывается сам по себе? – Александр Кочуров Jan 30 '18 at 12:02
  • @АлександрКочуров читайте первые строки ответа... что значит сам по себе? Вы его вызываете просто не напрямую. – pavel Jan 30 '18 at 12:22
  • Вот я и спросил почему происходит этот "не прямой" вызов. Ответ уже получил. Спасибо за участие. – Александр Кочуров Jan 30 '18 at 13:04
  • программисту понятно, что написано в вашем ответе и как это решает проблему в вопросе, но новичку иногда трудно понять такое очевидное для программиста объяснение. – pavlofff Jan 30 '18 at 13:15
  • Ну, как сказать, я спросил "Почему?" мне ответили на "Как?". Из реализации этого метода не следует что он должен быть безусловно вызван. – Александр Кочуров Jan 30 '18 at 13:33
  • @АлександрКочуров следует) для вас это может пока не очевидно, но немного изучив java оно действительно следует и очевидным образом. И да, изучите как в java работает полиморфизм - существенно упростит дальнейшее обучение. – pavel Jan 30 '18 at 13:37
7

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

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

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

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

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

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

pavlofff
  • 36,765