引用传递及其应用

本章目标
掌握三种引用传递的操作范例
掌握引用传递的应用

 

引用传递(1)

class Demo01{
	int temp = 30;//此处为了访问方便,属性暂不封装
}
public class RefDemo01 {
	public static void main(String[] args) {
		Demo01 d1 = new Demo01();
		d1.temp = 50;
		System.out.println("fun() 方法调用之前:"+d1.temp);
		fun(d1);
		System.out.println("fun() 方法调用之后:"+d1.temp);
	}
	public static void fun(Demo01 d2){//此处的方法由主方法直接调用
		d2.temp = 1000;
	}
/*结果:
 * fun() 方法调用之前:50
 * fun() 方法调用之后:1000
 * */
}

 

引用传递(1) —— 内存分析

 

引用传递(2)

public class RefDemo02 {
	public static void main(String[] args) {
		String str1 = "hello";//实例化字符串对象
		System.out.println("fun() 方法调用之前:"+str1);
		fun(str1);//调用 fun() 方法
		System.out.println("fun() 方法调用之后:"+str1);
	}
	public static void fun(String str2){//此处的方法由主方法直接调用
		str2 = "chaoyi";//修改字符串内容
	}
/*结果:
 * fun() 方法调用之前:hello
 * fun() 方法调用之后:hello
 * */
}

 

引用传递(2) —— 内存分析

 

 引用传递(3)

class Demo03{
	String temp = "hello";//此处为了访问方便,属性暂不封装
}
public class RefDemo03 {
	public static void main(String[] args) {
		Demo03 d1 = new Demo03();//实例化对象
		d1.temp = "world";//修改对象中的 temp 属性
		System.out.println("fun() 方法调用之前:"+d1.temp);
		fun(d1);//调用 fun()方法
		System.out.println("fun() 方法调用之后:"+d1.temp);
	}
	public static void fun(Demo03 d2){//此处的方法由主方法直接调用
		d2.temp = "chaoyi";//修改属性的内容
	}
/*结果:
 * fun() 方法调用之前:world
 * fun() 方法调用之后:chaoyi
 * */
}

 

引用传递(3) —— 内存分析

  

 接收本类的引用

 

class Demo04{//定义 Demo04 类
	private int temp = 30;//声明 temp 属性并封装
	public void fun(Demo04 d2){//接收本类的引用
		d2.temp = 50;//直接通过对象调用本类的私有属性
	}
	public int getTemp() {//getter 方法
		return temp;
	}
	public void setTemp(int temp) {//setter 方法
		this.temp = temp;
	}
}
public class RefDemo04 {
	public static void main(String[] args) {
		Demo04 d1 = new Demo04();//实例化 Demo04 对象
		d1.setTemp(50);//修改 temp 内容
		d1.fun(d1);//此处把 Demo04 的对象传回到自己的类中
		System.out.println("temp = "+d1.getTemp());
	}
/*结果:
 * temp = 50
 * */
}

 

范例讲解:一对一关系
实际上使用引用传递,还可以表示出生活中的以下一种场景,例如:一个人有一本书,一本书属于一个人。从这样一句话中可以得出这样的结论:人应该是一个具体的类、书也应该是一个具体的类,在人的类中应该存在一个属性表示书的,在书的类中也应该存在一个属性表示人。

 

class Person {//定义 Person 类
	private String name;//姓名
	private int age;//年龄
	private Book book;//一个人有一本书
	
	public Person(String name, int age) {//通过构造设置内容
		this.name = name;
		this.age = 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 Person person;//一本书属于一个人
	public Book(String title, float price) {//通过构造设置属性内容
		this.title = title;
		this.price = 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 Person getPerson() {//得到书的所有人
		return person;
	}
	public void setPerson(Person person) {//设置书的所有人
		this.person = person;
	}
}
public class RefDemo05 {
	public static void main(String[] args){
		Person per = new Person("张三", 30);//实例化 Person 对象
		Book bk = new Book("java 编程书", 92.0f);//实例化 Book 对象
		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());
	}
/*结果:
 * 从人找到书 --> 姓名:张三; 年龄30; 书名:java 编程书; 价格:92.0
 * 从书找到人 --> 书名:java 编程书; 价格92.0; 姓名:张三; 年龄:30
 * */
}

 

范例讲解:进一步深入一对一关系
以上已经完成了一个基本的关系,但是现在有了一个新的要求:一个人有一个孩子,每个孩子还会有一本书,那么这该如何分析呢?难道再单独建立一个孩子的类吗?很明显这样做是很不可取的,因为一个孩子也是一个人,所以此时,只需要简单的修改Person类即可,在类中增加一个自己的引用。

 

class person02 {//定义 person02 类
	private String name;//姓名
	private int age;//年龄
	private Book02 Book02;//一个人有一本书
	private person02 child;//一个人有一个孩子
	
	public person02(String name, int age) {//通过构造设置内容
		this.name = name;
		this.age = 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 Book02 getBook02() {//得到本人的书
		return Book02;
	}
	public void setBook02(Book02 Book02) {//设置本人的书
		this.Book02 = Book02;
	}
	public person02 getChild() {//得到孩子
		return child;
	}
	public void setChild(person02 child) {//得到孩子
		this.child = child;
	}
}
class Book02 {
	private String title;//标题
	private float price;//价格
	private person02 person02;//一本书属于一个人
	public Book02(String title, float price) {//通过构造设置属性内容
		this.title = title;
		this.price = 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 person02 getperson02() {//得到书的所有人
		return person02;
	}
	public void setperson02(person02 person02) {//设置书的所有人
		this.person02 = person02;
	}
}
public class RefDemo06 {
	public static void main(String[] args){
		person02 per = new person02("张三", 30);//实例化 person02 对象
		person02 cld = new person02("张草", 10);//定义一个孩子
		Book02 bk = new Book02("java 编程书", 92.0f);//实例化 Book02 对象
		Book02 b= new Book02("一个零一夜",30.3f);//定义孩子有的书
		per.setBook02(bk);//设置两个对象间的关系,一个人有一本书
		bk.setperson02(per);//设置两个对象间的关系,一本书属于一个人
		cld.setBook02(b);//设置对象间的关系,一个孩子有一本书
		b.setperson02(cld);//设置对象间的关系,一本书属于一个孩子
		per.setChild(cld);//设置对象间的关系,一个人有一个孩子
		//可以通过人找到书
		System.out.println("从人找到书 --> 姓名:"+per.getName()+"; 年龄"+per.getAge()+
				"; 书名:"+per.getBook02().getTitle()+"; 价格:"+per.getBook02().getPrice());
		//也可以通过书找到所有人
		System.out.println("从书找到人 --> 书名:"+bk.getTitle()+"; 价格"
				+bk.getPrice()+"; 姓名:"+bk.getperson02().getName()+"; 年龄:"+bk.getperson02().getAge());
		//通过人找到孩子,并找到孩子所拥有的书
		System.out.println(per.getName()+"的孩子 --> 姓名:"+per.getChild().getName()+
				"; 年龄:"+per.getChild().getBook02().getTitle()+"; 价格:"
				+per.getChild().getBook02().getPrice());
	}
/*结果:
 * 从人找到书 --> 姓名:张三; 年龄30; 书名:java 编程书; 价格:92.0
 * 从书找到人 --> 书名:java 编程书; 价格92.0; 姓名:张三; 年龄:30
 * 张三的孩子 --> 姓名:张草; 年龄:一个零一夜; 价格:30.3
 * */
}

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值