2 reine Verständnisfragen

Jesfreric

Aktives Mitglied
Liebe Community

Ich hätte einmal zwei grundlegende Fragen:

1. Gehe ich recht in der Annahme, dass deklarierte Variablen in einer Klasse nicht einfach so durch eine andere genutzt werden können.
Z.B. deklariere ich in Klasse A einen Integer x und in Klasse B auch einen Integer x. Ich muss keine Angst haben, dass die beiden sich beeinflussen oder?


2. Nehmen wir einmal an, ich erzeuge in meiner Hauptmethode ein Objekt "OA_1" der Klasse A (extends JPanel). Im Konstruktor der Klasse A erzeuge ich wiederum ein Objekt "OB_1" der Klasse B.
Wenn ich nun im Verlaufe meines Codes das Objekt OA_1 lösche (über .remove( OA_1) ), bleibt dann das Objekt OB_1 noch im Speicher? Oder wird es automatisch mit OA_1 gelöscht?
Ich frage deshalb,...Mein Code ist so ausgelegt, dass Objekt OA_1 zu bestimmten Zeitpunkten erstellt, gelöscht und wieder erstellt wird. Leider trägt das Objekt immer den Namen OA_1. In OA_1 wird immer ein Objekt mit dem Namen OB_1 erstellt. Ich denke das birgt dann eine gewisse Gefahr in sich, weil OB_1 ja schon exisiert und deswegen schon bestimmte Variablen in OB_1 belegt sind. Wird OB_1 dann sozusagen einfach weiterverwendet oder tatsächlich komplett neu erstellt? Falls ersteres sollte ich evtl. eine „reset()“ Methode schreiben, die vor dem Löschen von OA_1 das Objekt OB_1 komplett zurücksetzt.

Viele Grüße
Richi
 

xyss

Aktives Mitglied
1. Ja. Wenn nun allerdings die eine Klasse von der anderen erbt (extends) musst du aber vorsichtig sein.
Generell sollte man immer mit modifiern arbeiten, also mit private, protected, public.

2. Ich nehme mal an, mit .remove(OA_1) meinst du die remove Methode von z.B. eines JFrame? Diese löscht das Objekt nicht!
Ein Objekt wird durch den GarbageCollector allerdings automatisch gelöscht, wenn keine Referenz mehr darauf vorhanden ist. Und zu deiner Frage, ob OB_1 dann auch gelöscht wird. Wenn OA_1 gelöscht wird, weil es nirgends mehr "verwendet" wird, impliziert das ja auch, dass die Referenz auf OB_1 in OA_1 ebenfalls nirgends mehr verwendet wird, dementsprechend ebenfalls gelöscht wird.

Beispiel:
Java:
public class test(){
	private JPanel OA_1;
	
	public test(){
		//Erstelle Frame
		JFrame f = new JFrame();  
		
		//Erstelle OA_1 Panel
		OA_1 = new JPanel();
		
		//Füge das Panel dem Frame hinzu
		f.add(OA_1);
		
		//Entferne das Panel wieder vom Frame
		f.remove(OA_1);
		
		//Das Panel exisitert noch immer, da OA_1 noch immer darauf "zeigt", ist aber nicht mehr an das Frame gebunden!
	}

}
 

Jesfreric

Aktives Mitglied
Hi

Danke für deine Antworten.
Das hieße dann also auch, dass wenn ich das Objekt OA_1 neu erstelle und eine neue Referenz zu OB_1 erstellt wird (Referenz besitzt dann aber den gleichen Namen wie vorher), dass Objekt OB_1 auch neu erstellt und nicht das alte verwendet wird (weil ja gleiche Referenz)?

Viele Grüße
Richi
 

Joose

Top Contributor
Du hast glaube ich noch ein Problem beim Grundverständnis von OOP.

Die Benennung einer lokalen Variable oder eines Klassenattributes hat nichts mit der Referenz an sich zu tun!
Eine "gute" Benennung soll nur beim Programmieren helfen.

Java:
public class Fahrzeug {
   private int raeder; // Objektattribut/Instanzattribut: kann je Objekt/Instanz dieser Klasse einen anderen Wert haben

   public Fahrzeug(int raeder) {
      this.raeder = raeder;
   }

   public int getRaeder() {
      return raeder;
   }
}

......

Fahrzeug motorrad = new Fahrzeug(2);
Fahrzeug einrad = new Fahrzeug(1);
Fahrzeug auto = new Fahrzeug(4);

System.out.println(motorrad.getRaeder()); // Ausgabe: 2
System.out.println(einrad .getRaeder()); // Ausgabe: 1
System.out.println(auto .getRaeder()); // Ausgabe: 4

Jedes Objekt der Klasse Fahrzeug hat nun zwar ein Attribut, welches den Namen "raeder" trägt.
Aber trotzdem ist der Wert für jedes Objekt anders.

Wenn du nun statt dem primitiven Datentyp "int" ein komplexes Objekt nimmst (in deinem Fall ein Objekt der Klasse OB_1) funktioniert das genauso.

Zu deiner Frage 2: Ein Objekt bleibt solange im Speicher solange eine Referenz auf diese Objekt existiert.
 

Jesfreric

Aktives Mitglied
Danke für eure Antworten.
Ich habe mir sozusagen folgende Gedanken gemacht (der Syntax stimmt jetzt natürlich nicht):
Klasse A soll einfach classA sein und Klasse B classB:

classB{
Integer x = new Integer( 0 )
Integer y = new Integer( 0 )

.....
SKRIPT in dem x und y verändert werden
.....
}


classA{
classB CB_1 = new classB();
.......
SKRIPT
.....
}

pulic static main...{

classA CA_1 = new classA();

....
SKRIPT
.......

CA_1 wird gelöscht

......
SKRIPT
......

classA CA_1 = new classA();

}


Durch das Löschen von CA_1 wird zwar alle Referenz zu CB_1 gelöscht (und damit ja eigentlich auch dessen Klassenvariablen), aber seit ihr sicher, dass wenn ich eben CA_1 wieder erstelle (und somit CB_1; und alle besitzen noch den gleichen Namen) dass keinerlei Variablen von CB_1 noch definiert sind?

Ich schreibe derzeit ein Programm, dass diese Vorgehensweise (s.o. ) meiner Meinung nach notwendig macht und ich suche gerade den Fehler, warum mein Programm super funktioniert und nach einer Weile Arbeiten plötzlich nur noch Mist macht...

Viele Grüße
Richi
 

Joose

Top Contributor
Durch das Löschen von CA_1 wird zwar alle Referenz zu CB_1 gelöscht

Somit wird auch das Objekt der "classB" gelöscht.

(und damit ja eigentlich auch dessen Klassenvariablen), aber seit ihr sicher, dass wenn ich eben CA_1 wieder erstelle (und somit CB_1; und alle besitzen noch den gleichen Namen) dass keinerlei Variablen von CB_1 noch definiert sind?

Das hat mit dem Namen nichts zu tun! Der Name soll dir als Programmierer nur helfen zu wissen um was es sich handelt.

Ja es wird ein neues Objekt der Klasse "classB" erstellt. In diesem Objekt sind die Attribute nur soweit initialisiert wie es der Konstruktor macht.

Ich schreibe derzeit ein Programm, dass diese Vorgehensweise (s.o. ) meiner Meinung nach notwendig macht und ich suche gerade den Fehler, warum mein Programm super funktioniert und nach einer Weile Arbeiten plötzlich nur noch Mist macht...

Dann wäre es praktischer einen Thread mit dem eigentlichen Problem zu erstellen ;)
 

Jesfreric

Aktives Mitglied
Und zu deinem Beispiel...soweit habe ich es verstanden.

Aber nun stell dir vor in deiner Fahrzeugklasse würde ein weiteres Objekt "Wiet" einer zweiten Klasse "WoIstEineTankstelle" erzeugt. Und für das Objekt Auto wurde in der Klasse Fahrzeug dem Objekt "Wiet" der Wert "München" in der Klasse "WoIstEineTankstelle" zugefügt.
Jetzt löschst du das Objekt "Auto" (und somit ja eigentlich auch alles weitere). Aber was wäre, wenn ich kurze Zeit später wieder ein Objekt "Auto" der Klasse Fahrzeug erstelle. Denkt ihr nicht, dass im Speicher irgendwo noch hinterlegt ist, dass das Objekt Auto in der Fahrzeugklasse dem Objekt Wiet der Klasse "WoIstEineTankstelle" den Wert München zugefügt hatte? Wenn ich ein neues Objekt der Klasse Fahrzeug erzeuge, dann kann ich mir gut vorstellen, dass alles passt,...habe nur Angst, dass Java hier eine Art "Gedächtnis" hat und nicht jede überflüssig gewordene Info sofort verwirft.
 

Joose

Top Contributor
Nein Java hat hier kein Gedächtnis! Wenn ein Objekt nicht mehr referenziert wird, dann räumt der GC es auf.
Wann er es aufräumt bleibt allerdings dem GC überlassen. Also ja es könnte noch im Speicher liegen, aber es ist nicht möglich hier nochmals die Referenz dazu zu bekommen.
 

Jesfreric

Aktives Mitglied
Ok...dann stellt sich für mich natürlich die Fragen...lösche ich die Referenz auf das Objekt wirklich?=)
Wenn ich dem Hauptpanel (e.g. "Holder") in meiner Hauptmethode das Objekt "SeqViewer_1" einer Klasse (extends JPanel) hinzufüge und dann im Verlaufe des Skripts Holder.remove( SeqViewer_1 ) ausführe, sollte das Objekt "SeqViewer_1" sowie alles was durch dieses Objekt gebildet wurde ins Java-Nirvana gehen oder?
 

Joose

Top Contributor
Wenn ich dem Hauptpanel (e.g. "Holder") in meiner Hauptmethode das Objekt "SeqViewer_1" einer Klasse (extends JPanel) hinzufüge und dann im Verlaufe des Skripts Holder.remove( SeqViewer_1 ) ausführe

Ja wenn du das Objekt erstellst und nur als Komponente dem Hauptpanel (Holder) hinzufügst und später wieder entfernst wird dieses Objekt vom GC augeräumt. (Unter Beachtung das es natürlich sonst nirgends referenziert wird)

, sollte das Objekt "SeqViewer_1" sowie alles was durch dieses Objekt gebildet wurde ins Java-Nirvana gehen oder?

Was heißt "alles was durch dieses Objekt gebildet wurde"?
Wenn du deinem Objekt "SeqViewer_1" per Setter eine Referenz auf ein anderes Objekt gibst dann wird dieses andere Objekt auch nur dann zerstört wenn es von sonst keinen Element referenziert wird.

Wie gesagt mit etwas Code und einer konkreten Fragen zu deinem konkreten Problem geht es vielleicht einfacher.
 

Ähnliche Java Themen

Neue Themen


Oben