• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kolejność wywołania obiektów - z thinkingInJava

0 głosów
827 wizyt
pytanie zadane 4 października 2016 w Java przez itcloud Gaduła (3,380 p.)

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.

2 odpowiedzi

+1 głos
odpowiedź 6 października 2016 przez mbabane Szeryf (79,260 p.)
wybrane 6 października 2016 przez itcloud
 
Najlepsza

W jednym pliku publiczna moze byc tylko jedna klasa, w tym wypadku publiczna powinna byc tylko klasa OrderOfInitialization.

Co do tego System.out.....  w 13 linii to to jest blad, tak sie nie robi.

I teraz co do kolejnosci w wyniku programu to jest ok, zauwaz, ze klasa House zawiera pola w1, w2, w3 sa one celowo tak umieszczone zeby sprawdzic czujnosc czytelnika, nie sa zapisane jedne pod drugim (tak jak powinno sie robic, zeby kod byl czytelniejszy)  i sa one od razu inicjowane - wiec w pierwszej kolejnosci zostana wywolane konstruktory klasy Window dla wyzej wymienionych pol, a dopiero pozniej instrukcje z konstruktora House.

komentarz 6 października 2016 przez itcloud Gaduła (3,380 p.)
Dopiero po odświeżeniu sobie podstaw to zrozumiałem. Wczesniej wydawało mi się dziwne, że w klasie nie mogę mieć między metodami np. linijki z System.out.println. Nie wiedziałem też, że najpierw następuje inicjalizacja pól, a dopiero po tym startuje konstruktor. Ok, może teraz nie budzi to moich wątpliwości, ale jeszcze przedwczoraj tłumaczyłem sobie to tak, że konstruktor przygotowuje wartości pól (inicjalizuje je) więc powinien wykonać się pierwszy.

Przy okazji mógłbyś podpowiedzieć:

1. dlaczego statyczny fragment kodu w klasie (static { cośtam... }) wykonuje się zawsze jako pierwszy? I po co to się w ogóle stosuje?

2. Jak mam klasę i klasę dziedziczącą po niej i w każdej z nich konstruktor, to wywołując tę klasę dziedziczącą najpierw wykona się konstruktor nadklasy ? Wg mnie najpierw ten z podklasy a potem z nadklasy, ale wolałbym się upewnić (a w tym momencie nie mam jak tego sprawdzić).
1
komentarz 7 października 2016 przez mbabane Szeryf (79,260 p.)

Co do static to wolalbym nie, a to dlatego ze nie wszystko moze byc dla Ciebie jasne na tym etapie, i rzadko stosowalem (a w zasadzie nigdy) statyczne bloki wiec moge czegos nie wiedziec z zakresu ich stosowania. Na tym etapie trzeba wiedziec ze to co jest w bloku static jest wykonywane najpierw tj. przed faktycznym powstaniem instancji obiektu, a dopiero pozniej inicjalizacjia pol (tak jak w przykladzie Twojego glownego pytania) i konstruktor. A no i w bloku static nie mozna uzywac pol i metod niestatycznych.

 

Co do drugiego pytania to pierwsza mysl miales dobra, najpierw nadklasa potem podklasa.

 

A jesli faktycznie interesuje Cie java to lepiej odstaw Thinking i zaopatrz sie w: 
http://allegro.pl/java-podstawy-wydanie-x-cay-s-horstmann-i6552434573.html

+1 głos
odpowiedź 4 października 2016 przez Przybysz_4444 Gaduła (3,200 p.)
1.Kod z książki jest "kompilowalny"!

2.Klasy nie muszą być w innym pliku.

3.Funkcja "print()" jest stosowana, jako uproszczenie do przedstawienia kodu w książce, a pochodzi z biblioteki autora.

W książce jest widocznie użyte " import static net.mindview.util.Print.* ". I o stosowaniu jej w książce autor powiadamia na poprzednich stronach.

4.Wynik jest jak najbardziej właściwy.

5.Poprzez wywołanie House w metodzie main, najpierw wykonywane są wywołania w klasie, a później konstruktor.
komentarz 4 października 2016 przez Przybysz_4444 Gaduła (3,200 p.)

Zrób kod w jednym pliku i wtedy :

* Tylko klasa "OrderofInizialization" poprzedzona słowem "public"

System.out.println("Uruchamiam program z main'a!");

^ nie skompiluje się bez umieszczenia w metodzie

Window w3 = mew Window(3);

^ zamiast "mew" ma być "new" ;) 

komentarz 4 października 2016 przez itcloud Gaduła (3,380 p.)
edycja 4 października 2016 przez itcloud

Ok, z tym System.out.println("Uruchamiam program z main'a!"); pokręciłem, bo to powinno być w mainie.

Piszesz, że klasy mogą być w jednym pliku. To dlaczego mi to nie działa? 

Przy tej linii kodu:

public class OrderOfInitialization{

mam błąd: "(...)must be defined in its own file"

Czy to znaczy że nazwa pliku, która obecnie jest typu  Window.java powinna mieć inną postać?

 

Dla jasności jeszcze raz kod z pliku   Window.java  (utworzyłem plik .class, ale zmienił mi rozszerzenie na .java):

 

package test1zksiazki;


public class Window {

	Window(int marker){ System.out.println("Window(" + marker + ")"); }
	
}


class House{
	
		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 = new Window(3);
		
}
	
	
public class OrderOfInitialization{
		public static void main(String args[]){	
			
			System.out.println("Uruchamiam program z main'a!");
		
			House h = new House();
			h.f();
		
	}
		
}
	
	
	
	

 

No i nie rozumiem, czemu ma być taka kolejność wyników jak podali w książce. Przecież jak jest tworzony obiekt klasy House (zmienna referencyjna h), to powinien być najpierw wywołany jego konstruktor? Chyba że to złudzenie które nabyłem niepotrzebnie, że konstruktor jest zawsze pierwszy przy tworzeniu obiektu?

Albo inny przykład: czemu to mi nie działa ???

https://postimg.org/image/tkj99yu6z/

package test1zksiazki;

public class test_konstruktora {

	
	public class klasa1{
		
		private int x = 0;
		x = x+2;
		System.out.println("x wynosi w klasa1: "+ x);
		
		klasa1(){
			System.out.println("KONSTRUKTOR w klasa1");			
		}
	}
	
	
	public static void main(String args[]){
		
		
		System.out.println("metoda main() - start!");
		
	}
	
}

 

1
komentarz 4 października 2016 przez webkam Bywalec (2,840 p.)
Najpierw składowe, bo przecież w konstruktorze możesz się do nich odwoływać. To logiczne. Tak myślę.
komentarz 5 października 2016 przez Przybysz_4444 Gaduła (3,200 p.)
Klasa poprzedzona słowem "public" musi nazywać się tak samo jak nazwa pliku. I w tej klasie powinna znajdować się metoda "main". Nie może być słowa "public" przed obydwoma klasami.

Stwórz więc plik "OrderOfInitialization" z rozszerzeniem java i tylko klasę o tej samej nazwie poprzedź słówkiem "public".

Kolejność wywołania jest jak najbardziej właściwa.
komentarz 5 października 2016 przez Przybysz_4444 Gaduła (3,200 p.)

Jeśli chodzi o twój drugi przykład:

* Znowu poprzedzasz dwie klasy słowem "public", poprzedź tylko tą która ma taką samą nazwę co plik.

        x = x+2;

        System.out.println("x wynosi w klasa1: "+ x);

* ^ tego nie można wykonać bezpośrednio w klasie

* Powinno nazywać się klasy zaczynając od dużej litery ;)

komentarz 5 października 2016 przez webkam Bywalec (2,840 p.)
Jestem prawie pewien, że w książce jest to wszystko ładnie wytłumaczone... :P
komentarz 5 października 2016 przez itcloud Gaduła (3,380 p.)
Ok, dzięki. Wszystko mi się miesza. Musze sobie to poukładać.
komentarz 5 października 2016 przez Przybysz_4444 Gaduła (3,200 p.)
Robiłeś coś związanego z programowaniem przed zabraniem się do tej książki?
komentarz 6 października 2016 przez itcloud Gaduła (3,380 p.)
Tak, 3 lata praktyki w php4.
1
komentarz 6 października 2016 przez Przybysz_4444 Gaduła (3,200 p.)
Ja przed podejściem do czytanie tej książki przerobiłem kurs :

http://javastart.pl/static/darmowy-kurs-java/

I o wiele przyjemniej przechodziło się przez tę książkę mając już jakąś podstawową styczność z Java.

Polecam :)

Podobne pytania

0 głosów
3 odpowiedzi 188 wizyt
pytanie zadane 8 sierpnia 2020 w Java przez NieMamPomyslu Początkujący (300 p.)
0 głosów
2 odpowiedzi 140 wizyt
pytanie zadane 23 stycznia 2020 w Java przez Julek1425 Nowicjusz (230 p.)
0 głosów
1 odpowiedź 3,390 wizyt

89,689 zapytań

138,291 odpowiedzi

309,236 komentarzy

59,620 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...