-
对于基本类型,在方法体内对方法参数进行重新赋值,并不会改变原有变量的值。
-
对于引用类型,在方法体内对方法参数进行重新赋予引用,并不会改变原有变量所持有的引用。
-
方法体内对参数进行运算,不影响原有变量的值。
-
方法体内对参数所指向对象的属性进行运算,将改变原有变量所指向对象的属性值。
在JAVA中变量有以下两种:
-
基本类型变量,包括char、byte、short、int、long、float、double、boolean。
-
引用类型变量,包括类、接口、数组(基本类型数组和对象数组)。
当基本类型的变量被当作参数传递给方法时,JAVA虚拟机所做的工作是把这个值拷贝了一份,然后把拷贝后的值传递到了方法的内部。很明显,在基本类型被作为参数传递给方式时,是值传递,在整个过程中根本没有牵扯到引用这个概念。这也是大家所公认的。对于布尔型变量当然也是如此。
那么当引用型变量被当作参数传递给方法时JAVA虚拟机又是怎样处理的呢?同样,它会拷贝一份这个变量所持有的引用,然后把它传递给JAVA虚拟机为方法创建的局部变量,从而这两个变量指向了同一个对象。有一种说法是当一个对象或引用类型变量被当作参数传递时,也是值传递,这个值就是对象的引用,因此JAVA中只有值传递,没有引用传递。还有一种说法是引用可以看作是对象的别名,当对象被当作参数传递给方法时,传递的是对象的引用,因此是引用传递。这两种观点各有支持者,但是前一种观点被绝大多数人所接受,其中有《Core Java》一书的作者,以及JAVA的创造者James Gosling,而《Thinking in Java》一书的作者Bruce Eckel则站在了中立的立场上。
值传递中的值指的是基本类型的数值,即使对于布尔型,虽然它的表现形式为true和false,但是在栈中,它仍然是以数值形式保存的,即0表示false,其它数值表示true。而引用是我们用来操作对象的工具,它包含了对象在堆中保存地址的信息。即使在被作为参数传递给方法时,实际上传递的是它的拷贝,但那仍是引用。因此,用引用传递来区别与值传递,概念上更加清晰。
-
基本类型和基本类型变量被当作参数传递给方法时,是值传递。在方法实体中,无法给原变量重新赋值,也无法改变它的值。
-
对象和引用型变量被当作参数传递给方法时,在方法实体中,无法给原变量重新赋值,但是可以改变它所指向对象的属性。至于到底它是值传递还是引用传递,这并不重要,重要的是我们要清楚当一个引用被作为参数传递给一个方法时,在这个方法体内会发生什么。
例1:
-
public class ParamTest {
-
-
protected int num = 0;
-
-
-
public void change(int i) {
-
i = 5;
-
}
-
-
-
public void change(ParamTest t) {
-
ParamTest tmp = new ParamTest();
-
tmp.num = 9;
-
t = tmp;
-
}
-
-
-
public void add(int i) {
-
i += 10;
-
}
-
-
-
public void add(ParamTest pt) {
-
pt.num += 20;
-
}
-
-
public static void main(String[] args) {
-
ParamTest t = new ParamTest();
-
-
System.out.println("参数--基本类型");
-
System.out.println("原有的值:" + t.num);
-
-
t.change(t.num);
-
System.out.println("赋值之后:" + t.num);
-
-
t.change(t);
-
System.out.println("运算之后:" + t.num);
-
-
System.out.println();
-
-
t = new ParamTest();
-
System.out.println("参数--引用类型");
-
System.out.println("原有的值:" + t.num);
-
-
t.add(t.num);
-
System.out.println("赋引用后:" + t.num);
-
-
t.add(t);
-
System.out.println("改属性后:" + t.num);
-
}
-
}
这段代码的运行结果如下:
- 参数--基本类型
- 原有的值:0
- 赋值之后:0
- 运算之后:0
- 参数--引用类型
- 原有的值:0
- 赋引用后:0
- 改属性后:20
例2:
-
public class BooleanTest {
-
-
boolean bool = true;
-
-
-
public void change(boolean b) {
-
b = false;
-
}
-
-
-
public void calculate(boolean b) {
-
b = b && false;
-
-
System.out.println("b运算后的值:" + b);
-
}
-
-
public static void main(String[] args) {
-
BooleanTest t = new BooleanTest();
-
-
System.out.println("参数--布尔型");
-
System.out.println("原有的值:" + t.bool);
-
-
t.change(t.bool);
-
System.out.println("赋值之后:" + t.bool);
-
-
-
t.calculate(t.bool);
-
System.out.println("运算之后:" + t.bool);
-
}
-
}
输出结果如下:
- 参数--布尔型
- 原有的值:true
- 赋值之后:true
- b运算后的值:false
- 运算之后:true
分享到:
相关推荐
java 值传递和引用传递的比较区别,包括代码及详解
Java:按值传递还是按引用传递详细解说
不管是按值传递还是按引用传递,都是把栈中的数据备份了一份给参数变量,只不过值类型备份的是具体的数值,而引用类型备份的是内存地址
Java面向对象值传递和引用传递Java面向对象值传递和引用传递Java面向对象值传递和引用传递Java面向对象值传递和引用传递
13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递....
java学习java语言的值传递和引用传递
本人经过长时间收集的最经典、最有说服力、最易懂的关于值传递和引用传递的详解资料~包看包会~发出去真有些不舍得~
这个在Java里面是经常被提起的问题,也有一些争论,似乎最后还有一个所谓的结论...事实上,这很容易让人迷惑,下面先分别看看什么是按值传递,什么是按引用传递,只要能正确理解,至于称作按什么传递就不是个大问题了。
当一个变量为一个参数传入方法内部的时候,会有两种不同的传递方式:值传递和引用传递。 值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值 引用传递的特点:方法内部对传...
Java语言中参数值传递和引用传递比较
Java中的值传递和引用传递的区别.doc
Java的按值传递和按引用传递分析 Java的按值传递和按引用传递分析.pdf
主要介绍了 Java 值传递和引用传递详解及实例代码的相关资料,需要的朋友可以参考下
java中的值传递和引用传递[汇编].pdf
java参数传递时到底是值传递还是引用传递分享.pdf
Java的按值传递和按引用传递分析.rar
java 中没有引用传递,都是值传递的,可以通过传递副本修改对象的,副本交换,并不影响原引用
java参数传递时到底是值传递还是引用传递[归类].pdf
主要介绍了详解java的值传递、地址传递、引用传递的相关资料,需要的朋友可以参考下
我们先看一下值传递和引用传递的概念和区别 值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 引用传递:是指在调用函数时将实际参数的地址直接...