引用:https://www.cnblogs.com/binyue/p/3862276.html
java语言中:
变量除了八大基本数据类型(byte,short,int,long,boolean,float,double,char)
基本剩下的数据类型都是引用类型(类类型,接口类型,数组)
区别:
Java中数据类型分为两大类,基本类型和对象类型。相应的,变量也有两种类型:基本类型和引用类型。
基本类型的变量保存原始值,即它代表的值就是数值本身;
而引用类型的变量保存引用值,"引用值"指向内存空间的地址,代表了某个对象的引用,而不是对象本身,
对象本身存放在这个引用值所表示的地址的位置。
对于数据类型不同,在用的过程中,会发现不同的有趣现象,这也被面试的时候,经常迷惑一下面试者,看看对java的理解程度,下面就举几个例子:
int a; a = 6;//这个语句是正确的,八大数据类型赋值的时候必须要赋初值,否则会报错 String str;//String不属于八大数据类型,在引用的时候,就自动分配了一个地址
//如果直接输出System.out.println(str.toString());会报错,提示没有赋初始值,java在编译时候,会对没有使用的变量忽略,进行垃圾回收
引用传递和值传递
引用传递也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址;
在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。(这也就是为什么数组进行自定义排序方法的时候,不用在方法体中return的原因)
值传递:
方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。
引用传递:
也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址;
在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。
Date date; //执行实例化,开辟数据空间存放Date对象,然后把空间的首地址传给today变量 //date=new Date(); //如果注释掉上一步操作 //The local variable date may not have been initialized //也就是说对象的数据空间没有分配 date.getDate();
看一个例子:
class MyObj{ public int b=99; }
分别传参int和对象类型:
1 public class ReferencePkValue2 { 2 3 public static void main(String[] args) { 4 ReferencePkValue2 t = new ReferencePkValue2(); 5 int a=99; 6 t.test1(a);//这里传递的参数a就是按值传递 7 System.out.println(a); 8 9 MyObj obj=new MyObj(); 10 t.test2(obj);//这里传递的参数obj就是引用传递 11 System.out.println(obj.b); 12 } 13 14 public void test1(int a){ 15 a=a++; 16 System.out.println(a); 17 } 18 19 public void test2(MyObj obj){ 20 obj.b=100; 21 System.out.println(obj.b); 22 } 23 }