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()
        );
    }
}

猜你喜欢

转载自blog.csdn.net/zuolixiangfisher/article/details/84034806