值传递和引用传递

1)若想搞清楚java中的值传递和引用传递,首先要搞清楚java中两种数据类型:基本类型和引用类型。java中基本类型只有八种,以下所示:java

 

 

其他的都是引用类型(就是使用new运算符建立的对象类型),例如String,Integer、数组等。数组

2)这两种类型的变量的存储位置也不一样。基本类型是存储在栈上,属于线程局部的,只供本线程访问。而引用类型是存储在堆上,能够供进程的全部线程访问。从栈里面申请内存,简单快速,可是容量有限。堆是全部线程共有的,从堆里面申请内存要进行相关的加锁操做,所以申请堆内存的复杂度和时间开销比栈要大不少。app

3)这两种类型存储的值意义不一样。基本类型变量存储的值就是变量的实际值(字面值,一个字符,数值或者布尔值),而引用类型存储的值是指向对象的地址值。ui

int val;//基本类型声明时,即分配内存空间(存放数据)。
val=10;
Date date;//引用类型声明时,只是给引用类型变量date分配了内存空间。
date=new Data();//使用new操做符建立对象实例时,才建立对象的内存空间。在这里,将对象内存空间的地址复制给date
date2=date;//只是将对象地址赋给了date2,并无复制对象。指向同一个对象

总之,java中值传递方式就是值传递,只是基本类型变量传递的是字面值,而引用类型传递的是指向对象的地址值,归根到底都是值。spa

4)以一个实例说明值传递和引用传递:线程

 1 public class TestMain {    
 2     public static void main(String[] args) {
 3         String a = "a";
 4         String b = "b";
 5         operator(a, b);    
 6         StringBuilder x = new StringBuilder("x"); 
 7         StringBuilder y = new StringBuilder("y");        
 8         System.out.println(a + "," + b);    
 9         System.out.println(x + "," + y);
10     }
11 
12     public static void operator(String a, String b) {
13         a += b;
14         System.out.println("new a:"+a);
15         b = a;
16 
17     }
18 
19     public static void operator(StringBuilder a, StringBuilder b) {
20         a.append(b);
21         b = a;
22     }
23 }

结果以下:code

5)关于"=="和equals对象

6)最后,总之,引用类型存储的是对象的地址blog

相关文章
相关标签/搜索