1.1 引用傳遞及基本應用
1.1.1 引用傳遞
引用傳遞就是指將堆內存空間的使用權交給多個棧內存的空間。
對象引用傳遞:
class Demo{
int temp = 30;
}
class TestJava0501{
public static void main(String[] args) {
Demo d1 = new Demo();
d1.temp = 50;
System.out.println("fun()方法調用之前" + d1.temp);
fun(d1);
System.out.println("fun()方法調用之後" + d1.temp);
}
public static void fun(Demo d2){
d2.temp = 100;
}
}
運行結果:
fun()方法調用之前50
fun()方法調用之後100
在fun方法之中接收了Demo類對象d1,並將temp屬性的內容進行了修改,因爲是引用傳遞,所以最終temp的值是1000,此程序可以通過下圖表示:
引用傳遞2:
class RefDemo02{
public static void main(String[] args) {
String str1 = "hello";
System.out.println("fun()方法調用之前" + str1);
fun(str1);
System.out.println("fun()方法調用之後" + str1);
}
public static void fun(String str2){
str2 = "kity";
}
}
運行結果:
fun()方法調用之前hello
fun()方法調用之後hello
雖然此時傳遞的是一個String類型的對象,但是結果並沒有像之前一樣發生改變,因爲字符串的內容一旦聲明是不可改變的,改變的知識其內存地址的指向。本程序的內存操作圖如下:
引用傳遞3:
class Demo03{
String temp = "hello";
}
class RefDemo03{
public static void main(String[] args) {
Demo03 d1 = new Demo03();
d1.temp="world";
System.out.println("fun()方法調用之前" + d1.temp);
fun(d1);
System.out.println("fun()方法調用之後" + d1.temp);
}
public static void fun(Demo03 d2){
d2.temp="MLDN";
}
}
運行結果:
fun()方法調用之前world
fun()方法調用之後MLDN
內存操作圖:
1.1.2 接受本類的引用
以上爲引用產地的基本形式,實際上在對象引用傳遞上也可以在一個類中接收自己本類對象的實例,而且接受完之後,可以方便地通過此對象進行本類中封裝屬性的訪問,如下代碼:
class Demo04{
private int temp = 30;
public void fun(Demo04 d2){
d2.temp = 50;
}
public int getTemp() {
return temp;
}
public void setTemp(int temp) {
this.temp = temp;
}
}
class RefDemo04{
public static void main(String[] args) {
Demo04 d1 = new Demo04();
d1.setTemp(50);
d1.fun(d1);
System.out.println("temp = " + d1.getTemp());
}
}
運行結果:
temp = 50
因爲在類的內部,所以可以訪問其中的私有屬性,因此只要符合引用傳遞的語法,則可以向任意地方傳遞。
1.1.3 範例——一對一關係
實際上使用引用傳遞還可以表示出生活中的以下一種場景,例如,一個人有一本書,一本書屬於一個人。因而可以得出這樣的結論:人應該是一個具體的類,書也應該是一個具體的類,在人的類中應該存在一個屬性表示書,在書的類中也應該存在一個屬性表示人。
class Person01{
private String name;
private int age;
private Book book;
public Person01(String name, int age){
this.setName(name);
this.setAge(age);
}
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;
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
}
class Book{
private String title;
private float price;
private Person01 person01;
public Book(String title, float price){
this.setTitle(title);
this.setPrice(price);
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public Person01 getPerson01() {
return person01;
}
public void setPerson01(Person01 person01) {
this.person01 = person01;
}
}
class RefDemo05{
public static void main(String[] args) {
Person01 per = new Person01("張三",30);
Book bk = new Book("java開發實戰經典", 12.5f);
per.setBook(bk);
bk.setPerson01(per);
System.out.println("從人找到書名--姓名:" + per.getName() + "; 年齡:" + per.getAge() + "; 書名:" + per.getBook().getTitle() + "; 價格:" + per.getBook().getPrice());
System.out.println("從書名找到人--書名:" + bk.getTitle() + "; 價格:" + bk.getPrice() + "; 姓名:" + bk.getPerson01().getName() + "; 年齡:" + bk.getPerson01().getAge());
}
}
運行結果:
從人找到書名--姓名:張三; 年齡:30; 書名:java開發實戰經典; 價格:12.5
從書名找到人--書名:java開發實戰經典; 價格:12.5; 姓名:張三; 年齡:30
人和書有關聯關係,如圖: