直接斩钉截铁地说Java是值传递的有点不太合适,这里我给出自己的看法。
c语言的按引用传递在C语言中是可以按引用传递的,我们可以在方法中接收外部参数,实参使用&
地址符来表示需要按引用传递,这样我们在方法中就可以通过*
+参数名来修改外部的变量。
代码实例:
#include
void fun(int* a);
int main()
{
int a = 1;
printf("%d\n", a);
fun(&a);
printf("%d\n", a);
return(0);
}
void fun(int* a)
{
*a = 2;
}
运行结果:
1
2
我们可以发现在c语言可以在方法中改变外部的变量值,而在java中是没有*
和&
这种地址引用的语法的。在java的方法中我们只能外部的对象属性或者数组中的元素,而不能直接改变外部变量的引用。
所以从这个角度来看,Java只有值传递没有引用传递。
Java中的值传递在Java中,什么是引用呢?当我Dog dog = new Dog()
的时候,栈中的dog变量指向了堆中的Dog对象,此时局部变量dog就是堆中对象Dog的引用。
在方法的参数我们可以接收Dog类型的变量,也就是说可以按引用传递,严格得说应该是引用的值,因为我们无法在方法中去改变外部的引用,比如下面代码:
public class Dog {
public static void main(String[] args) {
Dog dog = new Dog();
System.out.println("dog " + dog);
fun(dog);
System.out.println("dog " + dog);
}
public static void fun(Dog dog) {
dog = new Dog();
}
}
运行结果
dog Unknown.Dog@6e0be858
dog Unknown.Dog@6e0be858
在执行fun()的时候,参数因为是值传递,会在栈重新创建一个变量形参_dog
来指向堆,在方法中的dog = new Dog();
改变的只是形参的引用,而实参也就是外部的dog变量并没有被改变,因为Java中没有指针的概念,不能像C那样使用&
和&
来通过指针改变实参的引用。
这时候我们把c语言忽略掉,只看Java。在Java的引用是什么呢,栈中变量指向堆中对象。
此时的按值传递就是,传递基本类型变量:
int a = 10;
fun(a);
此时的引用传递就是,传递引用类型变量:
String a = "滕青山";
fun(a);
总结
从跟C语言的按引用传递比较的角度来看,Java只有值传递;
从Java的基本类型变量和引用类型变量的角度来看,Java既可以值传递也可以引用传递。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)