2013-12-22 11 views
3
class Data { 
    int a = 5; 
} 

class Main { 
    public static void main(String[] args) { 
     int b=5; 
     data dObj = new data(); 
     System.out.println(dObj); 
     System.out.println(b); 
    } 
} 

Я хочу знать, что происходит при печати объекта или числа или строки.Что происходит при печати объекта в java

Я побежал код выше, я получаю результат как «данные @ 1ae73783» для System.out.println(dObj); и «5» для System.out.println(b);

Тогда я сделал отладки, чтобы проверить, Что на самом деле происходит при печати объекта был много параметров, вызываемых в режиме отладки (например, classloader, theards)
Я знаю, что для первой печати значение представляет имя класса, за которым следует адрес. Но не знаю, что на самом деле происходит в режиме отладки, поскольку в режиме отладки произошло второе присвоение переменной только для печати i.e b = 5.

Пожалуйста, объясните, что происходит на самом деле?

+5

Каждый тип ссылки в Java является подтипом 'java.lang.Object' и, следовательно, наследует' ToString() 'метод. Если ваш класс не реализует этот метод, вызывается унаследованная версия. То, что вы видите, является результатом этого метода. –

+1

что форматирование ... это было просто * ужасно * ... что со всеми '
' s? – Doorknob

ответ

0

Все объекты наследуются от java.lang.Object, который имеет реализацию toString по умолчанию. Если объект переопределяет этот метод, то out.print (obj) добавит что-то полезное на экран.

Примитивные типы данных обрабатываются другой, гораздо более простой реализацией println. Метод println переопределяется для каждого типа данных в дополнение к объекту.

0

Во-первых, int не является Object. Это примитивный тип. Во-вторых, когда класс не перегружен toString() метод, toString() из класса Object вызывается.

2

Пожалуйста, объясните, что происходит на самом деле?

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

[email protected] 
16

Вам не нужен отладчик, чтобы знать, что происходит. System.out имеет тип PrintStream. В javadoc от PrintStream.println(Object) указано:

Распечатывает объект, а затем завершает линию. Этот метод вызывает сначала String.valueOf (x), чтобы получить строковое значение печатного объекта, а затем ведет себя так, как будто он вызывает печать (String), а затем println().

Javadoc из String.valueOf(Object) говорит:

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

И Javadoc из Object.toString() говорит:

Возвращает строковое представление объекта.В общем случае метод toString возвращает строку, которая «текстово представляет» этот объект. Результат должен быть кратким, но информативным представлением, которое легко читать человеку. Рекомендуется, чтобы все подклассы перекрывали этот метод.

Метод toString для класса Object возвращает строку, состоящую из имени класса, объектом которого является экземпляр, символа at-sign `@ 'и шестизначного представления хеш-кода объекта без знака. Другими словами, этот метод возвращает строку, равную значению:

getClass().getName() + '@' + Integer.toHexString(hashCode()) 
0

данных dObj = новых данных() не существует в исходном коде; вы хотите напечатать строковое значение объекта (Data), вам нужно переопределить метод toString;

попробовать это

public class Program { 
    public static void main(String[] args) { 
    Data data = new Data(); 
    System.out.println(data); 
    } 
} 

class Data { 
    int a = 5; 

    @Override 
    public String toString() { 
    return String.valueOf(a); 
    } 
} 
Смежные вопросы