Java中的值傳遞如何理解,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
值傳遞和引用傳遞是指在方法調用中,由調用者傳遞過來的參數是一個具體的值還是一個地址引用。 我發現小伙伴認為Java中存在引用傳遞的最大原因就是對上邊概念中的這個“地址”有誤解,它指的是棧中變量的引用,并不是指堆中對象的地址。
值傳遞:顧名思義,就是由調用方法的地方將實際的值傳到方法中。也就是說,我將我的值給你了,你想怎么改就怎么改,但是你的任何改變都不會影響我自身。
引用傳遞: 引用傳遞是一種特殊的變量,它被認為是一個變量的別名。當定義一個引用時,其實是為目標變量起一個別名,引用并不分配獨立的內存空間,它與目標變量公用其內存空間,當定義一個引用時,如果該引用不是用作函數的參數或者返回值,則必須提供該引用的初始值(即必須提供引用的目標變量名)。
在Java中的8大基本數據類型和String中,這個值傳遞很容易理解,看如下代碼:
public static void main(String[] args) {
int a = 1;
System.out.println("方法調用前:" + a);
sum(a);
System.out.println("方法調用后:" + a);
}
private static void sum(int a) {
a = 2;
}
輸出結果為(這是意料之中的事):
方法調用前:1
方法調用后:1
有很多小伙伴都有如下想法:Java中的對象有在堆中創建的,而棧中的變量只是一個地址引用,所以當調用方法時傳遞過去的就是實際就是堆中對象的地址引用。 所以他們認為,在Java中,對象就是引用傳遞。其實不是的,請仔細閱讀引用傳遞的概念,它是指傳遞過去的是這個變量的引用而不是對象的引用,也就是傳遞過去的這個實參就是棧中這個變量的引用。 但是實際是在調用方法時,它傳遞的就是這個變量的一個一副本,一個復制值,但是這個復制值就是所指向的對象地址還是那個,所以修改這個對象時,其實修改的是堆中對象的值,所以就會改變,看如下示例:
Student對象(標準的JavaBean)
class Student{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
測試方法
public static void main(String[] args) {
Student stu1 = new Student("zhangsan", 12);
System.out.println("方法調用前:"+ stu1.toString());
change(stu1);
System.out.println("方法調用后:"+ stu1.toString());
}
最主要的就是這個change()方法了,我們不好從正面去證明它是值傳遞,但是我們可以從反面去證明它不是引用傳遞:
private static void change(Student stu1) {
stu1.setAge(22);
}
這個輸入結果沒有問題:
方法調用前:Student{name='zhangsan', age=12} 方法調用后:Student{name='zhangsan', age=22}
private static void change(Student stu1) {
stu1 = new Student();
stu1.setAge(99);
}
根據大家的經驗,這個輸出肯定是:
方法調用前:Student{name='zhangsan', age=12}
方法調用后:Student{name='zhangsan', age=12}
那么重點來了?為什么會是這樣,如果它是引用傳遞,那么我在這里給它new一個新對象,在main方法中的變量應該也是一個新對象啊,因為我改變了它的引用地址,這足以說明這個不是一個引用傳遞,因為引用傳遞中,當你改變形參的值的時候,調用方法的實參也應該改變。
Java的特點有哪些 1.Java語言作為靜態面向對象編程語言的代表,實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程。 2.Java具有簡單性、面向對象、分布式、安全性、平臺獨立與可移植性、動態性等特點。 3.使用Java可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。