2016-10-04 8 views
-1

Почему выходной? : Сфера 0Почему этот Java-код неявно вызывает метод toString()?

Как-то это вызывает метод toString() неявно? Как это работает ?

class BerylliumSphere { 
    private static long counter = 0; 
    private final long id = counter++; 
    public String toString() { 
     return "Sphere " + id; 
    } 
} 

public class Test { 
    public static void main (String[] args) { 
     BerylliumSphere spheres = new BerylliumSphere(); 
     System.out.println(spheres); 
    } 
} 

// output: Sphere 0 
+0

Там нет никакой магии, и это не «Java», которая делает это, но 'println' метод. Вы можете реализовать такой метод самостоятельно. http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/io/PrintStream.java#820 –

+1

Передача объекта в println() всегда дает представление toString – Kahn

+1

Это не «неявно», оно «явно», просто посмотрите, что делает 'println'. – Tom

ответ

3

System.out является экземпляром PrintStream, являющимся статическим членом System. Класс PrintStream имеет функцию println(), которая принимает аргумент типа Object. Эта функция, в Open JDK, выглядит следующим образом:

public void println(Object x) { 
    String s = String.valueOf(x); 
    synchronized (this) { 
     print(s); 
     newLine(); 
    } 
} 

И если вы посмотрите на String.valueOf(), которая принимает аргумент типа Object, вы можете увидеть:

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

Там нет никакой магии. Это просто класс Java, который вызывает toString на объектах.

Чтение Далее

+0

Но я не понимаю, почему он использует метод toString(), который я написал в классе BerylliumSphere, так как я его никогда не называл? –

+1

Вам нужно узнать о Полиморфизме моего друга! Создавая свой собственный toString(), вы переопределили реализацию одной и той же функции во всех суперклассах. – christopher

1

При попытке System.out.println(spheres) это выглядит следующим образом:

public void println(Object x) { 
     String s = String.valueOf(x); 
     synchronized (this) { 
      print(s); 
      newLine(); 
     } 
    } 

И это valueOf(Object obj) метод:

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

Вот что System.out.println делает: https://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#println%28java.lang.Object%29

Это говорит следующие:

Этот метод вызывает сначала String.valueOf (х), чтобы получить распечатанный строковое значение объекта, а затем ведет себя так, как будто он вызывает печать (String) , а затем Println().

А вот что String.valueOf делает: https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#valueOf%28java.lang.Object%29

И он говорит:

Если аргумент имеет нулевое значение, то строка равна "нулю"; в противном случае возвращается значение значения obj.toString().

Короче говоря, печать объекта приведет к вызову его метода toString и печати того, что он возвращает.

+0

Но я не понимаю, почему он использует метод toString(), который я написал в классе BerylliumSphere, так как я его никогда не называл? –

 Смежные вопросы

  • Нет связанных вопросов^_^