Zugriff auf Methode einer Subklasse

Status
Nicht offen für weitere Antworten.
S

sushi_2k

Gast
Hallo Community,
ich stehe gerade leider total auf dem Schlauch und weiss nicht weiter.
Ich habe 3 Klassen geschrieben, für eine Flächenberechnung von Rechtecken und Quadraten.
Es funktioniert auch alles wie es soll, ausser das ich nicht weiss, wie ich von der Geo_Test, die Methode volumen von der classe Quader aufrufen soll. Da ich bei dem Testprogramm, noch das Volumen ausgeben möchte.

Klasse Rechteck:
Code:
package geometrische_figuren;

public class Rechteck {

	double laenge;
	double breite;
	
	Rechteck()
	{
		laenge = 1;
		breite = 1;
	}
	
	Rechteck(double l, double b)
	{
		if (l <= 0.0 || b <= 0.0)
		{
			laenge = 1;
			breite = 1;
		}
		else
		{
			laenge = l;
			breite = b;
		}
	}
	
	double flaeche()
	{
		return (laenge * breite);
	}
	
	void druckeKantenlaengen()
	{
		System.out.println("Laenge: " + laenge);
		System.out.println("Breite: " + breite);
	}
	
}

Quader, von Rechteck abgeleitet
Code:
package geometrische_figuren;

public class Quader extends Rechteck {

	double tiefe;
	
	Quader()
	{
		laenge = 1;
		breite = 1;
		tiefe = 1;
	}
	
	Quader(double b, double l, double t)
	{
		breite = b;
		laenge = l;
		tiefe = t;
		
		if (b <= 0.0)
			b = 1.0;
		else 
			breite = b;
		
		if (l <= 0.0)
			l = 1.0;
		else
			laenge = l;
		
		if (t <= 0.0)
			t = 1.0;
		else
			tiefe = t;
	}
	
	double flaeche()
	{
		return (2 * (breite * laenge + breite * tiefe + tiefe * laenge));
	}
	
	double volumen()
	{
		return (breite * laenge * tiefe);
	}
	
	void druckeKantenlaengen()
	{
		System.out.println("Laenge: " + laenge);
		System.out.println("Breite: " + breite);
		System.out.println("Tiefe: " + tiefe);
	}
}

und die Testanwendung
Code:
package geometrische_figuren;

public class Geo_Test {
	
	
	public static void main(String[] args) 
	{	
		Rechteck [] geo_feld = new Rechteck[5];
		
		geo_feld[0] = new Quader();
		geo_feld[1] = new Rechteck(10.0, 2.0);
		geo_feld[2] = new Rechteck();
		geo_feld[3] = new Quader(7.0, 3.0, 4.0);
		geo_feld[4] = new Rechteck(-5.0, 9.0);	

		int zaehler_rechteck = 1;
		int zaehler_quader = 1;
		
		for (int i=0; i < geo_feld.length; i++)
		{
			String klasse;
			
			System.out.println(geo_feld[i].getClass().getName());
			
			klasse = geo_feld[i].getClass().getName();
			
			if (klasse.equals("geometrische_figuren.Rechteck"))
			{
				System.out.println("Rechteck " + zaehler_rechteck);
				System.out.println("Flaeche: " + geo_feld[i].flaeche());
				geo_feld[i].druckeKantenlaengen();
				System.out.println("");
				zaehler_rechteck++;
			}
			else
			{
				System.out.println("Quader " + zaehler_quader);
				System.out.println("Flaeche:" + geo_feld[i].flaeche());
				//System.out.println("Flaeche:" + geo_feld[i].volumen());   <== Geht nicht...
				geo_feld[i].druckeKantenlaengen();
				System.out.println("");
				zaehler_quader++;
			}	
				
		}
	}

}
 

Murray

Top Contributor
1. Besser nicht die Klassennamen vergleichen; lieber instanceof verwenden
2. durch expliziten Cast auf spezialisierte Methoden zugreifen

Code:
         if (geo_feld[i] instanceof Rechteck)) {
            System.out.println("Rechteck " + zaehler_rechteck);
            System.out.println("Flaeche: " + geo_feld[i].flaeche());
            geo_feld[i].druckeKantenlaengen();
            System.out.println("");
            zaehler_rechteck++;
         } else if (geo_feld[i] instanceof Quader) {
            Quader q = (Quader)(geo_feld[i]);
            System.out.println("Quader " + zaehler_quader);
            System.out.println("Flaeche:" + quader.flaeche());
            System.out.println("Flaeche:" + quader.volumen());
            quader.druckeKantenlaengen();
            System.out.println("");
            zaehler_quader++; 
       }

PS: die Zähler sollte man besser auf 0 initialisieren und dann gleich zu Beginn der Verzweigungen hochzählen, sonst hat man am Ende immer einen zuviel.
 

L-ectron-X

Gesperrter Benutzer
Randbemerkung:
Die eigentliche Vererbungslogik erscheint mir schon nicht korrekt. Ein Rechteck ist eine Fläche, ein Quarder ist ein Körper. Aber ein Quarder hat Seitenflächen, deren Flächeninhalt man errechnen kann.
Also müsste der Quarder eher die Methoden von Rechteck benutzen, nicht überschreiben. Vererbung hat hier meiner Meinung nach, nichts zu suchen.
 

Jango

Gesperrter Benutzer
Du kannst in der Klasse Geo_Test nicht auf die Methode volumen der Klasse Quader zugreifen, weil die Methode private deklariert ist. Und warum auch? Sie tut doch auch garnichts, außer sich zu beenden. Wenn du in der Methode mittels return etwas zurückgeben möchtest, musst du das bei der Deklaration auch bekannt geben.
 

Murray

Top Contributor
Jango hat gesagt.:
Du kannst in der Klasse Geo_Test nicht auf die Methode volumen der Klasse Quader zugreifen, weil die Methode private deklariert ist. Und warum auch? Sie tut doch auch garnichts, außer sich zu beenden. Wenn du in der Methode mittels return etwas zurückgeben möchtest, musst du das bei der Deklaration auch bekannt geben.
Das stimmt so nicht; die Methode hat keine expliziten Access-Modifier ist ist daher "package-protected", also für alle Klassen aus dem gleichen Package sichtbar.
 
G

Guest

Gast
Murray hat gesagt.:
1. Besser nicht die Klassennamen vergleichen; lieber instanceof verwenden

Das ganze ist eine Übung in der Programmierenvorlesung. Und wir sollen, laut Aufgabenstellung über getClass().getName() entscheiden ob es eine Rechteck oder Quader ist. Instanceof wäre sicherlich besser, aber kommt erst in der nächsten Übung ;-)


Murray hat gesagt.:
PS: die Zähler sollte man besser auf 0 initialisieren und dann gleich zu Beginn der Verzweigungen hochzählen, sonst hat man am Ende immer einen zuviel.

Der Zähler zählt mir nur die Anzahl der Rechtecke und Quader hoch die Ausgegeben werden. Hat also nichts mit dem eigentlichen Programm zu tun.
Also Quader 1, Rechteck 1, Quader 2....
Ansonsten natürlich 0, wenn ich auf die Felder direkt zugreife.
 
S

sushi_2k

Gast
L-ectron-X hat gesagt.:
Randbemerkung:
Die eigentliche Vererbungslogik erscheint mir schon nicht korrekt. Ein Rechteck ist eine Fläche, ein Quarder ist ein Körper. Aber ein Quarder hat Seitenflächen, deren Flächeninhalt man errechnen kann.
Also müsste der Quarder eher die Methoden von Rechteck benutzen, nicht überschreiben. Vererbung hat hier meiner Meinung nach, nichts zu suchen.

Wie gesagt, das ganze ist eine Aufgabenstellung in der Programmierenvorlesung. Und laut Aufgabenstellung soll eine Superklasse Rechteck erstellt werden und eine Subklasse Quader.
 
S

sushi_2k

Gast
Gibt es jetzt eigentlich noch eine andere Möglichkeit auf die Methode Volumen von der Subklasse Quader zuzugreifen, ausser der von Murray?
Also diese:

Code:
Quader q = (Quader)(geo_feld[i]);

Das bedeutet q ist jetzt ein Objekt der Klasse Quader und bekommt die Werte von dem aktuellen geo_feld?
 

Marco13

Top Contributor
Das ist nur eincast. Es wird KEIN neues Objekt angelegt. Man überfprüft (mit instanceof, oder durch Abfragen des Klassennamens) OB das Objekt ein Quader ist, und WENN es ein Quader ist, dann bewirkt diese Zeile, dass man es auch als "Quader q" verwenden kann. (Wenn das Objekt in Wirklichkeit "nur" ein Rechteck wäre, würde es dort einen Fehler (ClassCastException) geben).

Also anstelle von
Code:
           Quader q = (Quader)(geo_feld[i]);
           System.out.println("Volumen:" + q.volumen());
köntest du auch schreiben
Code:
           System.out.println("Volumen:" + ((Quader)(geo_feld[i])).volumen());
das ist aber unübersichtlich, deswegen macht man den Cast einmal am Anfang, und spart sich nachher diesen Klammerwust.

Aber ich muß L-ectron-X zustimmen: Diese Vererbung macht eigentlich keinen Sinn. Zum Lernen und Verstehen der eigentlichen Idee, die hinter der Objektorientierten Programmierung und Vererbung steckt, ist dieses Programm imho sch...lecht: Jede Typabfrage (egal ob mit instaceof oder über den Klassennamen) ist streng genommen ein Modellierungsfehler (und so imho auch in diesem Fall). Vielleicht würde sie in bestimmten Zusammenhängen Sinn machen (Dann würde ich aber eine Hierarchie wie etwa
Punkt -> Linie -> Rechteck -> Quader ->
erwarten :roll: und selbst das könnte man schöner machen). Wenn das eine Schul-Hausaufgabe wäre, würde ich sagen, dass der verantwortliche vermutlich einfach ein inkompetenter Lehrer ist (Wie... "Tautologie"? :wink: ) aber mal nicht vorschnell urteilen. Vielleicht kommt da ja noch was ganz schlaues hinterher... :roll:
 
S

sushi_2k

Gast
Ok, danke. Ihr wart mir eine grosse Hilfe, wieder was gelernt ;-)
Mal schauen was die nächste Übung bringt...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Klassen Zugriff auf ein Objekt einer Klasse aus einer Methode heraus Java Basics - Anfänger-Themen 4
D Zugriff auf Methode einer anderen Klasse Java Basics - Anfänger-Themen 5
G Methoden Zugriff auf Methode.. aus einer anderen Klasse Java Basics - Anfänger-Themen 6
U Methoden Zugriff auf Array von weiterer Methode einer Klasse, Rückgabewert Problem Java Basics - Anfänger-Themen 5
L Zugriff auf Methode einer anderen Klasse -> ')' fehlt ? Java Basics - Anfänger-Themen 2
C Zugriff auf Methode Java Basics - Anfänger-Themen 2
C Kein Zugriff auf Klassenmethoden in Main Methode Java Basics - Anfänger-Themen 23
R Methoden Methode der GUI-Klasse Zugriff auf Methoden der Hauptklasse Java Basics - Anfänger-Themen 9
S Vererbung Zugriff auf Methode funktioniert nicht (static/non-static) Java Basics - Anfänger-Themen 3
G Wieviel kostet der Zugriff auf Objektattribute im Vergleich zur Erstellung von vars in Methode? Java Basics - Anfänger-Themen 11
A Methoden Zugriff auf eingelesene Variablen in der main Methode (ohne Änderung der Parameterliste) Java Basics - Anfänger-Themen 4
Z Methoden Zugriff mit Klasse 3 auf Methode von Klasse 2 welche in Klasse 1 erzeugt wird Java Basics - Anfänger-Themen 6
C Problem mit Zugriff auf Variable bzw. get-Methode in anderer Klasse Java Basics - Anfänger-Themen 2
P Threads Thread und Zugriff auf externe Methode beenden Java Basics - Anfänger-Themen 4
S Zugriff auf Methode anderer Klasse Java Basics - Anfänger-Themen 6
I Kein Zugriff auf erstelltes Objekt aus anderer Methode Java Basics - Anfänger-Themen 6
1 OOP Zugriff auf eine Methode nur einmal die Sekunde Java Basics - Anfänger-Themen 8
G JTabbedPane zugriff von anderer Methode Java Basics - Anfänger-Themen 2
J Zugriff auf Methode Java Basics - Anfänger-Themen 3
I In unterschiedlichen Applikation Zugriff auf eine gemeinsame Anwendung? Java Basics - Anfänger-Themen 8
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
J Zugriff auf eine 2. Klasse die per UI-Designer erstellt wurde Java Basics - Anfänger-Themen 1
Encera Zugriff auf Map-Objekte Java Basics - Anfänger-Themen 3
T Zugriff auf Control anderer Klasse Java Basics - Anfänger-Themen 5
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
R TreeSet Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 8
H Zugriff verweigert Java Basics - Anfänger-Themen 5
moiss002 Umgebungsvariable Kein Zugriff auf ein Array Java Basics - Anfänger-Themen 7
B Probleme mit Zugriff auf Dateisystem Windows 10 ( jFileChooser) Java Basics - Anfänger-Themen 17
B Zugriffsmodifier, Zugriff außerhalb Package Java Basics - Anfänger-Themen 5
C Zugriff auf Attribut von Oberklasse Java Basics - Anfänger-Themen 8
P Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes Java Basics - Anfänger-Themen 9
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
M Gettter/Setter Methoden Klassenfelder kapselung und zugriff? Java Basics - Anfänger-Themen 1
S Zugriff auf protected Fields = guter Programmierstil? Java Basics - Anfänger-Themen 11
M Pfadprobleme - Zugriff auf einen Ordner im Workspace Java Basics - Anfänger-Themen 17
ruutaiokwu Bluetooth-Zugriff, braucht es dazu plattformabhängige Libraries oder kann das Java mittlerweile selbst? Java Basics - Anfänger-Themen 10
R Zugriff auf den Index eines Arrays, welches ein Objekt ist. Java Basics - Anfänger-Themen 4
M Zugriff auf eine ArrayList in einer anderen Klasse Java Basics - Anfänger-Themen 4
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
L Methoden Zugriff <identifier> expected Java Basics - Anfänger-Themen 13
T Java - Zugriff nur mit CLASSPATH ? Java Basics - Anfänger-Themen 7
L Zugriff auf Attribute eins Objekts über ActionListener Java Basics - Anfänger-Themen 4
S Zugriff auf Objekt Java Basics - Anfänger-Themen 5
A Klassen Zugriff auf Instanzen Java Basics - Anfänger-Themen 2
N ArrayList in eigener Klasse erzeugen mit Zugriff Java Basics - Anfänger-Themen 7
J Zugriff auf Variable in anderem Programm Java Basics - Anfänger-Themen 5
Q Zugriff auf Attribute Java Basics - Anfänger-Themen 3
J Klassen Zugriff auf ein "String Array" Java Basics - Anfänger-Themen 6
H Datentypen ArrayList in ArrayList: Zugriff Java Basics - Anfänger-Themen 6
J get methoden zugriff und objekt erzeugung Java Basics - Anfänger-Themen 30
J Datenbank Zugriff Java Basics - Anfänger-Themen 24
T Zugriff auf JCheckBox Java Basics - Anfänger-Themen 8
E Netzlaufwerk Zugriff schlägt fehl Java Basics - Anfänger-Themen 11
C Group, Actor und Instanz-Zugriff, LibGDX Java Basics - Anfänger-Themen 4
S Zugriff auf Attribut einer unbekannten Klasse erhalten Java Basics - Anfänger-Themen 6
S Vererbung Zugriff auf die Basisklasse einer "zweiten" Erweiterungsklasse Java Basics - Anfänger-Themen 2
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
F Klassen Zugriff auf verschachtelte Objekte Java Basics - Anfänger-Themen 11
J Sichtbarkeit und Zugriff Java Basics - Anfänger-Themen 9
L Zugriff auf zwei Java-Quellcodes Java Basics - Anfänger-Themen 3
A OOP Zugriff auf Objekte von außen Java Basics - Anfänger-Themen 8
M Kapselung Datenkapselung Sinn direkter Zugriff? Java Basics - Anfänger-Themen 1
J JDialog Zugriff auf parent JDialog Java Basics - Anfänger-Themen 5
K Collections Zugriff auf ein bestimmtes Element in der Collection Java Basics - Anfänger-Themen 1
K ArrayList in Konstruktor - wie späterer Zugriff Java Basics - Anfänger-Themen 2
F Zugriff auf Objekt einer anderen Klasse Java Basics - Anfänger-Themen 7
P Zugriff auf Felder in ArrayList Objekten Java Basics - Anfänger-Themen 2
J Erste Schritte Zugriff auf Eigenschaft Java Basics - Anfänger-Themen 2
M MVC - Problem mit Zugriff auf Objekt Java Basics - Anfänger-Themen 4
D Zugriff auf von einer anderen Klasse erstellten Objekten Java Basics - Anfänger-Themen 5
C 5 - Zugriff verweigert Java Basics - Anfänger-Themen 1
K Zugriff auf Variabeln Wert einer Instanz Java Basics - Anfänger-Themen 4
Z Zugriff auf andere Methoden Java Basics - Anfänger-Themen 12
Z Zugriff auf Pakete Java Basics - Anfänger-Themen 5
G Zugriff zwischen Klassen Java Basics - Anfänger-Themen 15
N Problem mit Swing Textfeld und Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 6
H Kein Zugriff auf das Element einer JList möglich: Fehlermeldung Java Basics - Anfänger-Themen 2
W OOP Zugriff auf mit Objekt erstellte Struktur Java Basics - Anfänger-Themen 7
F Klassen Zugriff auf Fenster aus versch. Klassen Java Basics - Anfänger-Themen 5
M Variablen Zugriff von außerhalb eines Blockes auf eine Variable innerhalb eines Blockes Java Basics - Anfänger-Themen 2
B Klassen Zugriff auf Daten der Child-Klasse Java Basics - Anfänger-Themen 9
W Typisierte ArrayList und der Zugriff auf den Typ Java Basics - Anfänger-Themen 5
M Zugriff auf Klasse Java Basics - Anfänger-Themen 2
K Zugriff auf C: Java Basics - Anfänger-Themen 5
S Das richtige Format für den SOAP Zugriff Java Basics - Anfänger-Themen 0
S Klassen Zugriff auf Attribute einer zweiten Klasse, welche durch dritte gesettet wurden? Java Basics - Anfänger-Themen 2
N Zugriff bei Package Struktur Java Basics - Anfänger-Themen 6
M Enum: Zugriff auf Konstanten Java Basics - Anfänger-Themen 7
V Zugriff auf jProgressbar Java Basics - Anfänger-Themen 10
B Zugriff auf csv-Datei per hashmap Java Basics - Anfänger-Themen 5
G Spalte in JTable unsichtbar machen, Zugriff auf Daten ermöglichen Java Basics - Anfänger-Themen 2
T ZUgriff auf 'Werte' Java Basics - Anfänger-Themen 3
J Vererbung Zugriff auf private Variable Java Basics - Anfänger-Themen 10
C Klassen Zugriff auf Objekt anderer Klasse Java Basics - Anfänger-Themen 8
B Methoden Zugriff auf Variable ermöglichen Java Basics - Anfänger-Themen 3
M Zugriff auf Arraylist Java Basics - Anfänger-Themen 7
D Kein Zugriff auf JFrame Java Basics - Anfänger-Themen 2
K Zugriff einer Klasse auf eine andere Andere -> bad operand for binary operator Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben