Różnica polega na sprawdzaniu kompilacji w czasie pracy.
W pierwszym przypadku (czas kompilacji) deklarujesz, że w tym przypadku będziesz miał odwołanie do wartości typu abc
. Kompilator będzie tego świadomy, gdy sprawdza poprawność semantyki, a ponieważ zna typ w czasie kompilacji, nie widzi w tym problemu.
W drugim przypadku (czas pracy) zostanie utworzona wartość, do której odniesienie będzie się odnosić. To tutaj może potencjalnie wpakować się w kłopoty. Na przykład, jeśli powiedział, co następuje:
public class abc {
private abc p;
public abc() {
p = new abc();
}
}
Może to prowadzić do kłopotów z dokładnym powodu cytowanej (rekursji, że nie zawiera przypadkiem bazowym i będzie stale przydzielić pamięci, dopóki nie uruchomić maszynę wirtualną z hałdy przestrzeń).
Jednak nadal można zrobić coś podobnego i uniknąć nieskończonej rekursji. Unikając tworzenia wartości podczas budowy, odkładasz ją, dopóki nie zostanie wywołana metoda. W rzeczywistości jest to jeden z najczęstszych sposobów implementacji the singleton pattern w Javie. Na przykład:
public class abc {
private abc p;
private abc() { // Private construction. Use singleton method
}
public static synchronized abc getInstance() {
if (p == null)
p = new abc();
return p;
}
}
Jest idealnie ważne, ponieważ utworzyć tylko jedną nową instancję wartości, a od czasu wykonywania zostanie załadowany klasa już będzie znać typ zmiennej instancji jest prawidłowy.
Dobre pytanie, ale pamiętaj, aby wrócić do wcześniejszych pytań i zaakceptować odpowiedź dla każdego z nich (łącznie z tym pytaniem). –
Ponieważ w języku Java zmienna typu 'abc' nie zawiera obiektu' abc'. Zmienna typu 'abc' zawiera * odwołanie do * obiektu' abc'. Twoje rozumowanie byłoby ważne, powiedzmy C++. – immibis