Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hab ich dass so richtig erklärt (Objekte und Referenzen)?
public class Klasse {
public static Schüler xxx (Schüler q) {
q.alter = q.alter+5;
return q;
}
public static void main(String[]args) {
Schüler eins = new Schüler("Max",18);
Schüler zwei = xxx(new Schüler("Hans",20));
}
}
Ich hätte mal eine Frage zum Verständnis, ich weiss dass das Programm keinen Sinn macht, aber ich hab es einfach mal für diese Erklärung geschrieben.
In der Zeile 13 hab ich die Variable "zwei" vom Typ "Schüler", ich ruf dann die Methode "xxx" auf
und übergeb dann an die Methode "xxx" ein neues Schüler Objekt, in der Methode "xxx" verweist dann "q" auf das Objekt(welches ich übergeben hab), und deshalb kann ich mit "q."auf das Attribut "alter" von dem Objekt zugreifen. in der Zeile 7 return ich dann die Referenz/Verweis auf das Objekt(nicht das Objekt selbst)
die Variable "zwei" verweist dann ebenfalls auf dieses Objekt, und so kann ich mit "zwei." z.B den Namen ändern.
Stimmt diese Erklärung oder hab ich irgendwas falsch verstanden ?
Sofern die Klasse "Schüler" den direkten Zugriff auf ihre Instanzvariablen erlaubt (sie also nicht beispielsweise "private" sind), dann stimmt die Erklärung soweit.
Im normalen Sprachgebrauch - vor allem wenn es um Kommunikation und Datentransfer geht - ist fast immer die Referenz gemeint, wenn vom Objekt gesprochen wird.
Das "Objekt selbst" wird nämlich niemals irgendwo übergeben (lassen wir mal Datenübertragung per Serialisierung usw. außen vor).
Wenn du sagst: "Die Methode liefert einen String", dann ist das falsch. Der String wird irgendwo im Speicher erstellt, die Methode liefert die Referenz darauf. Trotzdem wirst du niemanden finden, der freiwillig "Die Methode liefert die Referenz auf einen String" sagt.
Ebenso speichert ein Array von Strings gar keine Strings. Diese liegen irgendwo im Speicher, im Array sind lediglich die Adressen davon hinterlegt.
In Java übergibst und lieferst du grundsätzlich immer Werte. Diese können simple Zahlen (oder andere primitive Datentypen) sein, oder eben die Referenz, also der Adressbereich, in dem ein Objekt gespeichert ist.
Man muss dabei bedenken, dass Java das Prinzip “Call by Value” implementiert. Es werden also immer Kopien der Werte übergeben. Auch so eine Referenz ist in Java ein Wert, dessen Kopie an eine Methode übergeben wird.
Von der Erklärung könnte man daraus schließen, dass Java Call by Reference umsetzt. Ist es aber nicht. Das hat einige Implikationen, die man sich anschauen könnte.
Man muss dabei bedenken, dass Java das Prinzip “Call by Value” implementiert. Es werden also immer Kopien der Werte übergeben. Auch so eine Referenz ist in Java ein Wert, dessen Kopie an eine Methode übergeben wird.
Von der Erklärung könnte man daraus schließen, dass Java Call by Reference umsetzt. Ist es aber nicht. Das hat einige Implikationen, die man sich anschauen könnte.
Das ist fuer Anfaenger komplett irrelevant und verwirrt nur. Klar ist es technisch gesehen richtig dass Java Call by Value mit Pointern macht, aber fuer einen Anfaenger ist es komplett irrelevant (nicht zuletzt deswegen weil es ein Implementierungsdetail der JVM ist...glaube ich, Konrad darf mir da gerne wieder die JLS vorhalten) wenn man erklaert wie der Ablauf der Programmlogik ist. Das einzige wichtige Verhalten auf Hoehe von Java selbst ist das Objekte immer als Referenz auf diese Objekte selbst uebergeben werden und du immer nur ein Objekt hast egal wie oft (und an wen oder was) du es uebergibst. Von dem her ist die Erklaerung richtig.
Ich halte dieses Call by Value auch für Anfänger für sehr wichtig. Ob man die Begriffe nun kennt oder nicht ist egal. Aber wichtig ist halt das Verständnis, dass da nur ein Wert kopiert wird. Aber Du hast Recht, dass es im Kontext dieses Threads auch in meinen Augen eher irrelevant ist (Und darauf beziehst Du Dich und daher bin ich da voll und ganz bei Dir Robert!)