Heim >Java >javaLernprogramm >Analysieren Sie das Konzept der Referenztypen in Java
1. Was ist ein Referenztyp?
Ein Referenztyp zeigt auf ein Objekt, nicht auf einen primitiven Wert. Die Variable, die auf das Objekt zeigt, ist eine Referenzvariable.
In Java sind alle anderen Typen außer Basisdatentypen Referenzdatentypen. Die von Ihnen definierten Klassen sind alle Referenztypen und können wie Basistypen verwendet werden.
Beispiele sind wie folgt:
public class MyDate { private int day = 8; private int month = 8; private int year = 2008; private MyDate(int day, int month, int year){...} public void print(){...} } public class TestMyDate { public static void main(String args[]) { //这个today变量就是一个引用类型的变量 MyDate today = new MyDate(23, 7, 2008); } }
2. Zuweisung von Referenztypen
Verwenden Sie in der Programmiersprache Java einen Typ einer Klasse Die deklarierte Variable wird als Referenztyp bezeichnet, da sie auf einen nicht-primitiven Typ verweist, was wichtige Auswirkungen auf die Zuweisung hat. Der folgende Code:
int x = 7; int y = x; String s = "Hello"; String t = s;
Es werden vier Variablen erstellt: zwei primitive Typen int und zwei Referenztypen String. Der Wert von x ist 7, und dieser Wert wird auf y kopiert; x und y sind zwei unabhängige Variablen und weitere Änderungen in einer der beiden haben keine Auswirkung auf die andere. Für die Variablen s und t existiert nur ein String-Objekt, das den Text „Hallo“ enthält, und sowohl s als auch t verweisen auf dieses einzelne Objekt.
Wenn die Variable t als t="World" neu definiert wird, wird ein neues Objekt World erstellt und t verweist auf dieses Objekt.
3. Der Unterschied zwischen Wertübergabe und Referenzübergabe
1) Wertübergabe
bedeutet, dass beim Aufruf der Methode die übergebenen Parameter als Kopie des Werts übergeben werden. Ein Beispiel lautet wie folgt:
public class TempTest { private void test1(int a) { // 做点事情 a++; } public static void main(String args[]) { TempTest t = new TempTest(); int a = 3; t.test1(a);//这里传递的参数a就是按值传递。 System.out.printIn("main方法中的a===" + a); } }
Das wichtige Merkmal der Wertübergabe: Was übergeben wird, ist eine Kopie des Werts, was bedeutet, dass sie nach der Übergabe irrelevant sind. A in Zeile 9 und a in Zeile 2 sind zwei Variablen. Wenn der Wert von a in Zeile 2 geändert wird, bleibt der Wert von a in Zeile 9 unverändert, sodass das gedruckte Ergebnis 3 ist.
Das a in der Methode main ist 3
Das a in der Methode test1 ist 4
Wir nennen das a in der 9. Zeile einen tatsächlichen Parameter und das a in der 2. Zeile einen formalen Parameter für Basic Daten Änderungen des Typs und der formalen Parameterdaten haben keinen Einfluss auf die eigentlichen Parameterdaten.
2) Übergabe per Referenz
bedeutet, dass beim Aufruf der Methode die übergebenen Parameter per Referenz übergeben werden. Dabei handelt es sich tatsächlich um die Adresse der Referenz, bei der es sich um den Speicher handelt Leerzeichen, das der Variablenadresse entspricht.
Beispiele sind wie folgt:
public class TempTest { private void test1(A a) { a.age = 20; System.out.printIn("test1方法中的age="+a.age); } public static void main(String args[]) { TempTest t = new TempTest(); A a = new A(); a.age = 10; t.test1(a);// 这里传递的参数a就是按引用传递 System.out.printIn("main方法中的age="+a.age); } } classA { public int age = 0; }
Die laufenden Ergebnisse sind wie folgt: Alter = 20 in der Test1-Methode Alter = 20 in der Hauptmethode
Wichtige Merkmale der Referenzübergabe :
Die Übergabe ist eine Referenz auf den Wert, was bedeutet, dass sowohl vor als auch nach der Übergabe auf dieselbe Referenz (dh denselben Speicherplatz) verwiesen wird.
Wenn Sie den Prozess der Referenzübergabe richtig verstehen möchten, müssen Sie lernen, den Prozess der Speicherzuweisung zu verstehen. Das Speicherzuweisungsdiagramm kann uns helfen, diesen Prozess zu verstehen.
Verwenden Sie das obige Beispiel zur Analyse:
(1) Starten Sie die Ausführung, führen Sie Zeile 8 aus, erstellen Sie eine Instanz von A. Das Speicherzuordnungsdiagramm lautet wie folgt:
a in der Hauptmethode
(2), führen Sie Zeile 9 aus und ändern Sie den Alterswert in der A-Instanz. Das Speicherzuordnungsdiagramm lautet wie folgt:
a in der Hauptmethode
(3) Die Ausführung von Zeile 10 besteht darin, die von der Variable a in der Hauptmethode referenzierte Speicherplatzadresse per Referenz an die Variable a in der Methode test1 zu übergeben. Bitte beachten Sie: Diese beiden a-Variablen sind völlig unterschiedlich. Lassen Sie sich nicht vom gleichen Namen täuschen, sie verweisen jedoch auf dieselbe A-Instanz. Das Speicherzuordnungsdiagramm lautet wie folgt:
(4), führen Sie Zeile 3 aus ist die test1-Methode. Die Variable a zeigt auf das Alter der A-Instanz für die Zuweisung. Nach Abschluss wird das neue Speicherdiagramm wie folgt gebildet:
此时A实例的age值的变化是由test1方法引起的。
(5)、运行第4行,根据此时的内存示意图,输出test1方法中的age=20
(6)、运行第11行,根据此时的内存示意图,输出main方法中的age=20
3)对上述例子的改变
理解了上面的例子,可能有人会问,那么能不能让按照引用传递的值,相互不影响呢?就是test1方法里面的修改不影响到main方法里面的呢?
方法是在test1方法里面新new一个实例就可以了。改变成下面的例子,其中第3行为新加的:
public class TempTest { private void test1(A a) { a = new A();// 新加的一行 a.age = 20; System.out.printIn("test1方法中的age="+a.age); } public static void main(String args[]) { TempTest t = new TempTest(); A a = new A(); a.age = 10; t.test1(a);// 这里传递的参数a就是按引用传递 System.out.printIn("main方法中的age="+a.age); } } classA { public int age = 0; }
运行结果为:test1方法中的age=20 main方法中的age=10
实现了按引用传递的值传递前与传递后互不影响,还是使用内存示意图来理解一下:
(1)、运行开始,运行第9行,创建了一个A实例,内存分配示意图如下:
(2)、运行第10行,是修改A实例里面的age的值,运行后内存分配示意图如下:
(3)、运行第11行,是把mian方法中的变量a所引用的内存地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。
(4)、运行第3行,为test1方法中的变量a重新生成了新的A实例,完成后形成的新的内存示意图如下:
(5)、运行第4行,为test1方法中的变量a指向的新的A实例的age进行赋值,完成后形成新的内存示意图如下:
注意:这个时候test1方法中的变量a的age被改变,而main方法中的a变量是没有改变的。
(6)、运行第5行,根据此时的内存示意图,输出test1方法中的age=20
(7)、运行第12行,根据此时的内存示意图,输出main方法中的age=10
说明:
(1)、“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
(2)、在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义的字符串方式:String str = "Java快车";
相关文章:
Das obige ist der detaillierte Inhalt vonAnalysieren Sie das Konzept der Referenztypen in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!