Rozwiązania

Rozwiązanie 2.6

Zadanie polegało na przetestowaniu działania prostego dziedziczenia. Należało utworzyć dwie klasy: Punkt2D i rozszerzającą ją klasę Punkt3D zaopatrzone w odpowiednie konstruktory, a następnie wyświetlić ich działanie na ekranie.

class Punkt2D{
	int x;
	int y;

	public Punkt2D(){
		x=0;
		y=0;
	}

	public Punkt2D(int a, int b){
		x = a;
		y = b;
	}
}

public class Punkt3D extends Punkt2D{
	int z;

	public Punkt3D(int a, int b, int c){
		x=a;
		y=b;
		z=c;
	}
}

I na koniec przykładowa klasa testowa:

public class Test{
	public static void main(String[] args){
		Punkt2D pkt2D = new Punkt2D(3, 3);
		System.out.println("Współrzędne 2D: "+pkt2D.x+" "+pkt2D.y);

		Punkt3D pkt3D = new Punkt3D(4, 5, 6);
		System.out.println("Współrzędne 3D: "+pkt3D.x+" "+pkt3D.y+" "+pkt3D.z);
	}
}

Komentarze

Dodawanie komentarzy jest aktualnie wyłączone.

Szapko

Czemu gdy tworzę nowy obiekt punktu 3d bez parametrów, to nie dzieje się tak jak w przykładzie z lekcji, czyli z = 0? Z błędu w konsoli wnioskuję, że to coś przez to, że do klasy Punkt3D dodaliśmy konstruktor, ale co w takim razie, nie można dodać żadnego konstruktora do potomka, bo nie będą działać cechy dziedziczne? Mój kod: class Punkt2D { int x; int y; public Punkt2D() { x = 0; y = 0; } public Punkt2D(int a, int b) { x = a; y = b; } } -------------------------------------------------------------- class Punkt3D extends Punkt2D { int z; public Punkt3D(int a, int b, int c) { x = a; y = b; z = c; } } -------------------------------------------------------------- class Cw26 { public static void main(String[] args) { Punkt2D dwa = new Punkt2D(10, 40); System.out.println("x: " + dwa.x + ", y: " + dwa.y); Punkt3D trzy = new Punkt3D(); System.out.println("x: " + trzy.x + ", y: " + trzy.y + ", z: " + trzy.z); trzy.x = 11; trzy.y = 41; trzy.z = 31; System.out.println("x: " + trzy.x + ", y: " + trzy.y + ", z: " + trzy.z); */ Punkt3D trzy2 = new Punkt3D(12, 42, 32); System.out.println("x: " + trzy2.x + ", y: " + trzy2.y + ", z: " + trzy2.z); } }

rh

Dodanie dowolnego konstruktora do jakiejś klasy powoduje, że znika jej konstruktor domyślny ( czyli Klasa() ) - trzeba go wtedy dopisać samemu. W tym przypadku: Punkt3D() { // Tutaj po cichu, automatycznie wywołuje się Punkt2D() zerujący x i y. // Nam zostaje tylko wyzerować z: z = 0; }

Michał

Co trzeba zrobić, żeby klasa dziedzicząca odziedziczyła oprócz pól i metod również konstruktory ?

Slawek

zobacz to: http://javastart.pl/programowanie-obiektowe/dziedziczenie-i-konstrukcja-super/

Kreet

Dlaczego zainicjowanie zmiennych klasy musi sie odbywac w konstruktorze, a nie od razu, przy deklarowaniu?

Konrad

public class Punkt2D { int x; int y; public Punkt2D() { x = 0; y = 0; } public Punkt2D(int a, int b){ a = x; b = y; } } -------------------------------------------------------------------------------------- public class Punkt3D extends Punkt2D { int z; public Punkt3D(int a, int b, int c) { x = a; y = b; z = c; } } -------------------------------------------------------------------------------------- public class Test { public static void main(String args[]){ Punkt2D pkt2D = new Punkt2D(3, 3); System.out.println("Współrzędne punktu to: ("+pkt2D.x+","+pkt2D.y+")"); Punkt3D pkt3D = new Punkt3D(10,20,5); System.out.println("Współrzędne punktu to: ("+pkt3D.x+","+pkt3D.y+","+pkt3D.z+")"); } } -------------------------------------------------------------------------------------- Wyswietla mi: Współrzędne punktu to: (0,0) <---------- dlaczego? Współrzędne punktu to: (10,20,5)

Seba

Zamiast: public Punkt2D(int a, int b){ a = x; b = y; } } powinno być : public Punkt2D(int a, int b){ x = a; y = b; } }

Konrad

Dzięki Seba!

Krystian

Dzięki Seba właśnie miałem ten sam błąd :D teraz działa : public class Punkt2D { int wspX; int wspY; public Punkt2D(){ wspX=0; wspY=0; } public Punkt2D(int x, int y){ wspX = x; wspY = y; } public Punkt2D(Punkt2D pkt){ wspX = pkt.wspX; wspY = pkt.wspY; } } public class Punkt3D extends Punkt2D { int wspZ; public Punkt3D(int x, int y, int z){ wspX = x; wspY = y; wspZ = z; } public Punkt3D(Punkt3D pkt1){ wspX = pkt1.wspX; wspY = pkt1.wspY; wspZ = pkt1.wspZ; } } public class Punkt32D { public static void main(String[] args){ Punkt2D wspolrzedna = new Punkt2D(5,10); System.out.println("Współrzędna X: "+wspolrzedna.wspX+""); System.out.println("Współrzędna Y: "+wspolrzedna.wspY+""); //najpierw stwórzmy domyślny obiekt klasy Szef korzystając z domyślnego konstruktora //odziedziconego z klasy Pracownik Punkt3D troj = new Punkt3D(15,20,25); //zobaczmy jak wyglądają odpowiednie pola System.out.println("Współrzędna Z: "+troj.wspX+" "+troj.wspY+" "+troj.wspZ+""); } }

pietroff

Witam. Zaczynam zabawę z Javą i swój program rozwiązałem w następujący sposób : public class DwuWymiarowa { int x; int y; public DwuWymiarowa(){ x = 0; y = 0; } public DwuWymiarowa(int a, int b){ x = a; y = b; } } -------------------------------------------------------------- public class TrzyWymiarowa extends DwuWymiarowa { int z; } --------------------------------------------------------------- public class Test { public static void main(String[] args){ DwuWymiarowa dwuWymiarowa = new DwuWymiarowa(8, 10); System.out.println("x " + dwuWymiarowa.x); System.out.println("y " + dwuWymiarowa.y); TrzyWymiarowa trzy = new TrzyWymiarowa(); trzy.x = dwuWymiarowa.x; trzy.y = dwuWymiarowa.y; trzy.z = 9; System.out.println("x " + trzy.x); System.out.println("y " + trzy.y); System.out.println("z " + trzy.z); } } Myślisz, że takie podejście tez jest słuszne??

Janosch

Moje rozwiązanie z użyciem pustych konstruktorów do zerowania. http://forum.javastart.pl/Thread-Dziedziczenie-podstawy?pid=1028#pid1028

snt.banzai

gdy piszę cos takiego public Punkt3D(Punkt2D pkt, int c){ wspZ = c; } system zwraca mi zera dla pktX oraz pktY przy wykonywaniu programu, dlaczego?