虽然还是个在校学生,但是不管怎么说编程也有几个年头了。虽然JAVA学习的时间不长,但也有3/4个年头了。但是最近却被传引用还是传值的问题弄的困惑不已。先看下面的例子:
运行结果如下
这样的结果着实让我很费解。
在查询了站内站外,国内国外后我将JAVA的这种现象用C++翻译了一下。
其实结果已经很明显。
虽然不知到java的具体语法是怎样实现的,如果使用C实现的话,猜想应该是这样的。
这样一来感觉自己在帮自己找麻烦,每次检查java代码时都要在脑中有一个指针的概念。
其实个人认为指针这东西很重要,因为它真实的反映了计算机内部的底层机制。虽然java封装了这一个特点,估计是因为很多人指针学的不好的缘故。但是对于我们这些指针用的还马马虎虎的人来说便成了个大问题。又是一个矛盾啊。就像市面上的框架一般虽然方便了编程,但是程序员越来越糊涂。这种对于要求逻辑和严谨的程序员可要不得。所以一定要挖清楚每一个细节。
其实如果要直观的理解这个特性其实也有方法,当然我还是使用C++的方法。
从今往后我会尽量少些这样的代码
因为在C++中这样的代码翻译为:
显然在C++中这样的代码显得很没有意义(我个人经验认为)。
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++中这样的代码显得很没有意义(我个人经验认为)。