文章目录
- 前言
- 1、基本类型
- 2、基本类型演变过来的
- 3、自定义的类
- 4、本人代码和执行结果
- 5、个人的看法与猜想,拷贝或者是引用可能和"="有关系
- 6、String和Integer实验效果一样,但是原理不一样
前言
Java 中方法的传参没有所谓的值传递和引用传递,值传递和引用传递已经是历史,Java中只有值传递,参数传递的是参数的拷贝,这个拷贝在基本数据类型就是数值,对象类型就是引用!
1、基本类型
都是拷贝,当方法结束之后,变量销毁,不会影响传入变量的值
2、基本类型演变过来的
Integer,Double等等,虽然不是基本类型,但是也是拷贝(自动拆箱有关系),当方法结束之后,变量销毁,不会影响传入变量的值。
3、自定义的类
都是引用,也就是说,当方法结束之后,对象不会销毁,会影响传入变量的值
4、本人代码和执行结果
package com.books.tool.test;
public class Temp {
public Integer a;
public Temp(Integer b){
this.a=b;
}
//直接交换值
public static void swap(Temp t1,Temp t2){
Integer temp=t1.a;
t1.a=t2.a;
t2.a= temp;
}
public static void swapInteger(Integer t1,Integer t2){
Integer temp=t1;
t1=t2;
t2= temp;
}
public static void main(String[] args) {
Temp t1=new Temp(1);
Temp t2=new Temp(2);
System.out.println("交换之前t1的值"+t1.a);
System.out.println("交换之前t2的值"+t2.a);
swap(t1,t2);
System.out.println("交换之后t1的值"+t1.a);
System.out.println("交换之后t2的值"+t2.a);
System.out.println("--------------------------");
Integer i1=1;
Integer i2=2;
System.out.println("Integer交换之后i1的值"+i1);
System.out.println("Integer交换之后i2的值"+i2);
swapInteger(i1,i2);
System.out.println("Integer交换之后i1的值"+i1);
System.out.println("Integer交换之后i2的值"+i2);
}
}
执行结果
5、个人的看法与猜想,拷贝或者是引用可能和"="有关系
Temp t1=new Temp(1);
Temp t2=t1; //属于引用,t1和t2都是指向同一个地址空间,t1改,t2的值也会变
Integer i1=250;
Integer i2=i1; //属于拷贝,i1改,指向不同的地址,i2不会变
//这里有个隐藏条件Integer的值大于127或者小于-127
6、String和Integer实验效果一样,但是原理不一样
String当做参数传入方法后, 方法内更改值,不会影响外面参数的值,但是传入的时候,String并没有拷贝,也不算引用,而是指向了同一地址空间(字符串常量池)。
但是不同的是,普通对象指向同一地址空间,对象更改值,是更改地址空间的值。
而字符串更改值,是不改原来地址空间的值,而是如果字串符常量池有这个新值,那么就指向该地址,如果没有新值,就开辟一个地址空间存入新值,然后指向该地址。(有点抽象,但是你要慢慢理解)