算是比较基础的东西
(如果看着累可以直奔结论)
先上代码1:
public class Quote1 {
// 引用不会改变变量,即形参不会改变主方法中的实参
public static void main(String[] args) {
int i = 0;
function1(i);
System.out.println(i);
String str = "李白";
function2(str);
System.out.println(str);
}
public static void function1(int i) {
i = 5;
}
public static void function2(String str) {
str = "杜甫";
}
}
我们在主方法中定义变量i,赋值0.并执行function1()
我们可以看到在function1中我们对i进行了赋值
下面的function2类似,是对字符串进行赋值
输出如下:
0
李白
原理:
方法中的参数列表是形参,和主方法中的变量(i和str)没有关系。
以此程序的function1为例,我们用更通俗易懂的方法来解释:主程序中的function1(i),相当于function1(0),function1(i)只是相当于把5作为参数传过去执行方法,而方法中的参数不会导致主方法中的变量有所改变。
function2(str)同理。
再上代码2
import com.oracle.entity.Book;
public class QuoteBook {
// 地址的引用改变后会影响主方法中的关于地址的引用
// 由于Book是一个实体类,所以对于function1在形参中的引用也会指向对应地址
// 而function2多加了一条语句,使用new在堆中开辟了一个新的空间,致使地址引用改变,不再指向主方法中的Book的地址
public static void main(String[] args) {
Book book = new Book();
book.name = "十万个为什么";
function1(book);
System.out.println(book.name);
function2(book);
System.out.println(book.name);
}
private static void function1(Book book) {
book.name = "百万个为什么";
}
private static void function2(Book book) {
book = new Book();
book.name = "千万个为什么";
}
}
这里解释一下,book是一个实体类,这里只用到了book的name属性。
而输出是这样的:
百万个为什么
百万个为什么
其实也不难理解,上几张图即可了解。
图1:执行到 book.name = "十万个为什么"时,内存情况
图2:执行完function1后,内存情况:
图3:执行完function2后,内存情况:
相信是一目了然了。
结论:
引用不会改变已声明并定义的变量,即形参不会改变主方法中的实参
地址的引用改变后会影响所有关于地址的引用
如果有哪里不对还请大佬指正,谢谢