(Java)引用传递及基本应用

一、引用传递分析

所谓的引用传递就是指将堆内存空间的使用权交给多个栈内存空间

  1. 引用传递范例(1)
public class Test{
    public static void main(String[] args) {
        String str1 = "hello";
        System.out.println(str1);
        fun(str1);
        System.out.print(str1);
    }
    public static void fun(String  str2){
        str2 = "MLDN";
    }
}

在这里插入图片描述
因为字符串内容一旦声明是不可改变的,改变的只是其内存地址的指向。
在这里插入图片描述
2. 引用范例(2)

class Demo{
    String  temp = "hello";
}
public class Test{
    public static void main(String[] args) {
        Demo d1 = new Demo();
        d1.temp = "world";
        System.out.println(d1.temp);
        fun(d1);
        System.out.print(d1.temp);
    }
    public static void fun(Demo  d2){
        d2.temp = "MLDN";
    }
}

这里 String 是作为一个 Demo 类的属性存在的,而在操作的时候更改的只是 Demo 类中的属性的内容
在这里插入图片描述

二、接收本类的引用

实际上对象引用传递上也可以在一个类中接受自己本类对象的实例,而且接收完之后,可以方便地通过此对象直接进行本类中封装属性的访问。

class Demo{
    private int temp = 30;
    public void fun(Demo d2){
    	// 这里对私有属性的访问属于该类的内部访问
        d2.temp = 50; // 直接通过对象调用本类的私有属性
    }
    public int getTemp(){ // getter 方法
        return temp;
    }
    public void setTemp(int t){ // setter 方法
        temp = t;
    }
}

public class Test{
    public static void main(String[] args) {
        Demo d1 = new Demo();
        d1.setTemp(40);
        d1.fun(d1);
        System.out.print(d1.getTemp());
    }
}

三、范例(1)一对一关系

class Person{
    private String name;
    private int age;
    private Book book; // 一个人有一本书
    public Person(String name,int age){ // 通过构造设置内容
        this.setName(name);
        this.setAge(age);
    }
    public String getName(){
        return name;
    }
    public void setName(String n){
        name = n;
    }
    public int getAge(){
        return age;
    }
    public void setAge(int a){
        age = a;
    }
    public Book getBook(){ // 得到本人的书
        return book;
    }
    public void setBook(Book b){ // 设置本人的书
        book = b;
    }
}

class Book{
    private String title;
    private double price;
    private Person person; // 一本书属于一个人
    public Book(String title,double price){ // 通过构造设置属性内容
        this.setTitle(title);
        this.setPrice(price);
    }
    public String getTitle(){
        return title;
    }
    public void setTitle(String  t){
        title = t;
    }
    public double getPrice(){
        return price;
    }
    public void setPrice(double p){
        price = p;
    }
    public Person getPerson(){
        return person;
    }
    public void setPerson(Person person){
        this.person = person;
    }
}

public class Test{
    public static void main(String[] args) {
        Person per = new Person("李明",30);
        Book bk = new Book("Java",90.0);
        per.setBook(bk);
        bk.setPerson(per);
        System.out.println("从人找到书 --> 姓名:"+per.getName() + "; 年龄:" + per.getAge() +
                "; 书名" + per.getBook().getTitle() + "; 价格:" + per.getBook().getPrice() );
        System.out.println("从书找到人 --> 书名:"+bk.getTitle() + "; 价格:" + bk.getPrice() +
                "; 姓名:" + bk.getPerson().getName() + "; 年龄:" + bk.getPerson().getAge() );
    }
}

在这里插入图片描述

四、范例(2)进一步深入一对一关系

上述完成了一个基本的关系,现在有一个新的要求:一个人有一个孩子,每个孩子还会有一本书。
因为孩子也是一个人,此时只需要简单修改 Person类即可,在类中增加一个自己的引用。

class Person{
    private String name;
    private int age;
    private Book book;
    private Person child; //一个人有一个孩子
    public Person(String name,int age){ // 通过构造设置内容
        this.setName(name);
        this.setAge(age);
    }
    public String getName(){
        return name;
    }
    public void setName(String n){
        name = n;
    }
    public int getAge(){
        return age;
    }
    public void setAge(int a){
        age = a;
    }
    public Book getBook(){ // 得到本人的书
        return book;
    }
    public void setBook(Book b){ // 设置本人的书
        book = b;
    }
    public void setChild(Person child){
        this.child = child;
    }
    public Person getChild(){
        return child;
    }
}

class Book{
    private String title;
    private double price;
    private Person person;
    public Book(String title,double price){ // 通过构造设置属性内容
        this.setTitle(title);
        this.setPrice(price);
    }
    public String getTitle(){
        return title;
    }
    public void setTitle(String  t){
        title = t;
    }
    public double getPrice(){
        return price;
    }
    public void setPrice(double p){
        price = p;
    }
    public Person getPerson(){
        return person;
    }
    public void setPerson(Person person){
        this.person = person;
    }
}

public class Test{
    public static void main(String[] args) {
        Person per = new Person("李明",30);
        Book bk = new Book("Java",90.0);
        Person cld = new Person("李月",18); // 定义一个孩子
        Book b = new Book("JAVAEE",88.0); // 定义孩子有的书
        per.setBook(bk);
        bk.setPerson(per);
        cld.setBook(b); //设置对象间的关系:一个孩子有一本书
        b.setPerson(cld); //一本书属于一个孩子
        per.setChild(cld); //一个人有一个孩子
        System.out.println("从人找到书 --> 姓名:"+per.getName() + "; 年龄:" + per.getAge() +
                "; 书名" + per.getBook().getTitle() + "; 价格:" + per.getBook().getPrice() );
        System.out.println("从书找到人 --> 书名:"+bk.getTitle() + "; 价格:" + bk.getPrice() +
                "; 姓名:" + bk.getPerson().getName() + "; 年龄:" + bk.getPerson().getAge() );
        System.out.println("从人找到书再找到孩子 --> 姓名:"+per.getName() + "; 孩子姓名:" + per.getChild().getName() +
                "; 孩子的书名:" + per.getChild().getBook().getTitle());
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值