Vererben von private instanzvariablen

Luk10

Top Contributor
Hallo

ich wollte mal fragen wie ich private instantzvaribalen am besten vererben bzw. mit methoden weitergeben kann ...

also wenn ich eine klasse Baum hab mit der instanzvariablen blattfarbe, wie kann diese instanzvariable dann auf meine klasse apfelbaum extends baum weitergeben ohne die kapselung zu vernachlässigen?

danke
 
Zuletzt bearbeitet:

Luk10

Top Contributor
grml aber wenn ich will dass die fabre von Apfel (extends Baum) grün ist kann ich doch nciht die farbe von der baum-instanz verändern, sondern das Apfel-objekt soll grün sein ...
 
Zuletzt bearbeitet:

Noctarius

Top Contributor
Deswegen leitet du die Klasse ja ab. Und da es Instanzvariablen sind ändern sich die anderen Instanzen ja nicht. Dann einen Konstruktor erstellen der direkt beim Instanzieren den Setter aufruft und den Wert rot setzt.
 

diggaa1984

Top Contributor
also bei public Variablen gehe ich bei getter uns setter ja mit, aber warum denn bei zu vererbenden Variablen?! .. soll man da etwa auch Sicherheitsroutinen fahren, wenn eine Unterklasse eine ihr zugehörige Eigenschaft ändern möchte?
 

Marco13

Top Contributor
Hurra, Objektorientierte Programmierung ad absurdum :toll:
Wer hat eigentlich das Gerücht mit den Getter und Setter Methoden in die Welt gesetzt?

Eigentlich gehe ich ja noch weiter: http://www.java-forum.org/allgemeine-java-themen/44575-staerkerer-access-modifier-private.html :) Da es das "Uniform Access Principle" in Java nicht gibt, bleibt einem eigentlich, theoretisch, und wenn man es theoretisch "formal sauber" machen wollte eigentlich nichts anderes übrig. Aber wer will das schon :D
 

Jan_Gerhard

Mitglied
Wenn Dein Apfel von Baum abgeleitet wird...
Java:
class Apfel extends Baum{
}
...besitzt Apfel automatisch eine eigene Version der Variablen "farbe" und, soweit programmiert, auch eigene Versionen der Getter- und Setter-Methoden.
Also kannst Du einfach eine Variable z.B.
Java:
private String farbe;
in Baum deklarieren.

Hier ein kurzes Besipiel:

Klasse Baum
Java:
public class Baum
{
	private String farbe = null;
	
	public String getFarbe(){
		return this.farbe;
	}
	
	public void setFarbe(String farbe){
		this.farbe = farbe;
	}
}
Klasse Apfel
Java:
public class Apfel extends Baum
{
    // Apfel besitzt hier nur die Attribute und Verhaltensweisen seiner Elternklasse
}

Ausführende Klasse
Java:
public class MainClass
{
	public static void main(String[] args)
	{
		Baum baum = new Baum();
		baum.setFarbe("Gruen");
		
		Apfel apfel = new Apfel();
		apfel.setFarbe("Rot");
		
		System.out.println("Die Farbe des Baums ist " + baum.getFarbe());
		System.out.println("Die Farbe des Apfels ist " + apfel.getFarbe());
	}
}
Wie man sehen kann, wurde in Apfel keine neue Variable deklariert oder evtl. überschrieben...Vererbung halt!
Getter- ober Setter-Methoden braucht man für die Vererbung nicht. Und der Modifizierer protected wird in diesem Zusammenhang auch nicht benötigt.
Instanzvariablen sollten immer private sein und nur über Getter- bzw. Setter-Methoden erreichbar sein. Das Schlüsselwort protected würde bedeuten,
dass die Variable von jeder erbenden Klasse ohne diese Methoden erreichbar wäre.
Das sollte man grundsätzlich unterbinden!

Ich hoffe ich konnte etwas helfen.

Grüße an alle,
Jan
 

Marco13

Top Contributor
Ich glaub' das war's nicht ganz:
also wenn ich eine klasse Baum hab mit der instanzvariablen blattfarbe, wie kann diese instanzvariable dann auf meine klasse apfelbaum extends baum weitergeben ohne die kapselung zu vernachlässigen?

Es geht darum, die Blattfarbe von Baum an "Apfelbaum extends Baum" weiterzugeben - und nicht "irgendwohin". Also sowas:
Java:
class Baum
{
    private String farbe = "rot";
}

class Apfelbaum extends Baum
{
    public void singe()
    {
        System.out.println("Oh Apfelbaum, oh Apfelbaum, wie "+farbe+" sind deine Blätter");
    }
}
Das geht nicht, weil "farbe" private ist. Man sollte sie nicht public machen. Man sollte (oder will vielleicht) auch nicht einen public getter einführen. Man KÖNNTE sie protected machen, aber man könnte auch einen Protected getter einführen - was den Vorteil hätte, dass erbende Klassen die Farbe erstmal nur LESEN (aber eben nicht schreiben) dürfen.
Java:
class Baum
{
    private String farbe = "rot";

    protected String getFarbe() { return farbe; }
}

class Apfelbaum extends Baum
{
    public void singe()
    {
        System.out.println("Oh Apfelbaum, oh Apfelbaum, wie "+getFarbe()+" sind deine Blätter");
    }
}
 

Jan_Gerhard

Mitglied
Es kann aber schnell zu ungewollten Seiteneffekten führen, wenn man einfach ohne Einschränkung an irgendeiner Stelle einer Vererbungshierachie Variablen änern kann die sich beispielsweise in der Root-Klasse befinden. Zudem erschwert es die Fehlersuche. Es gilt halt allgemein als schlechter Stil.
(kommt nicht von mir :noe:)
 

diggaa1984

Top Contributor
aeh ja also das bsp mit den public methoden ist nicht passend für die diskussion.
Korrekt wäre dann das anbieten einer protected set/get-Geschichte, aber sofern man nur returned und setted ohne weiteres Vorgehen, wäre imho eine protected Variable genauso gut.

Ich habe mir den Link von Marco durchgelesen, und das Beispiel mit dem Logging lässt erahnen wohin die Gedanken führen.
 

Jan_Gerhard

Mitglied
Gegen den Einsatz von Getter- und Setter-Methoden ist ja auch nichts einzuwenden.
Ganz im Gegenteil wird deren Verwendung grundsätzlich erwartet bzw. gefordert.
 
M

maki

Gast
Getter/Setter für private/protected Instanzvariablen ist nciht so ungewöhnlich, kann helfen Seiteneffekte zu verhindern bzw. zu erzwingen da es eben stark kapselt, gibt auch ein Refactoring dafür (Encapsulate Field).
 

Jan_Gerhard

Mitglied
Im Prinzip schon. Getter- und Setter-Methoden sollten imho immer die erste Wahl sein.
Da es sich hierbei aber um eine Konstante handelt, könnte man den Zugriff auch so erlauben.
Ist ja eh unveränderlich. Aber man sollte immer an Struktur und Übersichtlichkeit denken.
Oftmals sind Getter und Setter einfach aussagekräftiger (wieder imho).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Fiedelbambu Vererbung JTabbedPane vererben in der MainView Java Basics - Anfänger-Themen 0
M Vererbung Enums vererben Java Basics - Anfänger-Themen 1
T Objekte in Listen vererben Java Basics - Anfänger-Themen 3
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
B static individuell "vererben"? Java Basics - Anfänger-Themen 8
M Vererben von Superklasse ohne Konstruktor Java Basics - Anfänger-Themen 9
B Datentypen Enum vererben/gruppieren? Java Basics - Anfänger-Themen 6
B Vererbung Designproblem beim Vererben Java Basics - Anfänger-Themen 3
U Vererben von Singleton Java Basics - Anfänger-Themen 17
Luk10 Vererben großer Interface-Methoden Java Basics - Anfänger-Themen 13
V OOP Statische Klassen-Attribute vererben Java Basics - Anfänger-Themen 4
M OOP GUI - Fenster vererben? Java Basics - Anfänger-Themen 9
K Methode vererben bei überschriebenem Konstruktor? Java Basics - Anfänger-Themen 14
C Liste mit Attribut Abstract vererben Java Basics - Anfänger-Themen 11
T OOP Klassenimport "vererben" Java Basics - Anfänger-Themen 2
A Statische Methode "vererben" - Zwang durch annotation processor Java Basics - Anfänger-Themen 10
T enum-Methoden "vererben" Java Basics - Anfänger-Themen 11
J Probleme beim Vererben Java Basics - Anfänger-Themen 2
Y Vererben - Konstruktoren Java Basics - Anfänger-Themen 2
P Attribute Vererben Java Basics - Anfänger-Themen 2
U Warum kann ich, auf private Variablen zugreifen, wenn ich ein Objekt in der Klasse, die private Variablen hat erstelle und dort drauf zugreifen will? Java Basics - Anfänger-Themen 7
M Private Variable Java Basics - Anfänger-Themen 2
Gaudimagspam Attribute einfügen private Java Basics - Anfänger-Themen 3
N JUnit und private Methoden testen. Java Basics - Anfänger-Themen 9
Z private Klassenvariablen Java Basics - Anfänger-Themen 8
S Private int in Klasse Java Basics - Anfänger-Themen 4
H Vererbung mit private instanzvariablen Java Basics - Anfänger-Themen 9
C Methoden Vererbung private Attribute/public Methoden Java Basics - Anfänger-Themen 4
J Klasse wird als private erkannt obwohl sie public deklariert ist Java Basics - Anfänger-Themen 3
E 2 Probleme - Datum & private finale Variablen Java Basics - Anfänger-Themen 5
shiroX Klassen Klasse/Methode private final jUnit-Fehler Java Basics - Anfänger-Themen 5
N Instanzvariablen als private... Java Basics - Anfänger-Themen 2
A Private Attribut aus fremder Klasse lesen ? Java Basics - Anfänger-Themen 19
P Methoden private int[] in main Java Basics - Anfänger-Themen 16
A Klassen Werte in den private Bereich übergeben Java Basics - Anfänger-Themen 5
C Collections: private Map Java Basics - Anfänger-Themen 4
M Wie private Methoden mit Asserstions testen? Java Basics - Anfänger-Themen 3
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
D Klassenvariablen standardmäßig private oder public? Java Basics - Anfänger-Themen 2
W private Array Loops Java Basics - Anfänger-Themen 4
B public/private nur 1x schreiben Java Basics - Anfänger-Themen 3
H Privat ist nicht mehr private Java Basics - Anfänger-Themen 7
J Vererbung Zugriff auf private Variable Java Basics - Anfänger-Themen 10
A Variablen lokale Variable als private? Java Basics - Anfänger-Themen 3
A private string array Java Basics - Anfänger-Themen 5
B auf private Variable durch eine Methode zugreifen Java Basics - Anfänger-Themen 8
J Probleme mit verschiedenen Private Klassen Java Basics - Anfänger-Themen 3
T public-private problem Java Basics - Anfänger-Themen 5
C Comparator und private Variablen Java Basics - Anfänger-Themen 7
K Methoden als private deklarieren? Java Basics - Anfänger-Themen 13
K Protected und Private Deklaration Java Basics - Anfänger-Themen 8
F Im Konstruktor mit Settern auf private Attribute zugreifen - oder nicht? Java Basics - Anfänger-Themen 18
B Kapselung Klasse private, Konstruktor protected Java Basics - Anfänger-Themen 10
H NEtBeans: Fehler: XXX has private access... Java Basics - Anfänger-Themen 2
K Kapselung public / private verständis problem Java Basics - Anfänger-Themen 17
E einfache Frage zu private Java Basics - Anfänger-Themen 26
N public class -> public method -> variable private? Java Basics - Anfänger-Themen 10
W Private Methode variablen übergeben..?! WIE! Java Basics - Anfänger-Themen 30
K OOP Datenkapselung mittels private - length Attribut bei Array Java Basics - Anfänger-Themen 3
L Private Methode in Subklasse? Java Basics - Anfänger-Themen 2
S Private Class Problem Java Basics - Anfänger-Themen 17
K Kann man Private-Konstruktoren doch aurufen? Java Basics - Anfänger-Themen 8
P zugriff auf private variablen Java Basics - Anfänger-Themen 5
A Allgemeine Frage zur Sichtbarkeit "private" Java Basics - Anfänger-Themen 5
berliner Klassen Vererbung und Zugriff auf innere private Variable Java Basics - Anfänger-Themen 22
G field public/private wann Java Basics - Anfänger-Themen 11
Spin private Frage Java Basics - Anfänger-Themen 16
G Zugriff auf private Variablen einer inneren Klasse Java Basics - Anfänger-Themen 5
G Private Messages versenden Java Basics - Anfänger-Themen 13
S Zugriffe über Private Instanzvariablen Java Basics - Anfänger-Themen 3
J Public / Private Keys speichern bzw. lesen? Java Basics - Anfänger-Themen 8
R Private Methoden von auserhalb aufrufen Java Basics - Anfänger-Themen 2
N private variable vom typ einer klasse Java Basics - Anfänger-Themen 20
A in abstract Klasse private Variablen Java Basics - Anfänger-Themen 3
G GUI Controls private oder public Java Basics - Anfänger-Themen 6
G Variablen public oder private? Java Basics - Anfänger-Themen 9
P Private Klassen Java Basics - Anfänger-Themen 4
F Frage zur Vererbung und Zugriffmodifikator private Java Basics - Anfänger-Themen 3
S private public Java Basics - Anfänger-Themen 5
R private / public Frage Java Basics - Anfänger-Themen 7
S private String text; -> "Illegal start of expression Java Basics - Anfänger-Themen 7
R Klasse nicht sichtbar(kein private-Fehler) Java Basics - Anfänger-Themen 2
G Public ,private,protected Java Basics - Anfänger-Themen 1
R Private Klasse in Applet nutzen? Java Basics - Anfänger-Themen 9
B Instanzvariablen private? Java Basics - Anfänger-Themen 5
M Sichtbarkeit von private Java Basics - Anfänger-Themen 2
A public/private/etc. Zusatz weglassen Java Basics - Anfänger-Themen 2
M OOP frage, private variablen default-wert zuweisen sinnvoll? Java Basics - Anfänger-Themen 5
M [SOLVED]private Daten head - neues objekt? Java Basics - Anfänger-Themen 12
H Vererbung:private Java Basics - Anfänger-Themen 7
U public, private, protected und "default access" - Java Basics - Anfänger-Themen 14
T private final String oder final String? Was ist richtig? Java Basics - Anfänger-Themen 4
M Jede Variable als private, protected etc. deklarieren? Java Basics - Anfänger-Themen 7
U was macht "private" ? :) Java Basics - Anfänger-Themen 7
G private methode wird aus anderer klasse aufgerufen? Java Basics - Anfänger-Themen 3
megachucky wie bekomm ich ein private attribut aus einer andren klasse? Java Basics - Anfänger-Themen 18
H private anstatt public Java Basics - Anfänger-Themen 2
H public und private Java Basics - Anfänger-Themen 5
A Public/Private und wie importieren? Java Basics - Anfänger-Themen 13
KogoroMori21 Objektvariablen, Klassenvariablen, Instanzvariablen Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben