在java中咱们在给方法传值时,真的是咱们认为的值传递么?若是不是,那么是引用传递么?java
其实在java中方法传值时,java的内部处理机制是不同的,当传入是基本数据类型时,你能够认为是值传递,而当传入的是一个对象时,就不单单是值传递,应该说你若是还认为是值传递时,那就大错特错了,由于是引用传递优化
简单数据类型都是直接存储在内存中的内存栈上的,数据自己的值就是存储在栈空间里面,而Java语言里面只有这八种数据类型是这种存储模型;而其余的只要是继承于Object类的复杂数据类型都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,“引用”是存储在有序的内存栈上的,而对象自己的值存储在内存堆上的。spa
可是不是全部的引用类型或者复杂类型都遵循上面的原则线程
好比常常使用的String类型就是一种形似引用的值传递,这是由于java内部对String类型进行过优化处理orm
再好比Date数据类型也是一种复杂的类型但其一样不是一种引用传值,而是值传递对象
public static void main(String[] args) throws InterruptedException {继承
// TODO Auto-generated method stub内存
//这是String类型的时候进行的值传递,你只要放开注释就能够看见了get
// String []a={1+""};虚拟机
// System.out.println(a[0]);
// test(a);
// System.out.println(a[0]);
// }
// public static void test(String [] a){
// a[0]=10+"";
// }
// String s=1+"";
// System.out.println(s);
// test(s);
// System.out.println(s);
//下面这是在Date中的值传递,其中的Thread线程必需要加上,由于计算机是进行时间片轮转,在这段代码不多的状况下,若是不让Thread睡一下子很容易在一个时间片就执行因此你会看输出的结果是同样的,关于Date类型我会在下一篇中详细介绍
Date date = new Date();
System.out.println(date.getTime());
Thread.sleep(1000);
test(date);
System.out.println(new Date().getTime());
System.out.println(date.getTime()); //若是是引用传递的话其应该和test方法中打印的应该是同样的,可是事实却不是,并且还有一个很奇怪的现象无论你让thread睡多长时间,传入的date和打印方法中的date是同样的
}
public static void test(Date date){
date = new Date();
System.out.println(date.getTime());
}
java:
基本类型存储在栈中,所以它们的存取速度要快于存储在堆中的对应包装类的实例对象。从Java5.0(1.5)开始,JAVA虚拟机(Java Virtual Machine)能够完成基本类型和它们对应包装类之间的自动转换。所以咱们在赋值、参数传递以及数学运算的时候像使用基本类型同样使用它们的包装类,但这并不意味着你能够经过基本类型调用它们的包装类才具备的方法。另外,全部基本类型(包括void)的包装类都使用了final修饰,所以咱们没法继承它们扩展新的类,也没法重写它们的任何方法。