Dziedziczenie: Punkt 2D i 3D
Spis treści
Zadanie
Stwórz klasę Punkt2D, która przechowuje informacje na temat punktu na przestrzeni dwuwymiarowej (współrzędne x oraz y). Zawierająca dwa konstruktory: bezparametrowy ustawiający pola na wartość 0, oraz przyjmujący dwa argumenty i ustawiający pola obiektu zgodnie z podanymi parametrami.
Napisz klasę Punkt3D dziedziczącą po Punkt2D, reprezentującą punkt w trójwymiarze (dodatkowe pole z).
W klasie testowej utwórz obiekty obu klas i przetestuj działanie.
Rozwiązanie
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);
}
}
Dyskusja i komentarze
Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.
Poniżej znajdziesz archiwalne wpisy z czasów, gdy strona była jeszcze hobbystycznym blogiem.
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?