首先看一下用cpp的引用(别名)
注意点:
- cpp的引用相当于给值多取一个变量名(别名)
- cpp的引用一定要初始化,且指向不能改变,但值可以变
- 形参为实参的一个引用,所以对形参的修改就是对实参的修改
cpp引用实现swap
#include <iostream>
void mySwap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int a = 10;
int b = 20;
mySwap(a, b);
std::cout << a << std::endl;
std::cout << b << std::endl;
return 0;
}
输出:
20
10
再看下java的引用(句柄)
注意点:
- java的基本类型是没有引用的,直接存放值在栈空间,而对象会先在堆空间创建对象,然后在栈空间创建一个引用指向这个对象
- int a = 10; 代表在栈空间开辟一个空间存放a的数值10
- A a = new A(10); 代表在堆空间创建一个A对象,并在栈空间创建一个引用指向堆中的A
java把基本对象传入方法实现swap
package Demo;
public class Demo02 {
public static void main(String[] args) {
int a = 10;
int b = 20;
swap(a, b);
System.out.println(a);
System.out.println(b);
}
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
}
输出:
10
20
可以看出java对于基本对象是值传递,对形参的操作不会影响到实参
看下把对象传入方法实现swap
package Demo;
public class Demo01 {
public static void main(String[] args) {
A a1 = new A(10);
A a2 = new A(20);
swap(a1, a2);
System.out.println(a1.getA());
System.out.println(a2.getA());
}
public static void swap(A x, A y){
A temp = x;
x = y;
y = temp;
}
}
输出:
10
20
可以看出实参也没有变化,这是为什么呢?
1.java对象传入方法的是对象的引用
2.A temp = x; temp就是a1的引用
3.x = y; x就是a2的引用
4.y = temp; y就是a1的引用
可以看出方法内引用交换了,但方法外引用没交换
cpp和java的引用的区别
- cpp的引用就是别名
- java的引用则是一个句柄指向堆中的对象(除基本对象)
可以看下图解:
cpp:创建一个引用相当于,多一个别名,相当于多一个变量名(一个对象有两个变量名)
java:创建一个引用,相当于栈多一个引用指向堆中的对象,引用的值变换和堆中的对象和这个对象的其他引用不会有影响(有两个指向这个对象的指针)