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

Java - nie działa konstruktor, kompozycja

Object Storage Arubacloud
+1 głos
408 wizyt
pytanie zadane 27 marca 2017 w Java przez itcloud Gaduła (3,380 p.)
zmienione kategorie 27 marca 2017 przez itcloud

Dlaczego nie widzę, że tworzony jest konstruktor?

Czy ktoś zna prosty i ciekawy zarazem przykład zastosowania kompozycji vs dziedziczenie w "czystej" javie?
Chciałem taki przykład wykonać ale jak widać poniżej nie działa - np. utworzenie obiektu KlasaA.

Kod:

package kompozycja;

public class Kompozycja {

	private int zm = 333;
	
	public void Kompozycja(){
		
		System.out.println("Konstruktor Kompozycja()");
	}
	
	
	public static void main(String[] args) {

		System.out.println("Start....");
		
		//dlaczego nie widac ze tworzony jest konstruktor kompozycja() ?
		Kompozycja a = new Kompozycja();
		System.out.println(a.zm);
		
		//jak utworzyc zmienna typu KlasaA ??
		//KlasaA kl2 = new KlasaA();
	
		
	}
	
	public class KlasaA{
		public KlasaA(){
			
			System.out.println("Konstruktor KlasaA()");
		}
	}

	public class KlasaB{
		
		KlasaA a;
		public KlasaB(){
			System.out.println("Konstruktor KlasaB()");
		}
	}	
	

}

 

komentarz 27 marca 2017 przez niezalogowany
Zła kategoria, Java, to nie C/C++

2 odpowiedzi

+2 głosów
odpowiedź 27 marca 2017 przez K0XM4N Gaduła (3,640 p.)
wybrane 27 marca 2017 przez itcloud
 
Najlepsza

Kompozycja to nic innego jak wykorzystanie obiektu jako pole. 

 

public class Engine{



}


public class Wheels{



}

public class Gearbox{



}


public class Car{

  private Engine engine;
  private Wheels wheels;
  private Gearbox gearbox;


  Car(Engine engine, Wheels wheels, Gearbox gearbox){

       this.engine = engine;
       this.wheels = wheels;
       this.gearbox = gearbox;
   
  }


}

By stworzyć samochód potrzebujesz najpierw utworzyć pozostałe elementy takie jak: silnik, koła i skrzynie biegów. W mainie po prostu je inicjujesz przez słowo kluczowe "new". Gdy stworzysz te trzy obiekty, zabierasz się za stworzenie obiektu Car. Wtedy konstruktor mówi: hej! potrzebuje silnika i kół! A i bym zapomniał o skrzyni biegów! Zatem podajesz mu te obiekty w konstruktorze i to tyle :) Na tym polega kompozycja + dependency injection (czyli wstrzykiwanie obiektów)

komentarz 27 marca 2017 przez itcloud Gaduła (3,380 p.)

Dzięki.

Ale jak użyć tego Car, bo jak daję niżej main'a to nie działa...

package kompozycja;

public class Kompozycja2 {
	
	public class Engine{
		 
		 
		 
	}
	 
	 
	public class Wheels{
	 
	 
	 
	}
	 
	public class Gearbox{
	 
	 
	 
	}
	 
	 
	public class Car{
	 
	  private Engine engine;
	  private Wheels wheels;
	  private Gearbox gearbox;
	 
	 
	  Car(Engine engine, Wheels wheels, Gearbox gearbox){
	 
	       this.engine = engine;
	       this.wheels = wheels;
	       this.gearbox = gearbox;
	    
	  }
	 
	 
	}
	//tego main'a dopisałem i jest blad
        // the constructor Kompozycja.car() is undefined
	public static void main(String[] args){
		
		
		Car samochod = new Car();
	}

}

pewnie dlatego że mam na zewnątrz klasę np. Kompozycja (w pliku Kompozycja.class) a wewnątrz te klasy z Twojego przykładu. Ostatnia sprawa, czemu u mnie to też nie działa ok? Pewnie jak tu podpowiesz, wszystko stanie się jasne (klasa w klasie..), ale i tak dziwi mnie, że nie widzę wywołania w swoim kodzie konstruktora.

komentarz 27 marca 2017 przez K0XM4N Gaduła (3,640 p.)
edycja 27 marca 2017 przez K0XM4N
Co do błędu: the constructor Kompozycja.car() is undefined
Wywołujesz domyślny bezparametryczny konstruktor. To jest niemożliwe gdy wcześniej stworzysz inny konstruktor parametryczny (przyjmujący np. jakieś obiekty)

Poza tym stworzyłeś klasy wewnętrzne. Stwórz klasy w osobnych plikach.  popatrz na to:
//osobny plik
public class Engine{
 
 
 
}
 
 //osobny plik
public class Wheels{
 
 
 
}
 
//osobny plik
public class Gearbox{
 
 
 
}

I w kolejnym pliku masz klasę Car. 
Teraz musisz w metodzie MAIN stworzyć: silnik, koła, skrzynie biegów.
A dopiero potem tworzysz nowy obiekt Samochodu i w konstruktorze podajesz jako argumenty obiekty: silnik, koła, skrzynia biegów.

 

TO JEST METODA MAIN

Engine engine = new Engine();
Wheels wheels = new Wheels();
Gearbox gearbox = new Gearbox();

Car audiA8 = new Car(engine, wheels, gearbox);
//kolejność obiektów jest odpowiednia do tej co zadeklarowałeś w konstruktorze klasy Car.

 

komentarz 27 marca 2017 przez itcloud Gaduła (3,380 p.)
Dobra, przestudiuje to co napisałeś. Ale dziwi mnie, że nie można umieszczać klas w jednej klasie - widuję często takie zagnieżdżenia. Więc jak to jest?

Jeszcze przy okazji pytanie: co ma ta kompozycja wspólnego z interfejsami, bo słyszałem że dziedziczenie jest złe i stosuje się interfejsy w kompozycjach.
1
komentarz 27 marca 2017 przez K0XM4N Gaduła (3,640 p.)

Jeszcze odpowiem CI na pytanie odnośnie tamtego błędu z konstrorem.

W javie kiedy stworzysz jakiś konstruktor parametryczny czyli taki:
 

Car(Engine engine, Wheels wheels, Gearbox gearbox)

to java nie jest wstanie wywołać konstruktora domyślnego: new Car(). Musisz go wtedy sam stworzyć. Dlatego wywalało Ci błąd
 

1
komentarz 27 marca 2017 przez K0XM4N Gaduła (3,640 p.)

Można umieszczać klasy wewnątrz klasy, ale rzadko kiedy się to stosuje.
W Twoim przykładzie by utworzyć te obiekty w klasie Kompozycja2 musiałbyś:

  • stworzyć metode w klasie Kompozycja2
  • w tej metodzie stworzyć te obiekty
  • lub w Metodzie MAIN: 
            Kompozycja2 k = new Kompozycja2();
            Kompozycja2.Engine engine = k.new Engine();
  • poza tym, klasa wewnętrzna powinna być prywatna jak każde pole :) (no chyba że używasz dziedziczenia to wtedy protected)

1
komentarz 27 marca 2017 przez K0XM4N Gaduła (3,640 p.)

Jeszcze przy okazji pytanie: co ma ta kompozycja wspólnego z interfejsami, bo słyszałem że dziedziczenie jest złe i stosuje się interfejsy w kompozycjach.

 Otóż interfejsy mogą być wykorzystywane w bardzo pomocny sposób. Definiując interfejs, implementując go do np. klasy engine czy wheels i deklarując pola w klasie Car jako:
 

Interfejs Engine;
Interfejs Wheels;

możesz im nadać pewną funkcjonalność, którą te dwa obiekty będą posiadać.
 

SprawdzanieSprawnosciPojazdu(Interfejs częśćSamochodu){

    cześćSamochodu.naprawWszystko();

}

O co tutaj chodzi?
Popatrz. Metoda powyżej może przyjąć wszystko co jest Typem Interfejs. Metoda ta mówi: hej, obsługuje wszystko co jest Interfejsem. Czyli możesz do tej metody wrzucić silnik i koła. A następnie zostanie wykonana metoda naprawiania tego elementu. Elementy różnią się od siebie. Inaczej naprawiasz silnik, a inaczej koła. Ale to nie ma znaczenia bo każda z tych metod się wykona poprawnie dla kół i dla silnika :)

komentarz 27 marca 2017 przez itcloud Gaduła (3,380 p.)
Dzieki dobry człowieku!
+1 głos
odpowiedź 27 marca 2017 przez shuetam Nowicjusz (240 p.)
Konstruktor w klasie Kompozycja jest typu void? (pewnie dlatego się on nie wyświetla). Brakuje nawiasu '}' zamykającego klasę Kompozycja i próbujesz dostać się do zmiennej zm, która ustawiona jest jako prywatna.
komentarz 27 marca 2017 przez itcloud Gaduła (3,380 p.)
Co do konstruktora - brawo, pomogłeś. Usunąłem void.

Co do nawiasu - może czegoś nie wkleiłem, ale uwierz, że nawiasy sa ok. Co do zmiennej private, to jest mimo wszystko osiągalna, bo dostaję się do niej wewnątrz klasy Kompozycja. Tu nie ma problemu. Nie wiem tylko, jak tworzyć obiekt np. KlasaA w tym mainie. Gdyby KlasaA była oddzielnym plikiem .java, ale nie jest. Wewnatrz pliku Kompozycja.java są jeszcze inne klasy KlasaA, KlasaB.
1
komentarz 27 marca 2017 przez shuetam Nowicjusz (240 p.)
Sorry nie zauważyłem tych nawiasów. Jedyne co mi przychodzi do głowy (nawiązując do Twojego kodu) to zrobić: KlasaA kl2 = a.new KlasaA(); ale nie wiem czy o to Ci chodzi

Podobne pytania

0 głosów
1 odpowiedź 942 wizyt
+2 głosów
1 odpowiedź 2,689 wizyt
pytanie zadane 8 kwietnia 2017 w Java przez itcloud Gaduła (3,380 p.)
0 głosów
1 odpowiedź 204 wizyt
pytanie zadane 31 stycznia 2021 w Java przez p_wel Nowicjusz (120 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...