对于JAVA中passed by reference & passed by value

虽然还是个在校学生,但是不管怎么说编程也有几个年头了。虽然JAVA学习的时间不长,但也有3/4个年头了。但是最近却被传引用还是传值的问题弄的困惑不已。先看下面的例子:

public void badSwap(int var1, int var2)
{
int temp = var1;
var1 = var2;
var2 = temp;
}



public void tricky(Point arg1, Point arg2)
{
arg1.x = 100;
arg1.y = 100;
Point temp = arg1;
arg1 = arg2;
arg2 = temp;
}
public static void main(String [] args)
{
Point pnt1 = new Point(0,0);
Point pnt2 = new Point(0,0);
System.out.println("X: " + pnt1.x + " Y: " +pnt1.y);
System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
System.out.println(" ");
tricky(pnt1,pnt2);
System.out.println("X: " + pnt1.x + " Y:" + pnt1.y);
System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
}

运行结果如下

X: 0 Y: 0
X: 0 Y: 0
X: 100 Y: 100
X: 0 Y: 0

这样的结果着实让我很费解。
在查询了站内站外,国内国外后我将JAVA的这种现象用C++翻译了一下。

#include<iostream>
using namespace std;

class Point
{

public:
Point(int a,int b){
x=a;
y=b;
}
int x;
int y;
};

void badSwap(int *var1, int *var2)
{
int *temp;
temp= var1;
var1 = var2;
var2 = temp;
}

void tricky(Point *arg1, Point *arg2)
{
arg1->x = 100;
arg1->y = 100;
Point *temp;
temp= arg1;
arg1 = arg2;
arg2 = temp;
}

int main()
{
Point *pnt1 = new Point(0,0);
Point *pnt2 = new Point(0,0);
cout<<"X: "<<pnt1->x<<"Y: "<<pnt1->y<<endl;
cout<<"X: "<<pnt2->x<<"Y: "<<pnt2->y<<endl;
cout<<endl;
tricky(pnt1,pnt2);
cout<<"X: "<<pnt1->x<<"Y: "<<pnt1->y<<endl;
cout<<"X: "<<pnt2->x<<"Y: "<<pnt2->y<<endl;
return 0;
}


其实结果已经很明显。
虽然不知到java的具体语法是怎样实现的,如果使用C实现的话,猜想应该是这样的。

java: int a=5; C++: int *a=5;
java: Point a=new Point(); C++: Point * a=new Point();
传递参数时
java: function(int a,int b) C++ function(int *a,int *b)
java: function(Point a,Point b) C++ function(Point *a,Point *b)


这样一来感觉自己在帮自己找麻烦,每次检查java代码时都要在脑中有一个指针的概念。
其实个人认为指针这东西很重要,因为它真实的反映了计算机内部的底层机制。虽然java封装了这一个特点,估计是因为很多人指针学的不好的缘故。但是对于我们这些指针用的还马马虎虎的人来说便成了个大问题。又是一个矛盾啊。就像市面上的框架一般虽然方便了编程,但是程序员越来越糊涂。这种对于要求逻辑和严谨的程序员可要不得。所以一定要挖清楚每一个细节。
其实如果要直观的理解这个特性其实也有方法,当然我还是使用C++的方法。
从今往后我会尽量少些这样的代码


public void function(Point p){
Point tempP=p;
}

因为在C++中这样的代码翻译为:

void function(Point *p)
{
Point *tempP;
tempP=p;
}


显然在C++中这样的代码显得很没有意义(我个人经验认为)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值