Frage 1 :
In Java ist es ja grundsätzlich nicht ohne weiteres möglich mit Referenzen zu arbeiten oder Zeiger zu benutzen.(korrigiert mich wenn ich hier falsch liege)
Zeiger und Referenzen sind ja nichts anderes als dynamische Variablen.
Heißt das, dass wiederum das es in Java KEINE dynamischen Variablen gibt oder wie ist das zu verstehen ? oder sind die hier anders definiert ?
Frage 2:
Klassen so steht is in meinem Skript was ich in der Uni bekommen habe sind Referenztypen.
Was ist mit Referenztypen gemeint ?
Ist damit gemeint das eine Klasse eine Referenz zu den Variablen hat aus denen sie besteht?
Beispiel:
Code:
Person{
Name;
Alter;
}
ist dann Person.Name eine referenz ?
Google hat mir zu den fragen keine Klare antwort gegeben leider.
Danke schonmal im vorraus
Name und Alter sind in deinem Beispiel die Referenzattribute der Klasse Person (Wenn von dieser auch jegliche Zugriffsmodifikatoren etc. fehlen). Meinst du mit dynamischen Variablen, Variablen die sich verändern können?
Wenn ja, dann klappt das mit jeder Variable (außer mit final "betitelte"):
Bsp:
Java:
publicclassPerson{int alter;String name;
name ="herberta";
alter =10;//--> Diese Variablen kannst du in einer Methode verändern Bsp:publicvoidaendern(){
alter =8;
name ="herbert";}}
Ausserdem fehlen bei dir die Datentypen bzw. die Zugriffsmodifikatoren etc.
int a = 3;
a = a +3;
und das man dann a so verändern kann das meine ich nicht mit dynamischen variablen.
In C oder C++ ist eine dynamische Variable als beispiel :
Code:
int a = 3;
int* pa = &a; // & bedeutet hier das man auf die speicheradresse von a zeigt, wobei pa der zeiger hier mit int* als zeiger
//deklariert wird.
print("pa ist:" + pa); //ist jetzt nur ne Pseudoausgabe: Ausgabe : "pa ist 3";
a = 5;
print("pa ist: "pa) // Ausgabe : " pa ist 5";
[...] und sie in Sprachen wie Java oder Eiffel zwar intern vorhanden, aber für den Programmierer vollständig verborgen [...]
2 Sekunden googlen Zeiger (Informatik)
publicclassPerson{String name;// Referenzattributint alter;// ReferenzattributpublicPerson(String name,int alter){this.name = name;//this.name steht für das Referenzattribut, name für den Parameter.this.alter = alter;//this.alter steht für das Referenzattirbut, alter für den Parameter.}}publicclassZweiPersonen{Person alfred;<---Deklarierung des ObjektsPerson.Person hans;publicZweiPersonen(){
alfred =newPerson("Alfred",38);<--Initialisierung des ObjektsPerson.
hans =newPerson("Hans",54);}}
Also erstmal danke die erste Frage haste damit schon genau beantwortet( Hab jetzt nicht einfach nach Zeigern gegoogled sonder immer nach Zeiger Java da kam halt nichts )
Dann noch it den Referenzen: Wie ist das dann im Heap und Stack verwaltet ?
Ist dann beispielsweise alfred.name eine Referenz im Heap die auf die Statische Variable name = Alfred im Stack referenziert ?
Sorry, aber ich kenne mich mit C++ gar nicht aus^^ Da musst du dich an jemand anderen wenden.
Mit alfred.name greifst du auf das Attribut "name" von deinem erzeugten Objekt auf.
Java:
publicclassZweiPersonen{Person alfred;<---Deklarierung des ObjektsPerson.Person hans;publicZweiPersonen(){
alfred =newPerson("Alfred",38);<--Initialisierung des ObjektsPerson.
hans =newPerson("Hans",54);}publicvoidNamenAufSystem(){System.out.println(alfred.name + hans.name);}}
Hier was ich mal schnell gefunden habe (Google doch selbst )
[...]Ein ebenfalls wichtiger Unterschied ist die Garbage Collection. Der Entwickler muss sich keine Gedanken darüber machen, dass Speicher wieder freigegeben wird. Die Garbage Collection übernimmt das für einen. Das klingt zunächst gut und funktioniert auch für kleine Programme wunderbar, aber so einfach kommt man aus der Geschichte leider dann doch nicht raus sobald man etwas schreibt, was ernstzunehmend ist. Der Garbage Collector läuft irgendwann an und versucht Speicher freizugeben. In dem Moment stockt das Java-Programm und das kann durchaus merklich stocken.[...]
[...]Ein Garbage Collector beschränkt sich auf eine gewisse Speichergröße, die beim Programmstart festgelegt wird. [...]
Sollte alles soweit klären oder? Sollte auch klären weshalb man keine Zeiger braucht..:rtfm:
Das hat aber nichts mit dem zu tun was ich meine.
Das was du jetzt mit der Garbage Collection gepostet hat ist nur die allgemeine Verwaltung vom Speicher im Java.
Was ich wissen will ist wie eine Klasse im Speicher Organisiert wird oder ein abstrakter Datentyp.
Frage 1 :
In Java ist es ja grundsätzlich nicht ohne weiteres möglich mit Referenzen zu arbeiten oder Zeiger zu benutzen (korrigiert mich wenn ich hier falsch liege)
Der Heap wird für dynamische allokationen verwendet. Immer wenn du ein neues Objekt erzeugst, wird im Heap Speicher dafür reserviert. Im allgemeinen belegt ein Objekt zusammenhängenden Speicher. Dadrin stehen dann Informationen zum Objekt (wie z.B. Typ) und halt die Attribute. Wobei primitive Typen (int, long, etc) direkt dort gespeichert werden und bei Referenztypen wird eben eine Referenz gespeichert, welche auf ein anderes Objekt im Heap zeigt (oder auf null).
Im Grunde kann man Referenzen schon mit Pointern vergleichen, bloß dass die eben weniger mächtig, aber dafür sicherer sind.
Also ich möchte nur wissen ob die Schlussfolgerung, dass in Java keine Zeiger und Referenzen für den Benutzer zur Verfügung stehen, bedeutet das Java auch keine Dynamischen Variablen hat ( Die sind ja nichts anderes als Zeiger soweit es mir bekannt ist).
@InfectedBytes
Wie sieht dann aber Konkret folgende Klasse im Speicher aus:
Java:
classPerson{// EInfach nur jetzt als stumpfes Beispielint alter;String name;}publicstaticvoid main (){Person herbert=newPerson();
herbert.name ="Herbert"
herbert.alter =30;}
Meine Vermutung wäre so:
Heap: Stack
Person Herbert;
Herbert.name --------------------> String "Herbert"
Herbert.alter ----------------------> int 30;
So wie ich es nämlich von Zitrus verstanden habe werden die Attribute eines Objektes im Stack gespeichert und das Objekt an sich liegt im Heap und Verweist auf die Attribute im Stack. Falsch/Richtig ?
Hoffe nun versteht man was gemeint ist
Also ich möchte nur wissen ob die Schlussfolgerung, dass in Java keine Zeiger und Referenzen für den Benutzer zur Verfügung stehen, bedeutet das Java auch keine Dynamischen Variablen hat ( Die sind ja nichts anderes als Zeiger soweit es mir bekannt ist).
wenn Du mit "dynamische Variablen" die aus der C/C++-Welt bekannten Zeiger meinst, so wie Du sie in #4 benannt hast, die gibt es Java natürlich nicht !!!
Im Heap liegen alle Objekte und auch deren Attribute.
Auf dem Stack wird für jede aufgerufene Methode ein Frame gelegt, welcher lokale Variablen dieser Methode speichert. Diese Variablen sind dann entweder primitive Typen oder eine Referenz, welche in den Heap zeigt.
Dein Beispiel sieht dann ungefähr so aus:
Stack:
Main {
locals: 1
[list of locals]
referenz auf Personen objekt
}
Heap:
String { "Herbert" }
Objekt Person {
referenz auf String
30
}