相信大部分初学java的人都会有的疑惑,引用与指针究竟有什么区别呢?
先来看一个 c语言中的交换函数
1 #include "stdio.h" 2 void swap(int *a,int *b) 3 { 4 int temp=*a; 5 *a=*b; 6 *b=temp; 7 } 8 main() 9 { 10 int a=1,b=2; 11 swap(&a,&b); 12 printf("%d %d",a,b); 13 }
很简单 只要用指针传一个地址进去 但java中没有指针 怎么办?
只能创建对象实现 或者 借助数组 没有指针来的这么方便
1 public class Swaptest { 2 3 public int a; 4 public int b; 5 6 public static void main(String[] args) { 7 8 Swaptest s =new Swaptest(); 9 s.a=1; 10 s.b=2; 11 Change(s); 12 System.out.println(s.a+" "+s.b); 13 } 14 public static void Change(Swaptest i){ 15 int temp=i.a; 16 i.a=i.b; 17 i.b=temp; 18 } 19 }
看到这里 也许有人会说 Integer 不也是引用类型吗 为什么不能直接用它来传 我们可以看一下
1 public class Swaptest { 2 3 4 public static void main(String[] args) { 5 6 7 Integer a=1,b=2; 8 Change(a,b); 9 System.out.println(a+" "+b); 10 } 11 public static void Change(Integer a,Integer b){ 12 Integer temp=a; 13 a=b; 14 b=temp; 15 } 16 }
输出结果还是 1 2
这是为什么呢?
我们再来看一个例子
1 public class Swaptest { 2 3 4 public static void main(String[] args) { 5 6 7 Integer a=1,b; 8 b=a; 9 b=2; 10 11 System.out.println(a+" "+b); 12 System.out.println(a==b); 13 } 14 15 }
你们可以猜一下输出结果是什么
结果是
1 2false
为什么?
因为Integer是封装类的 是不可变的
当b赋值为2的时候 并不是去修改b所指的地址里的值 而是 新建一个空间 存为2 并让b指向它
那么引用比指针好在哪里呢?
使程序更加安全 java给你规定好了哪里能用 哪里不能用
但是受束缚 没指针这么灵活