首先我们来想一个问题,在Java的函数传参中,到底传的是值or引用?
比如
1. public void printMessage(int i)
外部调用 printMessage(a)
2. public void printMessage(User u)
外部调用 printMessage(user)
1.如果这个时候我在函数里改变 i的内容,那么外面的a 肯定不会变
2.如果这个时候我在函数里改变 u的内容,比如u.setGender("女") 那么外面的u.gender 如果是"男" 这个时候肯定会变成女
这里不懂的、不信的你就试一下。
为什么呢?
Java中函数的形参,不管是基本变量还是对象类型变量,传递的都是一个拷贝。
基本变量的拷贝传递过去,改变不会影响原来的变量。因为变量复制一份
但是对象类型传递的是一份引用拷贝,引用在Java中就是指向某个指针(地址),副本引用的变化直接影响外面的对象也就不奇怪了。
再说一下C++ 里面的指针概念,指针恰恰就解决了另外的问题,拿地址来操作数据(Java只能拿引用来操作)
咱们看到的代码
int a ;
int *p;
p = &a ;
p是存储指针的变量,里面的值是地址,是可变的。
但是a 是一个引用。 引用可以理解在 内存上打的一个标签, 这个引用所指向的地址是不可变的。 举个例子 a指向内存地址为 0x01的,不可能通过编程手法变成 a指向了内存地址为0x02的。 只可能改变a里面的值,也就是地址0x01里面的数据域
所以大概图形是这样子的
大伙明白了吗?
还记得上面那句话吗,Java只能拿着引用(a)来操作数据,但是C++可以拿着地址(p) 来操作数据。
Java去掉了指针概念,简化了程序难度,理解难度,被更多程序员所接受。
但是Java依旧保留了引用概念,也是根本去不掉的。Halal Madrid!
网友评论