JAVA究竟有没有【引用传递】的简单探究。


前言

先上结论,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值