本章目标
掌握三种引用传递的操作范例
掌握引用传递的应用
引用传递(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
* */
}