2011-12-18 15 views
8

Nie mogę zrozumieć dlaczego, kiedy używam metody println na obiekcie kwartalnym, zwraca wartość metody toString. Nigdy nie nazwałem metody toString, dlaczego otrzymuję wartość zwracaną?Dlaczego wywoływana jest metoda toString() podczas drukowania obiektu?

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

Jak myślisz, co to jest reprezentacja ciągów twojego obiektu kwartalnego? Nie możesz po prostu powiedzieć java, aby wydrukować twój obiekt. – Mead3000

Odpowiedz

3

Ponieważ PrintStream.println ma przeciążenia, która pobiera Object, a następnie wywołuje jego metodę toString.

1

Ponieważ tak funkcjonuje ta funkcja: formatuje typy pierwotne, ale gdy przekażesz obiekt, zadzwoni pod numer .toString().

Jeśli nie zastąpi go, to będzie wyjście domyślna implementacja .toString() ([email protected]), który nie jest bardzo przydatne ...

+0

Och, widzę! Nie zdawałem sobie z tego sprawy. Więc jeśli przekażę obiekt w argumentach metody println, domyślnie wywołam metodę tostring tego obiektu. Nie wydaje się to użyteczne i przeczy temu, czego się dowiedziałem "nie używa się żadnej metody, chyba że ją nazwiesz". Ale dziękuję za informację o metodzie println. Wydaje się dość podstępne, że metoda println wywołuje taką metodę ściągania. –

+0

@NicholasKong: "Nie używasz metody, chyba że ją nazwiesz"; Dotyczy to tylko metod bez nadpisywania. 'toString' jest nadpisaniem metody klasy bazowej, więc może być wywołane przez rzeczy, które odwołują się do klasy bazowej. –

+0

Cóż, może wolisz wersję C, która próbuje i wypisuje wszystko jako zakończone znakiem 0 'char *'? : p – fge

1

Podczas próby drukowania bezpośrednio do obiektu, domyślnie będzie to nazwać toString Metoda, którą należy zastąpić, aby móc drukować atrybuty klasy.

17

Na refering docs java co ja undestand jest to, że

Po wywołaniu PrintStream klasa print (obj)/println (obj) metoda następnie wewnętrznie nazywany zapisu metoda z arguement jako String. valueOf (obj) pokazano poniżej:

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

teraz String.valueOf (obj) ma za zadanie wywołanie metody String jak pokazano poniżej:

0

Ponieważ wszystkie klasy w java są podklasami obiektu java.lang.Object, więc za każdym razem, gdy spróbujesz wywołać metodę System.out.println() w celu drukowania obiektu, wywoływana jest metoda toString() klasy Object.

Ze względów bezpieczeństwa metoda drukuje hashcode, a nie wartości tego obiektu, ale odziedziczyły tę metodę w swojej klasie i rozszerzyła swoją definicję, aby wydrukować obiekt ceni

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

więc uzyskać zwrot wartość.

Powiązane problemy