Call by Reference in Java: Einführung in Referenzbezeichner als Argument in Java im Rahmen der Lehre des Programmierens mit der Programmiersprache Java. (call by reference in java call by value variable, Parameter, Argumente, Referenz, Referenzen, Variable ), Lektion, Seite 721515
https://www.purl.org/stefan_ram/pub/java_referenzvariablen_als_argument_de (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Java-Kurs

Referenzvariablen in Java

Aliaseffekte

In der Methode "main" der Klasse "Aliasing" wird eine Referenz auf einen Textspeicher einer Variablen "s" und gleichzeitig auch einer anderen Variablen "t" zugewiesen. Da beide Referenzen dasselbe Objekt  referenzieren, läßt dieses sich dann in dem Gültigkeitsbereich dieser beiden Bezeichner mit jedem der beiden Bezeichner  ansprechen. So wird das Objekt dann unter Verwendung des Bezeichners "t" verändert, aber unter Verwendung des Bezeichners "s" ausgelesen.

Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.StringBuilder s = new java.lang.StringBuilder( "-" );
final java.lang.StringBuilder t = s;
t.setCharAt( 0, 'a' ); java.lang.System.out.print ( s );
t.setCharAt( 0, 'b' ); java.lang.System.out.println( s );
java.lang.System.out.println( s == t ); }}
transcript
ab
true

Das Verwirrende daran kann es sein, daß man bei oberflächlicher Betrachtung vermeint, daß die Variable »s« zwischen den beiden Ausgaben nicht verändert wird und daher die beiden Ausgaben gleich sein müßten. Dieses Beispiel illustriert Anweisungen mit einer versteckten Wirkung, die beim Programmieren manchmal zu beobachten sind: Eine Veränderung eines Zustandes erfolgt durch eine Maßnahme, der man dies zunächst nicht ansieht. Hier hat die Anweisung »t.setCharAt( 0, 'b' );« die versteckte Wirkung der „Veränderung von s“. Die Wirkung ist versteckt, da der Name »s« in der Anweisung selber nicht vorkommt. Solche versteckten Wirkungen lassen sich nicht immer ganz vermeiden, aber sie können Ursachen für fehlerhafte Interpretationen von Programmen sein und damit zu Fehlern führen.

(Unter einem Zustand verstehen wir den zeitlich veränderlichen Teil einer Variablen oder eines Objektes. Eine Wirkung ist die Veränderung eines Zustandes.)

Solche Aliassituationen in einem Block wird man selten bewußt herstellen, weil sie die Situation nur unnötig verkomplizieren. Aliassituationen können aber unbeabsichtigt auftreten, etwa wenn ein Methode zwei Referenzen verarbeiten soll, und beispielsweise von dem einen referenzierten Objekt in das andere kopieren soll. Es könnte dabei aber auch einmal vorkommen, daß beide Referenzen dasselbe Objekt referenzieren. Die Methode sollte sich dann auch in diesem Fall so wie beabsichtigt (wie gewünscht) verhalten. Der Programmierer muß also stets auch an die Möglichkeit denken, daß zwei auf verschiedenen Wegen erhaltene Referenzen einander gleich sein könnten.

Die beiden Abbildungen zum Aliaseffekt machen die Situation noch einmal deutlich.

Situation nach "t.setCharAt( 0, 'a' )"
              Quelltextmodell : Laufzeitmodell       
:  
: .---. 
t =======================>| # -----------------------. 
Bezeichner Bindung : '---' Referenz | 
: Variable | 
: __V__ 
: .-' '-. 
: .' '. 
: / \  
: .---. ; ; 
s =======================>| # ------------->| "a" | 
Bezeichner Bindung : '---' Referenz ; ; 
: Variable \ / 
: '. .' 
: '-._____.-'  
: Objekt

Situation nach "t.setCharAt( 0, 'b' )"
              Quelltextmodell : Laufzeitmodell       
:  
: .---. 
t =======================>| # -----------------------. 
Bezeichner Bindung : '---' Referenz | 
: Variable | 
: __V__ 
: .-' '-. 
: .' '. 
: / \  
: .---. ; ; 
s =======================>| # ------------->| "b" | 
Bezeichner Bindung : '---' Referenz ; ; 
: Variable \ / 
: '. .' 
: '-._____.-'  
: Objekt

Variable eines elementaren Typs
              Quelltextmodell : Laufzeitmodell 



: .---. 
i ==============================>| 2 | 
Bezeichner Bindung : '---' 
: Variable 
: mit Wert 


:

Variable eines Referenztyps
              Quelltextmodell : Laufzeitmodell                 _____ 
: .-' '-. 
: .' '. 
: / \  
: .---. ; ; 
s =======================>| # ------------->| | 
Bezeichner Bindung : '---' Referenz ; ; 
: Variable \ / 
: '. .' 
: '-._____.-'  
: Objekt  
:

Referenzeffekt: Aliaseffekte

Die folgende Beispiele zeigen das oben am Beispiel von »StringBuilder« gezeigte noch einmal am Beispiel der Klasse »java.awt.geom.Point2D.Double«.

Main.java

public class Main

{ public static void main( final java.lang.String[] args )

{ final java.awt.geom.Point2D.Double o0
= new java.awt.geom.Point2D.Double();

final java.awt.geom.Point2D.Double o1
= new java.awt.geom.Point2D.Double();

o0.x = 1; /* Diese Nachricht interpretieren wir als ein Kommando */
o0.y = 2;
o1.x = 3;
o1.y = 4;

java.lang.System.out.println( o0.x ); /* Diese Nachricht interpretieren wir als eine Frage */
java.lang.System.out.println( o0.y );
java.lang.System.out.println( o1.x );
java.lang.System.out.println( o1.y );

java.lang.System.out.println( o0 == o1 ); }}

transcript
1.0
2.0
3.0
4.0
false
Abbildung
                                         Das erste Objekt
o0 (Variable) .---------------.
.--------------. | x: 1 |
| Referenz ---------------------------->| y: 2 |
'--------------' '---------------'


Das zweite Objekt
o1 (Variable) .---------------.
.--------------. | x: 3 |
| Referenz ---------------------------->| y: 4 |
'--------------' '---------------'
Main.java

public class Main

{ public static void main( final java.lang.String[] args )

{ final java.awt.geom.Point2D.Double o0
= new java.awt.geom.Point2D.Double();

final java.awt.geom.Point2D.Double o1
= o0;

o0.x = 1;
o0.y = 2;
o1.x = 3;
o1.y = 4;

java.lang.System.out.println( o0.x );
java.lang.System.out.println( o0.y );
java.lang.System.out.println( o1.x );
java.lang.System.out.println( o1.y );
java.lang.System.out.println( o0 == o1 ); }}

transcript
3.0
4.0
3.0
4.0
true
Abbildung
  o0 (Variable)
.--------------.
| Referenz ------------. Das Objekt
'--------------' | .-------------.
| | |
'---------------->| x: 3 |
.---------------->| y: 4 |
o1 (Variable) | | |
.--------------. | '-------------'
| Referenz ------------'
'--------------'

Man kann sagen, daß o1 ein Alias für o0 ist.

Obwohl wir eine Referenz auf eine Objekt in Variablen abspeichern können, welche jeweils auch einen Namen haben können, hat das Objekt selber keinen eigenen Namen, Objekte sind anonym.

Objekte haben im allgemeinen keine Namen.

?    Ausgabe vorhersagen
Welche Ausgabe erzeugt das folgende Programm?
Main.java

public final class Main
{

public static void main( final java.lang.String[] args )
{ final java.awt.geom.Point2D.Double a = new java.awt.geom.Point2D.Double();
final java.awt.geom.Point2D.Double b = a;
a.x = 1.0;
a.y = 4.0;
b.x = 2.0;
java.lang.System.out.println( a.x );
java.lang.System.out.println( b.y ); }}

Änderungen von Objekten

In der Methode "main" der Klasse "Main" wird durch zweifache Ausgabe des lokalen Bezeichners "s" Text »ab« ausgegeben. Die Variable »s« enthält die ganze Zeit lang dieselbe Referenz, verweist also auf dasselbe Objekt. Zwischen den beiden Ausgabeoperationen wird hier nicht der Inhalt der Variablen »s«, sondern der Zustand des Objektes verändert, der von diesem Inhalte referenziert wird.

Main.java
public class Main 
{ public static void main( final java.lang.String[] args ) 
{ final java.lang.StringBuilder s = new java.lang.StringBuilder( "-" ); 
s.setCharAt( 0, 'a' ); java.lang.System.out.print ( s ); 
s.setCharAt( 0, 'b' ); java.lang.System.out.println( s ); }}

System.out
ab

Die Abbildungen stellen die Situation bei den beiden Ausgabeoperationen bildlich dar. Man erkennt, daß zwar der Zustand des von der Referenz in der Variablen referenzierten Objekts verändert wird, aber sich die Variable selber nicht verändert. Sie zeigt immer auf dasselbe Objekt. Daher konnte die Variable in diesem Programm sogar mit dem Variablenmodifizierer »final« deklariert werden. (Man vergleiche diese Situation mit der Situation, die in dem vorigen Abschnitt „Änderungen von Variablen “ beschrieben wurde.)

Situation nach "s.setCharAt( 0, 'a' )"
              Quelltextmodell : Laufzeitmodell                 _____ 
: .-' '-. 
: .' '. 
: / \  
: .---. ; ; 
s =======================>| # ------------->| "a" | 
Bezeichner Bindung : '---' Referenz ; ; 
: Variable \ / 
: '. .' 
: '-._____.-'  
: Objekt  
:

Situation nach "s.setCharAt( 0, 'b' )"
              Quelltextmodell : Laufzeitmodell                 _____ 
: .-' '-. 
: .' '. 
: / \  
: .---. ; ; 
s =======================>| # ------------->| "b" | 
Bezeichner Bindung : '---' Referenz ; ; 
: Variable \ / 
: '. .' 
: '-._____.-'  
: Objekt  
:

Referenzvariablen und Referenzwerte (Referenzen)

Referenzvariablen  und Referenzwerte  werden oft nicht deutlich unterschieden, indem beide einfach nur als „Referenzen“ bezeichnet werden. Eine „Referenz“ ist aber eigentlich ein Referenzwert  und keine Referenzvariable.

Ein Referenzwert —oder, kurz, eine Referenz —ist eine Angabe, die es ermöglicht, ein bestimmtes Objekt zu erreichen (oder es ist die Nullreferenz).

Eine Referenzvariable  ist eine Speicher, der zu einem Zeitpunkt genau einen Referenzwert enthalten kann, aber im Laufe der Zeit kann sich der enthaltene Referenzwert auch verändern.

Den Unterschied zwischen Referenzvariablen und Referenzwerten  kann man jetzt verstehen, wenn man daran denkt, daß im Abschnitt „Änderungen von Variablen dieselbe  Referenzvariable zwei verschiedene  Referenzwerte enthielt (zu zwei verschiedenen Zeitpunkten). Umgekehrt findet man in dem letzten Abschnitt „Aliaseffekte “ die Situation dargestellt, daß zwei verschiedene  Referenzvariablen denselben  Referenzwert enthalten. (Zum Verständnis dieses Unterschiedes betrachte man noch einmal die Schaubilder dieser beiden Abschnitte.)

Werte ⁺

Wir verstehen unter einem Wert eine Zahl, eine Zeichenfolge, einen Wahrheitswert oder eine Referenz  (statt bisher: ein Objekt).

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram721515 stefan_ram:721515 call by reference in java call by value variable, Parameter, Argumente, Referenz, Referenzen, Variable call by value reference java; call by reference definition java; call by reference in java; call by reference java; call by value call by reference definition; wie kann ich in Java Variable an Methoden uebergeben; Java variable call by reference; Java referenzen übergeben; source, source code,sourcecode, Programmier sprache java, Java Programm Java Programmiersprache Java Sprache Java Programmierung Programmieren in Java, Die Programmiersprache Java Javapgrammierung, Java-Programmierung, Java2, Java1.2, Java1.3, Java1.4, Java1.5, Java 2, Java 1.2, Java 1.3, Java 1.4, Java 1.5, Java 1.6, Java 1.7, Java 1.8, Java 8, Java 1.9, Java 9, Java 1.10, Java 10, Tiger, Dolphin, objektorientierte Programmierung, Java sun, , Softwareentwicklung, Software-Entwicklung, Software Entwicklung, Softwareprogrammierung, Software-Programmierung, Software Programmierung, Softwareherstellung, Software-Herstellung, Software Herstellung, Softwareerstellung, Software-Erstellung, Software Erstellung, Softwareengineering, Software-Engineering, Software Engineering, Softwareenginering, Software-Enginering, Software Enginering, Softwaremethodik, Software-Methodik, Software Methodik, Programmiermethodik, Programmier-Methodik, Programmier Methodik, Softwaredidaktik, Software-Didaktik, Software Didaktik, Methodik des Programmierens, Didaktik des Programmierens, Fachdidaktik des Programmierens, Fach-Didaktik des Programmierens, Programmieren, Programmierung, Computer Science, Informatik, Informatik, Informationspädagogik, Informationspaedagogik, Programmierer, programmieren, Quellcode, Quelltext, Quelle, Quellen, Informatiker, Fachinformatiker, Entwickler, mit Stil, mit Stiel, mit Still, , Einführung, Einfuehrung, Einführungen, Einfuehrungen, eLearning-Modul, e-Learning-Modul, eLearning-Module, e-Learning-Module, Kurs Berlin, Kurse Berlin, Kursus, Vortrag, Vorträge, Vortraege, Lehrgang, Lehrgänge, Lehrgaenge, kostenloses Lehrmaterial, kostenlose Lehrmaterialien, Vorlesung, Vorlesungen, Unterrichtseinheit, Unterrichtseinheiten, kostenloses Unterrichtsmaterial im Internet, kostenlose Unterrichtsmaterialien im Internet, Ausbildung, Ausbildungen, für die Ausbildung, Fortbildung, Fortbildungen, Weiterbildung, Weiterbildungen, Schulung Berlin, Schulungen Berlin, Internetschulung, Webschulung, Kursunterlage, Kursunterlagen, trainer Berlin, Didaktik, Informatikunterricht, Primer, Skript FH, Skripte FH, Skriptum FH, Skripts FH, Script FH, Scripte FH, Scriptum FH, Scripts FH, howto, how-to, how to, Lehrbuch, Buch, Bücher, Buecher, Bericht, Crash Kurs Berlin, Crash-Kurs Berlin, Crashkurs Berlin, Report, Sachtext, Sachtexte, Übung, Übungen, Uebung, Uebungen, course, PbclevtugFgrsnaEnz, lecture note, lecture notes, Tutorial, Tutor, Tutorium, Teacher, Lehrer Berlin, Trainer Berlin, Beratung Berlin, Anleitung zum, Anleitungen zum, Einführung, Einfuehrung, Einführungen, Einfuehrungen, Handbuch für, Handbücher, Handbuecher, Support, Diplomarbeit, Facharbeit, Hausarbeit, Hausarbeiten, Werk, Werke, Text, Übungsblatt, Uebungsblatt, Lösung, Loesung, Lösungen, Loesungen, Auflösung, Aufloesung, Auflösungen, Aufloesungen, Facharbeit, Facharbeiten, Forum, Training, manual, Folie, Folien, Lehrmittel, beratung, Definition von, Allgemeine Erklärung, Allgemeine Erklaerung, Allgemeine Erklärungen, Allgemeine Erklaerung, Allgemeine Erklaerungen, Einfache Erklärung einfach, Einfache Erklaerung einfach, Einfache Erklärungen, Einfache Erklaerung, Einfache Erklaerungen, zum Thema, FAQ, FAQs, Konzept, Lernkurs, Lern-Kurs, Lernkurse, Lern-Kurse, eine kurze Erklärung, Begriff, Begriffe, Erklärung zu Begriffen, begriffbestimmung, begriffbestimmung, Begriffsbestimmung, Begriffserklärung, Begriffserklaerung, Wort, Worterklärung, Worterklaerung, Definition, Beispiel, Beispiele, Bedeutung, Bedeutungen, was bedeutet, Begriffsdefinition, für Anfänger, fuer Anfaenger, für Einsteiger, für Beginner, zum selber Lernen, handout, hand out, web based training, WBT, Net Based Training, NBT, computer based training, CBT, virtual learning environment, virtual university, für die Schule, Seminar, Seminare, Vorgehensweise, Pädagogik, Paedagogik, Akademie, Onlineacademie, Onlineakademie, Wissen, Unterrichtsvorbereitung für das Fach, Unterricht, für Lehrer, für Lehrerinnen, Referat, Referate, Hausaufgabe, Hausaufgaben, Tip, Tipp. Tipps und Tricks, Tips und Tricks, Methode, Methoden, Methodik, Funktion, Funktionsweise, Aufbau, Prinzip, Grundlage, Grundlagen, Internetschulung, Unterlage, Unterlagen, Struktur, Frage, Fragen, Antwort, Antworten, Schulunterricht, zum erlernen, was ist das?, wie?, lerne, Onlineausbildung, Onlinelehrgang, Onlinekurs, Onlinebuch, Webbuch, Academy, Fachhochschule, FH, TFH, Hochschule, Universität, Universitaet, Uni, Schule, Berufsschule, Gymnasium, Erste Schritte mit, Dozent, Dozenten, Zusammenfassung, Übersicht, Term, Fachwort, Fachbegriff, Fachbegriffe, Grundbegriff, Grundbegriffe, Lektion, Lektionen, Bedienungsanleitung, Bedienungsanleitungen, Spezialist, Spezialisten, Coaching, Coach, Fachbuch, technologie, Unterschied zwischen, Unterschiede zwischen, lehren, unterrichten, für das Studium, für Studenten, für Studentinnen, für Studierende, für Schüler, für Schülerinnen, Wie kann ich, Wie kann man, Hilfe, selber, erstellen, Erstellung, Beginner, Online-Seminar, Online-Kurs, Online-Schulung, ich, gebrauchsanweisung, gebrauchsanleitung, Bedienungsanweisung, Einweisung, Kurzinfo, Internet-Kurs, Internet-Kurse, Online-Training, Intensiv, Intensivkurs, Vortragsreihe, Präsentation, Grundzüge, Mitschrift, Mitschriften, Verständnis, verstehen, anwenden, Hintergrundwissen, Hintergrund, Hintergründe, content, Funktionsprinzip, Schritt für Schritt; E-Learning; elearning; online learning; Fernlehre, Fernlehrgang, Fernlehrgänge, Referent, Referenten, Fernkurs, Fernkurse, Fernstudium, Fernschule, Fernuniversität, Fernlehrer, Denken, Qualifizierungsmaßnahme, Qualifizierung, Qualifizierungen, Volkshochschulkurs, Volkshochschulkurse, Internet-Learning-Plattform, Online-Learning-Plattform, E-Learning-Plattform, Internetlearning-Plattform, Onlinelearning-Plattform, Elearning-Plattform, jetzt, Kochbuch, einfach erklärt, Kenntnis, Kenntniss, Kenntnisse, deutsche Hilfe, lernen und verstehen; blended learning; courseware, Profi, Profis, professionell, professionelle, professionelles, profesionell, profesionelle, profesionelles, professionel, gekonnt, für Könner, Grundkurs, Leistungskurs, Aufbaukurs, Lehrtext, Lehrtexte, Fachtext, Fachtexte, Ausarbeitung, distance learning, Online Seminar, distance education, Online Tutorium, Online Tutorien, technology-based learning, Computer based learning, CBL, Internet Based learning, IBL, Web based learning, WBL, online-learning, OL, online-training, OT, CAI, Computer Assisted Instruction, CUU, Computerunterstützter Unterricht, Computer-unterstützter Unterricht, Know how, Grundkenntnis, Grundkenntnisse, Kompetenz, Schulungsunterlagen, Insiderwissen, Rat, Lehrerinnen und Lehrer, ABC, Überblick, Arbeitsblatt, Sekundarstufe, Oberstufe, Material, Materialien, Unterrichtsentwurf, Unterrichtsentwürfe, Lerntip, Lerntips, Lerntipp, Lerntipps, ebook, schnell lernen, Lerner, Lernender, Lernende Erwachsenenbildung, Frage und Antwort, Selbststudium, Selbstudium, Umschulung, , kostenlos, kostenlose, kostenloses, kosten los, kosten lose, kosten loses, gratis, free, frei, freie, freies, privat, private, privates, homepage, home-page, home page, website, web site, webpage, web-page, web page, webpages, web-pages, web pages, webseite, Web-Seite, Webseite, Webseiten, Web-Artikel, Web Artikel, online, on-line, on line, download downloaden, down load, or, deutsch, deutsche, deutsches, deutscher, Deutschland, deutschsprachig, deutschsprachige, deutschsprachiges, german, germany, and, uebersicht, Uerbersicht, uebersichten, Uebersichten, Übersicht, übersicht, Übersichten, übersichten, Uebersicht, uebersicht, Uebersichten, uebersichten, Info, Infos zu, Information über, ueber, Informationen über, Auskunft, Auskünfte, Auskuenfte, Dienst, PbclevtugFgrsnaEnz, Angebot, Angebote, Anbieter, server, für, fuer, in, an, keyword, keywords, key word, keywords, internet, internets, net, network, net work, networks, net works, web, www, world wide web, Theorie, Praxis, Anwendung, DV, IT, glossar, fachwörterbuch it-glossar, computer lexikon, Computerlexikon, Computer-Lexikon, Lexikon, computer lexicon, Computerlexicon, Computer-Lexicon, Lexicon, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 was ist ein, was ist das, was sind, definiere, definition, define, Inhalt, html, xhtml, free im netz, PDF Text, digital, digitale, binär, binäre, elektronisch, elektronische, fachbegriff, fachbegriffe, konzept, Begriff, allgemein, allgemeine, allgemeines, Technik, Datentechnik, Digitaltechnik, Binätechnik, online lesen; , Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd721515, slrprddef721515, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/java_referenzvariablen_als_argument_de