引用传递和值传递

明确一个概念:JAVA中分为基本数据类型及引用数据类型

JAVA基本数据类型:byte,short,int,long,float,double,char,boolean.

一、变量的基本类型和引用类型区别

(1)基本数据类型在声明时系统就给它分配空间

(2)引用数据类型声明时只给变量分配了引用空间,而不分配数据空间

编译器给的报错信息:

二、引用传递和值传递

值传递:操作的实际上是原始值的一个copy,并不会影响原来的值

引用传递:方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址

 1 public class o1 {
 2     public int b=49;
 3 }
 4 
 5 
 6 public class t1 {
 7     public static void main(String[] args) { 
 8         t1 t = new t1(); 
 9         int a=99; 
10         t.test1(a);//这里传递的参数a就是按值传递 
11         System.out.println(a);
12          
13         o1 obj=new o1(); 
14         t.test2(obj);//这里传递的参数obj就是引用传递
15         System.out.println(obj.b);
16     } 
17      
18     public void test1(int a){ 
19         a=a+1;
20         System.out.println("test1:"+a);
21         } 
22      
23     public void test2(o1 obj){ 
24         obj.b=50;
25         System.out.println("test2:"+obj.b);
26         }
27 }

结果:

因为int是基本类型,值传递,所以值没有改变

object是引用类型,引用传递,值发生改变

注意:这里要特殊考虑String,以及Integer、Double等几个基本类型包装类,它们都是值传递

 1 public class t1 {
 2     public static void main(String[] args){
 3         t1 pk=new t1();
 4         //String类似基本类型,值传递,不会改变实际参数的值
 5         String test1="Hello";
 6         pk.change(test1);
 7         System.out.println(test1);
 8          
 9         //StringBuffer和StringBuilder等是引用传递
10         StringBuffer test2=new StringBuffer("Hello");
11         pk.change(test2);
12          
13         System.out.println(test2.toString());
14     }
15      
16     public void change(String str){
17         str=str+"world";
18     }
19      
20     public void change(StringBuffer str){
21         str.append("world");
22     }
23 }

结果:

总结:

(1)基本数据类型传值,对形参的修改不会影响实参;
(2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;
(3)String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。

博客园:http://www.cnblogs.com/zhuziyu/
Copyright ©2018 不是植物
【转载文章务必保留出处和署名,谢谢!】
原文地址:https://www.cnblogs.com/zhuziyu/p/8502992.html