1. 程式人生 > >Java學習之引用傳遞及其應用

Java學習之引用傳遞及其應用

介紹一下java裡面三種引用傳遞

Demo 1

public class ChapterFive {
    public static void main(String[] args) {
        Demo1 d1 = new Demo1(); // 例項化Demo1物件
        d1.temp = 50;           // 修改 temp 屬性值
        System.out.println("呼叫 fun() 函式前:" + d1.temp);
        fun(d1);
        System.out.println("呼叫 fun() 函式後:" +
d1.temp); } public static void fun(Demo1 d2){ // 此處的方法由主方法直接呼叫 d2.temp = 1000; } } class Demo1{ int temp = 30; }

執行結果

呼叫 fun() 函式前:50
呼叫 fun() 函式後:1000

我們分析一下記憶體變化過程 記憶體分析1

一開始,類Demo1的成員變數初始化為30,在主程式裡,例項化了一個物件d1,指向的堆記憶體值是初始化的temp=30,然後物件d1在外部更改了屬性temp的值,這時候,堆記憶體的地址改變為temp=50,接著呼叫fun(d1),生成了一個新的物件 d2,一開始d2指向的堆記憶體地址也是temp=50,但是在執行fun函式時,內部又將temp的值變為1000,同時,d1指向的堆記憶體地址也變成temp=1000.

Demo 2

public class ChapterFive {
    public static void main(String[] args) {
        String str1 = "hello";
        System.out.println("呼叫 fun() 函式前:" + str1);
        fun1(str1);
        System.out.println("呼叫 fun() 函式後:" + str1);
    }

    public static void fun1(String str2){  // 此處的方法由主方法直接呼叫
        str2 =
"MLDN"; } }

執行結果:

呼叫 fun() 函式前:hello
呼叫 fun() 函式後:hello

在這裡插入圖片描述

Demo 3

public class ChapterFive {
	public static void main(String[] args) {
        Demo1 d1 = new Demo1();
        d1.temp = "world";
        System.out.println("呼叫 fun() 函式前:" + d1.temp);
        fun1(d1);
        System.out.println("呼叫 fun() 函式後:" + d1.temp);
    }

    public static void fun1(Demo1 d2){  // 此處的方法由主方法直接呼叫
        d2.temp = "MLDN";
    }
}

執行結果:

呼叫 fun() 函式前:world
呼叫 fun() 函式後:MLDN

在這裡插入圖片描述

一對一關係

實際上引用傳遞可以對應於實際生活中的一些場景,比如說一個人有一本書,我們也可以理解為一本書屬於一個人。

class Person{
    // 封裝屬性
    private String name;
    private int age;
    private Book bk;

    // 構造方法 目的就是為類中的屬性初始化
    public Person(String n, int a){
        this.setName(n);
        this.setAge(a);
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        if(age>=0 && age <=120) {
            this.age = age;
        }
    }

    public Book getBk() {
        return bk;
    }

    public void setBk(Book bk) {
        this.bk = bk;
    }

    public int getAge() {
        return age;
    }

    public void tell(){
        System.out.println("name: " + name + " age: " + age);
    }
}


class Book{
    private String title;
    private float price;
    private Person person;

    public Book(String title, float price){
        this.setPrice(price);
        this.setTitle(title);
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

public class ChapterFive {
    public static void main(String[] args) {
        Person person = new Person("張三", 30);
        Book bk = new Book("《Java從入門到放棄》", 33.0f);
        person.setBk(bk);
        bk.setPerson(person);
        System.out.println("從人找到書 --> 姓名:" + person.getName() + " 年齡:" + person.getAge()
                + " 書名:" + person.getBk().getTitle() + " 價格:" + person.getBk().getPrice()
        );

        System.out.println("通過書找到人 --> 書名:" + bk.getTitle() + " 價格:" + bk.getPrice() +
            " 姓名:" + bk.getPerson().getName() + " 年齡:" + bk.getPerson().getAge()
        );
    }
}