Почему метод toString () вызывается при печати объекта? - PullRequest
8 голосов
/ 19 декабря 2011

Я не могу понять, почему, когда я использую метод println для объекта четверти, он возвращает значение метода toString.Я никогда не вызывал метод toString, почему я получаю возвращаемое значение?

public class Main {
    public static void main(String[] args) {
        Quarter q = new Quarter();
        Nickel n = new Nickel();
        System.out.println(q);
        System.out.println(n);
    }
}

public abstract class Money {
    private int value;

    public Money(int v) {
        value=v;
    }

    public abstract int getValue();

    protected int myValue() {
        return value;
    }

    public abstract String toString();
}

public abstract class Coin extends Money {
    public Coin(int value) {
        super(value);
        System.out.println("I am a coin, my value is " + getValue());
    }
}

public class Quarter extends Coin {
    public Quarter () {
        super(25);
    }

    public int getValue() {
        return myValue();
    }

    public String toString() {
        return "A Quarter is "+getValue();
    }
}

public class Nickel extends Coin {
    public Nickel () {
        super(5);
    }

    public int getValue() {
        return myValue();
    }

    public String toString() {
        return "A "+this.getClass().getName()+ " is "+getValue();
    }
}

Ответы [ 5 ]

18 голосов
/ 11 декабря 2012

On Обращаясь к документам Java, я понимаю, что

Когда вы вызываете класс PrintStream print (obj) / println (obj) , то внутри он вызывается write метод с аргументом как String.valueOf (obj) , показанный ниже:

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

Now String.valueOf (obj) выполняет задачу вызова Stringметод, как показано ниже:

 /**
 * Returns the string representation of the <code>Object</code> argument.
 *
 * @param   obj   an <code>Object</code>.
 * @return  if the argument is <code>null</code>, then a string equal to
 *          <code>"null"</code>; otherwise, the value of
 *          <code>obj.toString()</code> is returned.
 * @see     java.lang.Object#toString()
 */
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
3 голосов
/ 19 декабря 2011

Поскольку PrintStream.println имеет перегрузку, которая принимает Object, а затем вызывает его toString метод.

1 голос
/ 18 июля 2012

Когда вы пытаетесь напрямую напечатать объект, по умолчанию он вызовет метод toString, вам нужно переопределить этот метод toString для печати атрибутов вашего класса.

1 голос
/ 19 декабря 2011

Потому что именно так работает эта функция: она форматирует примитивные типы для вас, но когда вы передаете ей объект, он вызывает для него .toString().

Если вы не переопределите его, он выведет реализацию .toString() по умолчанию (Class@somenumber), которая не очень полезна ...

0 голосов
/ 09 марта 2015

Поскольку все классы в java являются подклассами java.lang.Object, поэтому всякий раз, когда вы пытаетесь вызвать метод System.out.println () для печати объекта, он вызывает метод toString () класса Object.

В целях безопасности метод печатает хеш-код, а не значения этого объекта, но вы унаследовали этот метод в своем классе и расширили его определение для вывода значений объекта

public String toString() {
        return "A Quarter is "+getValue();
    }

Итак, вы получите возвращаемое значение.

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