Chyba zaczynam żałować, że kupiłem za kupę siana książkę "Thinking in Java" (2006).
Na stronie 168 jest kod programu. Wg mnie on jest niekompilowalny. Po pierwsze trzy klasy jedna pod drugą. Nawet nie ma informacji, że każda powinna być w oddzielnym pliku. Poza tym (co zamieniłem w poniższym kodzie) autor stosuje nie wiadomo skąd funkcję print.
Oto listing:
package test1zksiazki;
public class Window {
Window(int marker){ System.out.println("Window(" + marker + ")"); }
}
class House{
System.out.println("Uruchamiam program z main'a!");
Window w1 = new Window(1);
House(){
System.out.println("House()");
w3 = new Window(33);
}
Window w2 = new Window(2);
void f() { System.out.println("f()");}
Window w3 = mew Window(3);
}
public class OrderOfInitialization{
public static void main(String args[]){
House h = new House();
h.f();
}
}
Podobno wynik działania miałby być taki:
Window(1)
Window(2)
Window(3)
House()
Window(33)
f()
Jak to możliwe? Nawet jeśli klasy pozamieszczam w odrębnych plikach, uruchomię tę trzecią klasę z mainem to wg mnie najpierw powinien być uruchamiany konstruktor House, wywołanie obiektu Windows a więc jego konstruktora. Czyli to Windows(1) się zgadza. Ale po tym wg mnie powinien pojawić się napis House(), bo tworzony jest obiekt klasy House i wywoływany jego konstruktor, zanim przejdziemy do kolejnego obiektu klasy Window.