Java传参都是传引用变量的副本

  最近做练习时碰到一个问题,Java到底是怎样传参的,经过查资料与实验,我发现Java传参都是传引用变量的副本值。

1 Java中的引用变量

  1.1 字面值引用变量:即基本数据类型的引用变量 ,如 int b = 1 , b就是字面值引用变量。
  多个字面值引用变量也可以指向同一字面值,其中一个引用修改字面值,不会影响另一个引用字面值。
Java传参都是传引用变量的副本 Java传参都是传引用变量的副本

 

  1.2 对象引用变量:即普通java对象的引用变量 ,如 String a = "abc" , Object b = new Object,a、b就是对象引用变量。
  Java 是不能直接操作对象的,只能通过“对象引用的操作”来操作对象。而对象的引用的表示就是对象变量。可以多个对象引用变量指向同一个对象。
  (1)对于普通对象
  其中一个引用修改对象值,也会影响另一个引用的对象值。如下图:
Java传参都是传引用变量的副本 Java传参都是传引用变量的副本

  而如果其中一个引用改变指向的值,另一个引用不改变。如下图:

Java传参都是传引用变量的副本

  (2)对于String类或者包装类对象:
  String类和包装类如Interger、Character类对象的值,类似于基本数据类型的值,是存放在栈中的,不可改变的。
  比如String类的源码,其值value和其本省都是final的,一旦赋值就不可改变。
Java传参都是传引用变量的副本

  故引用并不能修改对象值,如果其中一个引用“修改对象值”,它只是修改其指向的对象,另一个引用不改变。

Java传参都是传引用变量的副本Java传参都是传引用变量的副本

2 实验验证

class Test {
int intInObj;
String strInObj;
Integer integerInObj; public Test(int intInObj, String strInObj, Integer integerInObj){
this.intInObj = intInObj;
this.strInObj = strInObj;
this.integerInObj = integerInObj;
}
} public class SendValue{
public static void main(String[] args) {
// 测试1:传int
int testInt = 1;
SendValue.change(testInt);
System.out.println(testInt); // 测试2:传String
String testString = "1";
SendValue.change(testString);
System.out.println(testString); // 测试3:传Integer
Integer testInteger = 1;
SendValue.change(testInteger);
System.out.println(testInteger); // 测试4:传对象
Test testObject = new Test(1, "1", 1);
SendValue.change(testObject); // 形参修改原对象内的值
System.out.println(testObject.intInObj);
System.out.println(testObject.strInObj);
System.out.println(testObject.integerInObj); // 测试5:传对象
SendValue.changeObject(testObject); // 形参改变指向的对象
System.out.println(testObject.intInObj);
System.out.println(testObject.strInObj);
System.out.println(testObject.integerInObj);
} public static void change(int i) {
i = 10;
} public static void change(String str) {
str = "10";
} public static void change(Integer i) {
i = 10;
} public static void change(Test test) {
test.intInObj = 10;
test.strInObj = "10";
test.integerInObj = 10;
} public static void changeObject(Test test) {
test = new Test(100, "100", 100);
}
}

获得结果如下:

Java传参都是传引用变量的副本

  画图解释测试4和测试5:

Java传参都是传引用变量的副本Java传参都是传引用变量的副本

Java传参都是传引用变量的副本

  
上一篇:js:简单的拖动效果


下一篇:使用jquery实现简单的拖动效果,分享源码