之前没有写过博客,因为一直觉得没什么好写的.这两天对对象引用的理解又更深了一些,这个是基本的知识,但是确实比较重要.相信大多数程序员都知道,引用传递和值传递,但可能没有深入分析过或不是太清楚.包括在这之前的我,也觉得自己已经掌握得可以了.到现在为止,我每一次都又觉得又理解得更深一些了,这就是不断学习和理解的过程.今天就分享一下我自己的理解.如果有说得不对的地方,大神勿P.
很多人说的JAVA是没有引用传递的,只有值传递,今天我不讨论这个问题.我只说明在实现代码中.哪些是值传递,哪些是引用对象传递.而又有什么不同点.
首先,传入一个方法中,如果接收的是基本数据类型,则肯定是值传递,那么值传递有什么影响呢?按我的基本理解就是,在方法内部改变了该参数的值,并不会影响到外部的实参.
1.1 传入基本数据类型参数
public static void main(String[] args){
int a = 3;
add(a);
System.out.println("方法外部A = "+a);
}
public static void add(int a){
a = 10;
System.out.println("内部方法A = "+a);
}
上述程序运行后,结果是:内部方法A = 10
外部方法A = 3
说明值传递后,值改变是没有影响的.因为只是传了一个值的过去.值传递基本上就是这样子的.是不是很简单.下面重点来看一看引用传递(地址传递)
引用传递也叫做地址传递,为什么叫地址传递.因为本身就是传递的对象在内存中的地址.
按我的理解,如果传入到方法中的参数是对象或数组,那么你就可以理解为是引用传递了.那么它有什么特点呢,特点就是在方法内部改变了该对象中的属性值,
外部对象同样也会发生改变(当然String类除外).注意,一定是改变了对象的属性值,而不是对该对象本身赋值.
2.1
public static void main(String[] args){
Map<String,Integer> m = new HashMap<String,Integer>();
m.put("aaa",12);
update(m);
System.out.println("外部MAP = "+m);
}
public static void update(Map<String,Integer> m){
m.put("aaa",-1);
System.out.println("内部MAP = "+m);
}
这时候结果是都是打印的:MAP = {aaa=-1}为什么呢,我们来看一张图.