值传递和引用传递

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

 

 

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

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

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

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

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

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 }

结果如下:

5)关于"=="和equals

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

 

posted @ 2015-12-21 16:03  lz3018  阅读(216)  评论(0编辑  收藏  举报