Метод toString()
возвращает текстовое представление объекта. Базовая реализация уже включена в java.lang.Object
, и поэтому, поскольку все объекты наследуются от java.lang.Object
, гарантируется, что каждый объект в Java имеет этот метод.
Переопределение метода всегда является хорошей идеей, особенно когда он приходит к отладке, потому что отладчики часто показывают объекты по результату метода toString()
. Поэтому используйте значимую реализацию, но используйте ее для технических целей. Логика приложения должна использовать геттеры:
public class Contact {
private String firstName;
private String lastName;
public Contact (String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {return firstName;}
public String getLastName() {return lastName;}
public String getContact() {
return firstName + " " + lastName;
}
@Override
public String toString() {
return "["+getContact()+"]";
}
}
Да глобальные примитивы инициализируются к ПУСТОМУ УКАЗАТЕЛЮ.
Пример:
int x;
int main(int argc, char**argv)
{
assert(x == 0);
int y;
//assert(y == 0); <-- wrong can't assume this.
}
Вы не можете сделать предположения о классах, структурах, массивах, блоках памяти на "куче"...
является самым безопасным только всегда инициализировать все.
Из стандарта:
Объекты со статической продолжительностью хранения (3.7.1) должны быть инициализированы нулем (8.5), прежде чем любая другая инициализация произойдет. Нулевую инициализацию и инициализацию с константным выражением коллективно называют статическая инициализация ; вся другая инициализация динамическая инициализация . Объекты POD [простые данные] типы (3.9) со статической продолжительностью хранения, инициализированной с константными выражениями (5.19), должны быть инициализированы, прежде чем любая динамическая инициализация происходит. Объекты со статической продолжительностью хранения, определенной в объеме пространства имен в той же единице перевода и динамично инициализированной, должны быть инициализированы в порядке, в котором их определение появляется в единице перевода. [Note:8.5.1 описывает порядок, в котором инициализируются совокупные участники. Начальная буква - ization локальных статических объектов описана в 6,7.]
Так да, globals то, которые имеют статическую продолжительность хранения, будет инициализировано. Globals, выделенный, например, на "куче", не будет, конечно, инициализирован автоматически.
Прибытие из встроенного мира...
Ваш код компилируется в три типа памяти:
1. .data: инициализированная память
2. .text: константы и код
3. .bss: неинициализированная память (инициализированный к 0 в C++, если не явно инициализированный)
Globals входит в .data, если инициализировано. Если не они размещаются в .bss и zero'ed в предосновном коде.
Переменные, объявленные со статической / глобальной областью видимости, всегда инициализируются под VC ++, по крайней мере.
При некоторых обстоятельствах может на самом деле быть различие в поведении между:
int x = 0;
int main() { ... }
и
int x;
int main() { ... }
при использовании сегментов совместно используемых данных затем, VC ++, по крайней мере, использует присутствие явной инициализации наряду с #pragma data_seg
, чтобы определить, должна ли конкретная переменная войти в сегмент совместно используемых данных или частный сегмент данных для процесса.
Для добавленной забавы рассматривают то, что происходит, если у Вас есть статический объект C++ с конструктором/деструктором, объявленным в сегменте совместно используемых данных. Конструктора/деструктор называют каждый раз присоединениями exe/dll к сегменту данных, который является почти наверняка не, что Вы хотите.
[еще 119] детали в этом статьяКБ