前言
先上结论,JAVA只有【值传递】。
我们知道,C++有类的概念,同时也有【值传递】和【引用传递】的概念。如果JAVA 在传递引用类型对象时,能与C++使用引用类型传递数据时得到的结果一致,就说明JAVA有【引用传递】反之则没有。
一、用什么例子实验?
当然是用最简单的两个变量交换来进行实验。
二、实验部分
1.C++代码
代码如下:
#include <iostream>
using namespace std;
class Student
{
public: int age;
};
//使用引用类型
void fun(Student &a,Student &b){
Student T;
T=a;
a=b;
b=T;
cout<<"a.age: "<<a.age<<" b.age: "<<b.age<<endl;
}
int main(int argc, char** argv) {
Student mainA,mainB;
mainA.age=10;
mainB.age=15;
cout<<"mainA.age: "<<mainA.age<<" mainB.age: "<<mainB.age<<endl;
fun(mainA,mainB);
cout<<"mainA.age: "<<mainA.age<<" mainB.age: "<<mainB.age<<endl;
return 0;
}
结果如下,对a和b进行交换后,通过观察age的变化我们发现mainA和mainB也进行了交换。
mainA.age: 10 mainB.age: 15
a.age: 15 b.age: 10
mainA.age: 15 mainB.age: 10
2.JAVA代码
代码如下:
package org.example;
public class Student {
public int age;
public static void fun(Student a,Student b){
Student T;
T=a;
a=b;
b=T;
System.out.println("a.age: "+a.age+" b.age: "+b.age);
}
public static void main(String[] args) {
Student mainA=new Student();
mainA.age=10;
Student mainB=new Student();
mainB.age=15;
System.out.println("mainA.age: "+mainA.age+" mainB.age: "+mainB.age);
fun(mainA,mainB);
System.out.println("mainA.age: "+mainA.age+" mainB.age: "+mainB.age);
}
}
结果如下,对a和b进行交换后,通过观察age的变化我们发现mainA和mainB并没有发生交换。
mainA.age: 10 mainB.age: 15
a.age: 15 b.age: 10
mainA.age: 10 mainB.age: 15
3.对C++代码进行补充(不采用引用方式)
代码如下:
#include <iostream>
using namespace std;
class Student
{
public: int age;
};
void fun(Student a,Student b){
Student T;
T=a;
a=b;
b=T;
cout<<"a.age: "<<a.age<<" b.age: "<<b.age<<endl;
}
int main(int argc, char** argv) {
Student mainA,mainB;
mainA.age=10;
mainB.age=15;
cout<<"mainA.age: "<<mainA.age<<" mainB.age: "<<mainB.age<<endl;
fun(mainA,mainB);
cout<<"mainA.age: "<<mainA.age<<" mainB.age: "<<mainB.age<<endl;
return 0;
}
结果如下,我们发现,得到的结果与JAVA代码一致。
mainA.age: 10 mainB.age: 15
a.age: 15 b.age: 10
mainA.age: 10 mainB.age: 15
总结
引用是什么?是变量的别名,当fun方法内变量a与变量b发生交换时,主函数内的mainA与manB也要发生交换,而JAVA的mainA与manB并未发生交换所以JAVA并不是【引用传递】。 简单理解:当执行Student student=new Student();后。new Student()相当于建立了一个Student结构体变量,而Student student相当于建立了一个结构体指针,整个表达式的含义就是将Student结构体变量地址赋值给student。所以当执行Student T;T=a;a=b;b=T;时仅仅只是交换了结构体变量指针T,a,b所保存的地址。如果有写的不对的地方还请指正
参考
C++中的指针与引用 作者:吴秦(Tyler)
天真,居然还有人认为java的参数传递方式是引用传递 作者:流星007
The Java™ Tutorials