Fragen zur Vererbung

Hallo ich habe ein paar kleine Fragen.
Ich möchte gerne den Namen der Subclasse in der Hauptklasse wiedergeben.
Bzw. Ich habe zwei Subklassen und eine Methode in der Hauptklasse soll in abhängigkeit der Subklassen
eine Berechnung durchführen. In der Methode Ausgabe funktionert das bei mir einfach mit
Code:
String s = " Flugzeugart :" + getClass() + "\n";

wobei das schon ungünstig ist da ich die Bezeichnung "Class" vorneweg nicht möchte.
Wenn ich jedoch versuche zu schreiben

Code:
String k = getClass()

dann klappt das leider nicht
 
T

triopsfreak

Gast
Im oberen Code wird automatisch gecastet, weil da ja nur String geht.
Im unteren musst du noch einen Cast machen, also (String) vor getClass() hinschreiben. Oder du machst getClass().toString(), das liefert einen String, der das Objekt repräsentiert, ist von Objekt zu Objekt verschieden. Du könntest sogar noch eine dritte Variante machen, mit String.valueOf(getClass()), bin mir aber gerade nicht sicher, ob das funktioniert, sollte aber eigentlich schon....
 
B

...ButAlive

Gast
Ich habe zwei Subklassen und eine Methode in der Hauptklasse soll in abhängigkeit der Subklassen eine Berechnung durchführen.

Was du machen willst:

Java:
public class A
{
	public String doSomething(){
		Class<? extends A> clazz = this.getClass();
		
                if(clazz == A.class)
                        return "Das ist die Basis";

		if(clazz == B.class)
			return "HALLO";
		
		if(clazz == C.class)
			return "WELT";
		
		else		
			return "Unbekannte Klasse";
	}
}

public class B extends A{}

public class C extends A{}

Und der Test

Java:
public static void main(String[] args)
{
	B b = new B();
	C c = new C();
		
	System.out.println(b.doSomething());
	System.out.println(c.doSomething());
}

Aber was ist, wenn du eine Klasse D einfügen willst? Du musst A anfassen und ändern. Es wäre also besser wenn A gar nicht seine Subklassen kennt.

Die selbe Ausgabe bekommt man auch folgendermaßen hin:

Java:
public class A
{
	public String doSomething()
	{
		return "Das ist die Basis";
	}
}

public class B extends A
{
	@Override
	public String doSomething()
	{
		return "HALLO";
	}
}

public class C extends A
{
	@Override
	public String doSomething()
	{
		return "WELT";
	}
}

In deinem Fall bedeutet das, dass du die Algorithmen für die einzelnen Subklassen aus der Basisklasse in die Subklassen verlagern musst.
 

TheWhiteShadow

Bekanntes Mitglied
Bzw. Ich habe zwei Subklassen und eine Methode in der Hauptklasse soll in abhängigkeit der Subklassen
eine Berechnung durchführen.
Da ist ein Anfänger-Denkfehler drinn.

Wenn die Aktion von der Subklasse abhängt, muss sie dort implementiert werden.
Die Elternklasse darf gar nicht wissen, wo sie extendend wird.

Damit du sie über die Basis-Klasse aufrufen kannst deklarierst du sie dort leer oder besser als abstract.
Die Kind-Klassen müssen dann diese Methode üerschreiben.

Vorteil: Für jede Kindklasse ist das Verhalten bekannt und expliziet angegeben.
 

Landei

Top Contributor
Die Kunst ist, das Gemeinsame der Berechnung wenn möglich in die Elternklasse zu packen, und die Besonderheiten in die Unterklassen. Ein einfaches Beispiel:

Java:
public abstract class Edelmetall {
   private double preis;
   public Artikel(double preis) {
      this.preis = preis;
   }

   public abstract double mwst();

   public double endPreis() {
      return preis + preis*mwst()/100.0;  //allgemeine Berechnungsvorschrift
   }
}

public class Platin extends Edelmetall {
   public Platin(double preis) {
      super(preis);
   }
   public double mwst() { return 19.0; } //spezieller Teil der Berechnung
}

public class Gold extends Edelmetall {
   public Gold(double preis) {
      super(preis);
   }
   public double mwst() { return 0.0; } //spezieller Teil der Berechnung
}

public class Silber extends Edelmetall {
   public final boolean muenze;
   public Silber(double preis, boolean muenze) {
      super(preis);
      this.muenze = muenze;
   }
   public double mwst() { 
      return muenze ? 7.0 : 19.0; //spezieller Teil der Berechnung
   }
}

(Das entspricht übrigens der tatsächlichen Regelung in Deutschland)

Wenn du versucht bist, Fallunterscheidungen anhand des Typs anzustellen, machst du es in 99% der Fälle falsch: die Typhierarchie ist verunglückt, du hast bestimmte Beziehungen nicht berücksichtigt u.s.w.

Zu den wenigen Ausnahmen zählt der Umgang mit externen Daten, über die man keine Compilezeit-Informationen verfügt (etwa wenn man einen Objekt-Browser für eine IDE schreiben will) oder im Zusammenhang mit Generics (wenn durch "Type Erasure" Informationen verloren gehen), also eher bei fortgeschrittenen Themen.
 
Zuletzt bearbeitet:
Vielen Dank ihr habt mir in diesem Fall wirklich sehr weit geholfen.
Eine offene Frage hätte ich noch.
Laut Aufgabenblatt soll ich die Variablen in der Mutterklasse als private deklarieren.
Diese Muss ich dann aber im Konstruktor einer Subklasse implementieren.
Ich hab gedacht ich kann keine als private deklarierte variable des Mutterklasse in der Subklasse verändern.
Oder gibt es da Möglichkeiten/Ausnahmen
 

.k3

Mitglied
Vielen Dank ihr habt mir in diesem Fall wirklich sehr weit geholfen.
Eine offene Frage hätte ich noch.
Laut Aufgabenblatt soll ich die Variablen in der Mutterklasse als private deklarieren.
Diese Muss ich dann aber im Konstruktor einer Subklasse implementieren.
Ich hab gedacht ich kann keine als private deklarierte variable des Mutterklasse in der Subklasse verändern.
Oder gibt es da Möglichkeiten/Ausnahmen

Wenn ich das richtig verstanden habe, kannst du dieses Problem über Set/Get-Methoden lösen.
Also in der Mutterklasse public Methoden die den Wert der Variablen zurückgeben, bzw. diesen in der Mutterklasse verändern.
 

Landei

Top Contributor
Eine offene Frage hätte ich noch.
Laut Aufgabenblatt soll ich die Variablen in der Mutterklasse als private deklarieren.
Diese Muss ich dann aber im Konstruktor einer Subklasse implementieren.
Ich hab gedacht ich kann keine als private deklarierte variable des Mutterklasse in der Subklasse verändern.
Oder gibt es da Möglichkeiten/Ausnahmen

Normalerweise sieht das so aus:
Java:
public class Mutterklasse {
   private int geheim;
   public Mutterklasse(int nichtgeheim) {
       this.geheim = nichtgeheim;
   }
}

public class Subklasse {
   public Subklass(int nichtgeheim) {
       super(nichtgeheim);
   }
}

Wie du siehst, wird die private Membervariable im Konstruktor der Mutterklasse gesetzt (was ja erlaubt ist), aber zu dessen Initialisierung der "von außen" (z.B. von der Subklasse) übergebene Wert verwendet.

Was für einen Anfänger ziemlich verwirrend sein kann, ist das Zusammenspiel der verschienedenen Namensräume: Man könnte in obigen Beispiel durchaus die Variable "nichtgeheim" überall in "geheim" umbenennen, und es würde trotzdem funktionieren, weil es immer noch zwei unterschiedliche Variablen sind, die nur zufällig gleich heißen. Im Konstruktor der Mutterklasse würde sich dann der Name "geheim" auf das übergebene Argument beziehen, und "this.geheim" auf die Membervariable. Der Fachbegriff für diese Namensüberdeckung ist Shadowing ("Überschattung").

Java hat übrigens vier getrennte Namensräume, und zwar für Typen (z.B. Klassen), Variablen, Methoden und Packages, die untereinander nicht zu Namenskonflikten führen. Es ist zwar extrem schlechter Stil, aber absolut valider Java-Code, folgendes zu schreiben:

Java:
package foo;

class foo {
   foo foo;
   foo(foo foo){
      this.foo = foo;
   }
   foo foo() {
      return foo;
   }
}

Jetzt fehlen nur noch Generics (ich glaube, die gehören zum Typ-Namensraum, aber 100% sicher bin ich da nicht)...
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Java Vererbung Fragen (zu Code Beispiel) Java Basics - Anfänger-Themen 3
Zrebna Fragen zu einem Klassendiagramm Java Basics - Anfänger-Themen 8
H Fragen zu Wrapperklassen Java Basics - Anfänger-Themen 29
S Best Practice Fragen zu Projektstruktur einer Datenbank-Abfrage-App (MVC) Java Basics - Anfänger-Themen 13
A Bei VierGewinnt fragen ob man gegen CPU oder Menschen spielen will. Java Basics - Anfänger-Themen 7
A Bei VierGewinnt vorher fragen, ob man gegen den Computer spielen möchte oder gegeneinander. Java Basics - Anfänger-Themen 1
A Bei VierGewinnt fragen, ob man gegen den Computer spielen möchte oder gegeneinander Java Basics - Anfänger-Themen 1
sserio Wie kann man nach einer Klasse fragen? Java Basics - Anfänger-Themen 12
G Fragen zu Kompelierfehler in Aufgabe. Java Basics - Anfänger-Themen 25
E Bäume/ allgemeine Fragen Java Basics - Anfänger-Themen 21
O Falsche Antworten zu Fragen Java Basics - Anfänger-Themen 4
S Diverse Fragen vor Schulaufgabe ;) Java Basics - Anfänger-Themen 4
S Fragen zu Ausgabe double und float Java Basics - Anfänger-Themen 3
B fragen zu Aufbau eines UML-Klassendiagramm Java Basics - Anfänger-Themen 1
C 3 Fragen rund um Klassenattribute Java Basics - Anfänger-Themen 8
L Erste Schritte Log4J Fragen Java Basics - Anfänger-Themen 5
NeoLexx Fragen zu diversen Elementen der Javabibliothek Java Basics - Anfänger-Themen 5
D Budget Manager fragen zur Umsetzung Java Basics - Anfänger-Themen 9
N Fragen zur Datenspeicherung Java Basics - Anfänger-Themen 45
T Java Anfänger mit konkreten Fragen Java Basics - Anfänger-Themen 2
CT9288 Fragen zu Java Java Basics - Anfänger-Themen 16
W Fragen zu Generics Java Basics - Anfänger-Themen 14
T ObjectInput/OutputStream Fragen zur Funktionsweise Java Basics - Anfänger-Themen 3
J Fragen zu einer Methode Java Basics - Anfänger-Themen 3
J Fragen zum Code aus dem Buch "Schrödinger programmiert Java 2.te Ausgabe" Java Basics - Anfänger-Themen 6
Z Fragen zu Exception (Throws/throw) Java Basics - Anfänger-Themen 7
J Fragen zu Input/Output Java Basics - Anfänger-Themen 3
J Erste Schritte Oracle Tutorials zu Java 8 - Fragen dazu Java Basics - Anfänger-Themen 1
H Java Quereinsteiger Roadmap und Fragen Java Basics - Anfänger-Themen 29
H fragen Java Basics - Anfänger-Themen 15
M Samelsarium Grundlegender Fragen 2 Java Basics - Anfänger-Themen 9
M Sammelsarium an Grundlagen Grundlagen Fragen Java Basics - Anfänger-Themen 11
B Java ist / wird kostenpflichtig. Ein paar Fragen Java Basics - Anfänger-Themen 1
J Fragen zu synrchonized und kritischen Abschnitten Java Basics - Anfänger-Themen 5
S Fragen zu einem Rechentrainer Java Basics - Anfänger-Themen 2
J Wo kann man Fragen zu ireport stellen. Java Basics - Anfänger-Themen 0
M Fragen zum Anlegen und Benutzen von Listen Java Basics - Anfänger-Themen 9
G Ein paar Anfänger Fragen zu StdDraw Java Basics - Anfänger-Themen 4
D Fragen zur Klassen Java Basics - Anfänger-Themen 4
Aprendiendo Zwei Fragen und ein geerbtes "protected"-Attribut Java Basics - Anfänger-Themen 2
J Interface Fragen bezüglich "Sauberkeit" von Code Java Basics - Anfänger-Themen 5
D Objekte-Fragen Java Basics - Anfänger-Themen 1
V Erste Schritte Habe Fragen zu der For und While Schleife als auch Inkrement und Dekrement Java Basics - Anfänger-Themen 4
D Anfänger-Fragen(Parameter einer Methode) Java Basics - Anfänger-Themen 7
K Zwei Fragen zu Graphics/Graphics2D Java Basics - Anfänger-Themen 5
R Fragen über den Konstruktor Java Basics - Anfänger-Themen 0
Azazel Ein paar Fragen zu Methodenaufrufen(java.awt) Java Basics - Anfänger-Themen 2
S Erste Schritte Fragen zur For-Schleife Java Basics - Anfänger-Themen 9
C Interface Fragen zum Interface Java Basics - Anfänger-Themen 7
GreenTeaYT Exception und zur OOP fragen? Java Basics - Anfänger-Themen 3
C Fragen zum Spigot Plugin (1.8) Java Basics - Anfänger-Themen 6
J Fragen zu Exceptions Java Basics - Anfänger-Themen 24
N Quiz- Fragen zufällig anzeigen lassen Java Basics - Anfänger-Themen 7
J Verschieden Fragen über Java Programmierung Java Basics - Anfänger-Themen 3
L Viele Fragen zu den Grundlagen Java Basics - Anfänger-Themen 5
B Fragen zu ZIP-File Java Basics - Anfänger-Themen 9
L fragen zu arrays Java Basics - Anfänger-Themen 8
L Fragen zu selbstgeschriebenem Programm Java Basics - Anfänger-Themen 5
M Fragen zum Auslesen von HTML Seiten Java Basics - Anfänger-Themen 5
J Threading-Aufgabe. Totale Noob Fragen, aber bitte trotzdem beantworten ;) Java Basics - Anfänger-Themen 7
S Java Fragen Konstruktor & Statische Methoden Java Basics - Anfänger-Themen 4
K Erste Schritte Frage Antwort Spiel - Fragen zur Planung Java Basics - Anfänger-Themen 2
C Java Applet Fragen: Serialisierung, Excel import Java Basics - Anfänger-Themen 2
Anfänger2011 2 kleine Fragen zu ArrayListen Java Basics - Anfänger-Themen 5
S Fragen zu Ausdrücken&Bedingungen Java Basics - Anfänger-Themen 5
A 2 kurze Anfänger fragen Java Basics - Anfänger-Themen 6
H grundlegende Fragen Java Basics - Anfänger-Themen 3
V Interface ich schäme mich das zu fragen, aber ich schaff nicht ein Text zu zentrieren :( [javaFX] Java Basics - Anfänger-Themen 6
N Programm: Fragen beantworten Java Basics - Anfänger-Themen 6
C Anfänger Anfänger Fragen Java Basics - Anfänger-Themen 8
Z Compiler-Fehler LinkedList Fragen Java Basics - Anfänger-Themen 4
D Rekursion Allgemeine Fragen Java Basics - Anfänger-Themen 2
D [Fragen] zu Methoden Java Basics - Anfänger-Themen 2
S Fragen zur Implementierung eines Binärbaums Java Basics - Anfänger-Themen 3
T Ein paar Fragen zu OOP und Java. Java Basics - Anfänger-Themen 16
J Allgemeine Fragen zur GUI Java Basics - Anfänger-Themen 1
johnnydoe Erste Schritte Erster Blick - erste Fragen Java Basics - Anfänger-Themen 11
DStrohma Grundsätzliche Fragen zu Drag & Drop Java Basics - Anfänger-Themen 1
N Klassen fragen zur getter und setter methode Java Basics - Anfänger-Themen 11
S 3 Fragen, Verzeichnis, GridLayout psoitionieren, Werte für JSpinner Java Basics - Anfänger-Themen 2
T Fragen zu Set / Relationen verknüpfen Java Basics - Anfänger-Themen 4
S 2 Fragen Java Basics - Anfänger-Themen 4
S Hallo und Fragen zu Arbeitsverzeichnis und Menü Java Basics - Anfänger-Themen 8
N Java Fragen... Java Basics - Anfänger-Themen 10
F ExecutorService Fragen! Java Basics - Anfänger-Themen 2
O HashMap Fragen Java Basics - Anfänger-Themen 8
C Fragen zu Arrays Java Basics - Anfänger-Themen 19
T viele "kleine" Fragen... Java Basics - Anfänger-Themen 3
S Fragen zur Implementierung eines Adressbuches Java Basics - Anfänger-Themen 20
S Fragen zu Arrays Java Basics - Anfänger-Themen 6
K Diverse Fragen zum Fehlerlogging Java Basics - Anfänger-Themen 9
N StringReader - Fragen Java Basics - Anfänger-Themen 8
C Einige Fragen zu Frames Java Basics - Anfänger-Themen 7
M Erste Schritte Allgemeine Fragen Java Basics - Anfänger-Themen 4
PaulG Fragen zu Binärbaum Java Basics - Anfänger-Themen 21
P Methoden Aquarium (Fragen zum Scanner) Java Basics - Anfänger-Themen 5
T Erste Schritte Fragen zu meinen kleinen Programm Java Basics - Anfänger-Themen 9
D 2 Fragen: Position ändern vs. LayoutManager / Bilder einfügen im Vordergrund Java Basics - Anfänger-Themen 3
O Zwei Fragen zu Methoden Aufrufen Java Basics - Anfänger-Themen 5
B fragen zur for-schleife und arrays Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben