Java中的引用传递和值传递

Java 中的基本数据类型: int boolean double float byte char long short void 是值传递 ,不是引用传递,存放在 jvm 内存中的 statck ——栈中。

 

对象则是引用传递 ,对象存放在 jvm 内存中的 heap ——堆中,对象的引用则存放在statck——栈中。

 

如果两个引用都指向同一个对象,则其中一个引用改变了对象的值,则另外一个引用也会被影响。

 

对象传递的是引用

如果在方法中把对象 a 作为参数 b 传递,则参数 b 传递的是对象 a 的引用,此时,参数 b 和对象 a 的引用都指向同一个对象 ( 内存地址 ) 。方法执行时,对参数 b 的改变,就是对对象 a 的改变。如果此时,方法中参数 b 指向另外一个引用,则和方法外的对象 a 的引用不同。此时,对参数 b 的改变,不会改变对象 a

 

如下面的代码所示:

 

public class ArrayListTest { 
	public static void main(String args[]){ 		
               List<String> testList = new ArrayList<String>(); 		 
               testList.add("a"); 		
               add(testList); 		
               testList.add("d"); 		
               for(String str:testList){
 			System.out.println(str); 		
               } 
	}
 	
        public static void add(List<String> list){ 		 
                list.add("b"); 		
                list= new ArrayList<String>(); 		
                list.add("c"); 	
          } 
}

 

    刚开始时,在 list= new ArrayList<String>(); 之前,方法 add() 中的参数 list 和方法外面的 testList 这两个引用指向的是同一个对象,对 list 的改变就是对 testList 指向的对象的改变。

new ArrayList<String>() 之后,方法 add() 中的 list 指向了一个新的对象的引用,和 testLIst 指向不是同一个对象,因此此时,对 list 的改变,不会改变 testList 指向的对象。因此输入结果为:

 

a

b

d
 

 

你可能感兴趣的:(java)