Szkolenia programowania we Wrocławiu
Kurs Java Podstawy - rozszerzony

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

Komentarze zamknięte. Zapraszamy do grupy na Facebooku
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?