明确一个概念: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 }
结果:
总结: