Vererbung Setzen auf Null bei Subklassen

xasz

Mitglied
Hallo Leute,

ich hatte heute ein langwieriges Problem und bin letzten Endes auf die Lösung gekommen.
Leider versteh ich den Code nicht ganz und wollte hier mal fragen, ob mir das einer erklären kann.

Ich habe hier mal ein Beispiel vorbereitet:
Java:
public class Main {

	public static void main(String[] args) {
		SuperClass superclass = new SuperClass();
		SubClass subclass = new SubClass();
		System.out.println(superclass.getValueA());
		System.out.println(subclass.getValueA() + " " + subclass.getValueB());
	}
}

public class SuperClass {
	String valueA = "a";
	public SuperClass(){
		setValue();
	}
	protected void setValue(){
		this.valueA = "a";
	}
	public String getValueA(){
		return this.valueA;
	}
}

public class SubClass extends SuperClass{
	String valueB = null;
	public SubClass(){
		super();	
	}
	@Override
	protected void setValue(){
		this.valueA = "someThing";
		this.valueB = "B";
	}
	public String getValueB(){
		return this.valueB;
	}
}
Meine Ausgabe ist diese hier:
Code:
a
someThing null

Wenn ich in der Subclass einfach

Java:
String valueB;

Funktioniert der Code.

Mein Problem ist, dass nach meinem Verständnis erst die Attribute der Subclass erstellt werden und dann der Konstruktor kommt. Dies scheint aber wohl nicht so zu sein, kann ich mit dem Debugger nachvollziehen. Allerdings versteh ich auch nicht ganz, wie die überschriebene Methode setValue wenn ich die Subklasse aufrufe und din der Superklasse ausgeführt wird, überhaupt auf die valueB zugreifen kann, wenn diese nicht initialisiert ist.

Komischer Satz, ich hoffe man versteht es.

Ich danke euch schonmal für eine Erklärung.
 

knilch

Bekanntes Mitglied
Hi,
Das mit oo- Ansatz ist wohl noch neu für dich.
Der Konstruktor von der erweiterten Klasse (in diesem Fall derjenige von SuperClass) wird immer als erster aufgerufen.

In der main- Methode wird zuerst eine Instanz der SuperClass erstellt.
Im Konstruktor von SuperClass wird die Methode: setValue() aufgerufen. Zuerst wird die Instanz von SuperClass() erstellt, dann wird für diese die setValue() Methode aufgerufen, womit Wert von valueA gesetzt wird.
Als nächstes erzeugst du in der main- Methode eine Instanz von SubClass(). Hier wird nun zuerst der Konstruktor von SuperClass() aufgerufen, der wiederum eine Instanz von SuperClass() erzeugt und die Methode setValue() aufruft. Nachdem die Instanz erstellt ist und setValue() aufgerufen wurde, wird eine Instanz von SubClass erzeugt. Nun folgt die Ausgabe der Werte mit System.out.println(..)

Wenn eine Instanz von einer erbenden Klasse erzeugt wird, wird immer eine Instanz von der vererbenden Klasse erzeugt.
Wenn es nicht explizit, wie du es gemacht hast:
Java:
public SubClass(){
        super();   
    }
im Code deklariert wurde, wird per default der Standart- Konstruktor von der Klasse SuperClass (vererbenden Klasse) aufgerufen. Der Standart- Konstruktor wird per default immer erstellt. (Auch wenn dieser in der Klasse nicht definiert wurde).

Sobald eine Instanz von einer Klasse existiert, können die Variablen- Werte von dieser Instanz gesetzt bez. gelesen werden. (egal ob dies nun eine erbende oder eine vererbende Klasse ist).
In den Klassen SuperClass und SubClass sind die Variablen valueA und valueB. Dies sind Instanzvariablen und sollten nie public sein.
Diese solltest du private deklarieren. Der Zugriff auf diese Variablen sollte dann mit getters und setters gemacht werden
In etwa so:

Java:
public class SuperClass {
    private String valueA;
    
    public SuperClass() {
    	this.valueA = "a";
    }
    
    protected void setValue(String valueA){
        this.valueA = valueA;
    }
   
    protected String getValueA(){
        return valueA;
    }
}
So ist klar definiert, wie der Wert der Variable valueA gesetzt bzw. zurück gegeben werden kann. Das selbe gilt für die subClass.

In deiner Main- Methode werden nun 3 Instanzen erzeugt (obwohl nur 2 definert wurden).
1. Instanz superclass
2. Im Kontruktor von SubClass wird mit super() eine Instanz von SuperClass erstellt.
3. Instanz subclass

Beide Instanzen von SuperClass sind voneinander komplett unabhängig.

Zu deiner "Frage":
... überhaupt auf die valueB zugreifen kann, wenn diese nicht initialisiert ist....
Beim beim Erzeugen der Instanz SubClass wird zuerst die Instanz der SuperClass erstellt. Der Konstruktor führt dann die Methode setValue() auf. In diesem Fall wird setValue() der Klasse SubClass ausgeführt, da in dieser Klasse die Methode setValue() überschrieben wurde.
Im Code steht: String valueB = null; das heisst. Du erstellst eine Instanz der Klasse String und setzt die Referenz auf null. D.h. für die JVM dass diese Instanz nicht mehr benötigt wird und irgendwann mal von der GarbageCollection entfernt wird.

Soblad die Method setValue() in der SubClass nun aufgerufen wird, möchte diese Methode in die String- Variable valueB etwas schreiben. Da diese aber eine ungültige Referenz hat (also null) wird die Zuweisung: this.valueB = "B"; nichts bewirken. Deshalb bekommst du auch: someThing null zurück. Wie du geschrieben hast, funktioniert es mit String valueB; Hier wird eine gültige Referenz erstellt und an diese Referenz kann ein Wert zugewiesen werden.

So wie in der main- Methode zu sehen ist, ist es dein Ziel, den Wert der SuperClass- Instanz, welche mit super() erstellt wurde zu erhalten.
Vielleicht ist folgender Code hilfreich

Java:
public class SuperClass {
    private String value;
    
    public SuperClass(){
    }
   
    protected void setValue(String value){
        this.value = value;
    }
   
    protected String getValue(){
        return value;
    }
}

Java:
public class SubClass extends SuperClass{
    String value = null;
    
    public SubClass(){
        super();   
    }
    
    @Override
    protected void setValue(String value){
    	this.value = value;
    }
    
    @Override
    protected String getValue(){
        return value;
    }
    
    public void setValueOfSuperClass(String value) {
    	super.setValue(value);
    }
    
    public String getValueOfSuperClass() {
    	return super.getValue();
    }  
}

Java:
public class Main {
	
    public static void main(String[] args) {
    	String valueA = "a";
    	String valueB = "b";
    	String valueAb = "ab"; 
    	
        SuperClass superclass = new SuperClass();
        SubClass subclass = new SubClass();
        
        superclass.setValue(valueA);
        subclass.setValue(valueB);
        subclass.setValueOfSuperClass(valueAb);
        
        System.out.println(superclass.getValue());
        System.out.println(subclass.getValueOfSuperClass() + " " + subclass.getValue());
    }
}
 

xasz

Mitglied
Wow, dank für deine ausführliche Antwort :toll:
Tut mir leid, dass ich das jetzt wieder ausgrabe, aber bin irgendwie nicht dazu gekommen. Wollte aber für so eine Klasse Arbeit, das Danke nicht fehlen lassen!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Ein übergegebenes Objekt auf null setzen Java Basics - Anfänger-Themen 9
C Array-Eintrag wieder auf Null setzen Java Basics - Anfänger-Themen 3
D Best Practice Konvention - Klassenmembers auf null setzen? Java Basics - Anfänger-Themen 2
R Property Value als null setzen Java Basics - Anfänger-Themen 1
K Selbst renderndes Object auf null setzen Java Basics - Anfänger-Themen 1
A JLabel erst auf null dann auf einen Wert setzen Java Basics - Anfänger-Themen 7
G Variablen null setzen? Java Basics - Anfänger-Themen 5
J Vektor null setzen Java Basics - Anfänger-Themen 10
C Objekte auf Null setzen Java Basics - Anfänger-Themen 6
G StringBuffer Array null setzen Java Basics - Anfänger-Themen 2
C Anker Punkt setzen. Java Basics - Anfänger-Themen 1
J neues Object (JLabel) vorab zum Layout hinzufügen , Location setzen, etc? Java Basics - Anfänger-Themen 2
B Semaphoren in Abhängigkeit an Bedingungen richtig setzen Java Basics - Anfänger-Themen 3
L Methode in setText() setzen Java Basics - Anfänger-Themen 6
L Anzahl der benachbarten Minen berechnen und setzen Java Basics - Anfänger-Themen 15
S NIO lesbares und beschreibbares Attribut setzen Java Basics - Anfänger-Themen 1
D Abstrakte Klasse, Konstruktorkette, Attribute setzen Java Basics - Anfänger-Themen 12
F In Eclipse Haltepunkt bei Event setzen? Java Basics - Anfänger-Themen 1
das_leon JOptionPane Titel setzen Java Basics - Anfänger-Themen 1
P Cursor in JTextField setzen Java Basics - Anfänger-Themen 11
N wert für progress auf 100% setzen Java Basics - Anfänger-Themen 5
M Binären Baum Kinder setzen Java Basics - Anfänger-Themen 12
F Koordinaten nach 360° auf 0° setzen Java Basics - Anfänger-Themen 2
I Prozessname setzen Java Basics - Anfänger-Themen 8
S Das Anführungszeichen(") Zeichen in einen String setzen Java Basics - Anfänger-Themen 1
C Klassen Positionszähler auf Buchstaben setzen Java Basics - Anfänger-Themen 14
M Umgebungsvariable JDK/JRE? PATH setzen Java Basics - Anfänger-Themen 5
N Server Zeit zur lokalen Zeit setzen. Java Basics - Anfänger-Themen 0
S Classpath Findet die Klasse nicht classpath setzen? Java Basics - Anfänger-Themen 8
F Erste Schritte Label Text vor Methodenaufruf setzen Java Basics - Anfänger-Themen 17
I Date zu 01.01.<year> setzen Java Basics - Anfänger-Themen 1
M zufälliges Setzen von Schiffen in while klappt nicht immer Java Basics - Anfänger-Themen 3
C [Greasmonkey] Maus Coursor position setzen Java Basics - Anfänger-Themen 1
M Umgebungsvariable JFileChooser#setCurrentDirectory via Properties setzen? Java Basics - Anfänger-Themen 5
M Wann PATH und wann JAVA_HOME in Windows System 7 setzen? Java Basics - Anfänger-Themen 2
M Die Breite bei der Gui richtig setzen. Java Basics - Anfänger-Themen 1
N Fokus setzen nachdem JFrame in Vordergrund geholt wurde Java Basics - Anfänger-Themen 7
I Variablen Wie initialisiert man in Java eine Variable ohne das Setzen von 0 oder einer anderen Zahl? Java Basics - Anfänger-Themen 8
H JPanel Hintergrund transparent setzen? Java Basics - Anfänger-Themen 10
R Classpath Setzen von class Verzeichnissen Java Basics - Anfänger-Themen 2
H KeyListener auf ganzes Fenster setzen Java Basics - Anfänger-Themen 14
Ernesto95 BufferedImage Teilbereich wieder transparent setzen Java Basics - Anfänger-Themen 16
Jagson Dotcom Spiel - Dots Random setzen Java Basics - Anfänger-Themen 8
S Ermitteln und Setzen der Attribute eines Objektes Java Basics - Anfänger-Themen 6
N Erste Schritte Tausender Trennzeichen setzen Java Basics - Anfänger-Themen 5
J JRadioButton in JTable setzen Java Basics - Anfänger-Themen 4
H Panel in Variable setzen möglich? Java Basics - Anfänger-Themen 10
Helgon Focus setzen Java Basics - Anfänger-Themen 6
E Erste Schritte AbstractTableModel Werte setzen mit setValueAt Java Basics - Anfänger-Themen 10
B eclipse Oberfläche zurück setzen Java Basics - Anfänger-Themen 2
C Leerzeichen im char Array setzen Java Basics - Anfänger-Themen 33
L Methoden In einer Klasse ein Attribut aus einer anderen Klasse setzen Java Basics - Anfänger-Themen 8
M TableColumn Breite setzen Java Basics - Anfänger-Themen 9
M Monat setzen Java Basics - Anfänger-Themen 18
Fab1 Buttons auf ein Hintergrundbild(JFrame) setzen Java Basics - Anfänger-Themen 24
U Passwort auf JButton setzen. Java Basics - Anfänger-Themen 2
M JAVA_HOME setzen xubuntu Java Basics - Anfänger-Themen 2
S Input/Output Neuen InputStream System.in setzen Java Basics - Anfänger-Themen 11
K JTable AbstractTableModel Header setzen Java Basics - Anfänger-Themen 6
L Applet: Parameter setzen Java Basics - Anfänger-Themen 12
M Image Metadaten setzen Java Basics - Anfänger-Themen 2
M HttpPut mimeType setzen Java Basics - Anfänger-Themen 2
E Titel und Größe vom JFrame setzen Java Basics - Anfänger-Themen 6
Z Fokus auf anderes Programm setzen Java Basics - Anfänger-Themen 3
S import - Anweisung; Setzen der Classpath Java Basics - Anfänger-Themen 2
N Objectnamen neu setzen? Java Basics - Anfänger-Themen 20
G Verzeiflung bei JDateChooser Datum setzen Java Basics - Anfänger-Themen 3
J Elegante Art mehrere Label mit einem icon zu setzen Java Basics - Anfänger-Themen 13
J JAVA_HOME und path setzen bei windows 7 Java Basics - Anfänger-Themen 5
radiac Datentypen RANDOM-punkt setzen INNERHALB eines BEREICHes Java Basics - Anfänger-Themen 2
D Classpath setzen Java Basics - Anfänger-Themen 4
W Koordinaten mit System.in.read() setzen Java Basics - Anfänger-Themen 2
J jComboBox auf default setzen wie? Java Basics - Anfänger-Themen 3
C Schach(matt) setzen Java Basics - Anfänger-Themen 13
D JFrame Icon setzen? Java Basics - Anfänger-Themen 8
L Lucene Classpath unter linux setzen Java Basics - Anfänger-Themen 8
H Farbe setzen Java Basics - Anfänger-Themen 5
J Klassen richtig in Relation setzen Java Basics - Anfänger-Themen 3
B Classpath setzen - UNTER MAC OS X Java Basics - Anfänger-Themen 2
R jLabel lässt sich nicht public setzen?? Java Basics - Anfänger-Themen 15
S JRadioButton - Wert setzen aus Datenbank Java Basics - Anfänger-Themen 4
N Exception richtig setzen Java Basics - Anfänger-Themen 2
S Schleife und farbwerte setzen Java Basics - Anfänger-Themen 8
S setrgb () setzen von farbwerte Java Basics - Anfänger-Themen 4
R Enum und dann setter Setzen? Java Basics - Anfänger-Themen 44
S Pixel auf Screen setzen Java Basics - Anfänger-Themen 4
J Dateipfade systemunabhängig setzen Java Basics - Anfänger-Themen 3
F JAVA_HOME automatisch setzen? Java Basics - Anfänger-Themen 2
M Offenes JFrame auf visible setzen? Java Basics - Anfänger-Themen 6
schroedi JAVA_HOME setzen unter Debian Java Basics - Anfänger-Themen 8
H Probleme, TableColumn-Breite zu setzen Java Basics - Anfänger-Themen 4
S log4j pfad per umgebungsvariable setzen? Java Basics - Anfänger-Themen 2
L Windows-Umgebungsvariablen mit Java setzen? Java Basics - Anfänger-Themen 11
S BBCodes in einen String setzen Java Basics - Anfänger-Themen 7
G Plugins einbinden und Classpath setzen Java Basics - Anfänger-Themen 4
S bbcodes bei markierten text setzen Java Basics - Anfänger-Themen 2
M Daten in Tabelle setzen. Java Basics - Anfänger-Themen 6
F Scanner an den Zeilenanfang wieder setzen Java Basics - Anfänger-Themen 2
T Checkbox in jtable: boolean wert direkt setzen - wie? Java Basics - Anfänger-Themen 1
G Pfad zu java.exe setzen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben