Ditto na Bill K. dodam:
Kompilator Java może chronić przed zranieniem siebie poprzez brak ustawić zmienną przed użyciem go w obrębie funkcji. Zatem wyraźnie NIE ustawia wartości domyślnej, jak opisuje Bill K.
Ale jeśli chodzi o zmienne klasowe, kompilatorowi byłoby bardzo trudno to zrobić. Zmienna klasy może być ustawiona przez dowolną funkcję w klasie. Kompilatorowi trudno byłoby określić wszystkie możliwe zlecenia, w których można wywoływać funkcje. Przynajmniej będzie musiał przeanalizować wszystkie klasy w systemie, które wywołują jakąkolwiek funkcję w tej klasie. Być może trzeba będzie zbadać zawartość dowolnych plików danych lub bazy danych i jakoś przewidzieć, jakie dane wejściowe wprowadzą użytkownicy. W najlepszym wypadku zadanie byłoby niezwykle złożone, w najgorszym przypadku niemożliwe. Tak więc w przypadku zmiennych klas warto zapewnić niezawodne ustawienie domyślne. Ta wartość domyślna polega w zasadzie na wypełnianiu pola bitami równymi zero, więc otrzymujesz wartość zerową dla odniesień, zero dla liczb całkowitych, wartość false dla wartości logicznych itd.
Zgodnie z tym, co mówi Bill, zdecydowanie nie powinno ci się stać automatycznie inicjowanie zmiennych po ich zadeklarowaniu. Inicjuj zmienne tylko w momencie deklaracji, jeśli ma to sens w kontekście Twojego programu. Na przykład, jeśli w 99% przypadków x ma wynosić 42, ale w pewnym stanie IF można odkryć, że jest to przypadek specjalny, a x powinno wynosić 666, to w porządku, zacząć od "int x = 42;" a wewnątrz IF nadpisuje to. Ale w bardziej normalnym przypadku, gdy obliczasz wartość w oparciu o dowolne warunki, nie zainicjuj na dowolną liczbę. Po prostu wypełnij obliczoną wartość.Następnie, jeśli popełnisz błąd logiczny i nie ustawisz wartości pod pewną kombinacją warunków, kompilator może powiedzieć ci, że zgniłeś, a nie użytkownika.
PS Widziałem wiele lame programów, które mówią rzeczy jak:
HashMap myMap=new HashMap();
myMap=getBunchOfData();
Dlaczego utworzyć obiekt zainicjować zmienną, gdy wiesz, że natychmiast rzuci ten obiekt oddalony o milisekundę później? To tylko strata czasu.
Edit
Aby wziąć trywialny przykład, załóżmy, że napisał to:
int foo;
if (bar<0)
foo=1;
else if (bar>0)
foo=2;
processSomething(foo);
To wygeneruje błąd w czasie kompilacji, ponieważ kompilator nie zauważy, że gdy pasek == 0, nigdy nie ustawiłeś foo, ale potem próbujesz go użyć.
Ale jeśli zainicjować foo do wartości manekina, jak
int foo=0;
if (bar<0)
foo=1;
else if (bar>0)
foo=2;
processSomething(foo);
Następnie kompilator będzie zobaczyć, że bez względu na to, jaka jest wartość baru, foo zostanie ustawiony na czymś, więc nie będzie produkować błąd. Jeśli naprawdę chcesz, aby foo miało wartość 0, gdy bar wynosi 0, to jest w porządku. Ale jeśli to, co się naprawdę wydarzyło, oznacza, że jednym z testów było < = lub> = lub zamierzałeś uwzględnić finał innego, gdy bar == 0, to oszukałeś kompilator, który nie wykrył twojego błędu. A tak na marginesie, tak myślę, że taka konstrukcja jest kiepskim stylem kodowania: kompilator nie tylko nie ma pewności, co zamierzałeś, ale też nie może być przyszłym programistą konserwacji.
Dlaczego została podjęta ta decyzja? Dlaczego po prostu nie zainicjować ich na 'null' jak zmiennych klasowych? –
Być może dla lepszego kodu/czytelności? –
Istnieje wiele pytań dotyczących stackoverflow dotyczących tego, dlaczego zmienne lokalne nie mają wartości domyślnych. na przykład http://stackoverflow.com/questions/415687/why-are-local-variables-not-initialized-in-java –