本章目標
- 掌握三種引用傳遞的操作范例
- 掌握引用傳遞的作用
1风范、具體內(nèi)容
1.1、三道引用傳遞范例
范例一:
class Demo{
int temp = 30 ; // 此處為了方便沪么,屬性暫時不封裝
};
public class RefDemo01{
public static void main(String args[]){
Demo d1 = new Demo() ; // 實例化Demo對象硼婿,實例化之后里面的temp=30
d1.temp = 50 ; // 修改temp屬性的內(nèi)容
System.out.println("fun()方法調(diào)用之前:" + d1.temp) ;
fun(d1) ;
System.out.println("fun()方法調(diào)用之后:" + d1.temp) ;
}
public static void fun(Demo d2){ // 此處的方法由主方法直接調(diào)用
d2.temp = 1000; // 修改temp值
}
};
輸出結(jié)果:
fun()方法調(diào)用之前:50
fun()方法調(diào)用之后:1000
范例二:
public class RefDemo02{
public static void main(String args[]){
String str1 = "hello" ; // 實例化字符串對象
System.out.println("fun()方法調(diào)用之前:" + str1) ;
fun(str1) ; // 調(diào)用fun()方法
System.out.println("fun()方法調(diào)用之后:" + str1) ;
}
public static void fun(String str2){ // 此處的方法由主方法直接調(diào)用
str2 = "MLDN" ; // 修改字符串內(nèi)容
}
};
輸出結(jié)果:
fun()方法調(diào)用之前:hello
fun()方法調(diào)用之后:hello
范例三:
class Demo{
String temp = "hello" ; // 此處為了方便,屬性暫時不封裝
};
public class RefDemo03{
public static void main(String args[]){
Demo d1 = new Demo() ; // 實例化Demo對象禽车,實例化之后里面的temp=30
d1.temp = "world" ; // 修改temp屬性的內(nèi)容
System.out.println("fun()方法調(diào)用之前:" + d1.temp) ;
fun(d1) ;
System.out.println("fun()方法調(diào)用之后:" + d1.temp) ;
}
public static void fun(Demo d2){ // 此處的方法由主方法直接調(diào)用
d2.temp = "MLDN"; // 修改temp值
}
};
輸出結(jié)果:
fun()方法調(diào)用之前:world
fun()方法調(diào)用之后:MLDN
1.2寇漫、接收本類引用
例如,現(xiàn)在有以下一道程序:
class Demo{ // 定義Demo類
private int temp = 30 ; // 聲明temp屬性并封裝
public void fun(Demo d2){ // 接收本類的引用
d2.temp = 50 ; // 直接通過對象調(diào)用本類的私有屬性
}
public int getTemp(){ // getter
return temp ;
}
public void setTemp(int t){ // setter
temp = t ;
}
};
public class RefDemo04{
public static void main(String args[]){
Demo d1 = new Demo() ; // 實例化Demo對象
d1.setTemp(50) ; // 只能通過setter方法修改內(nèi)容
d1.fun(d1) ; // 此處把Demo的對象傳回到自己的類中
System.out.println("temp = " + d1.getTemp()) ;
}
};
現(xiàn)在按照引用傳遞的方式將其傳入到其內(nèi)部殉摔,就相當(dāng)于自己接受自己本類的引用對象州胳。
輸出結(jié)果:
temp =50
只要是符合了引用傳遞的語法,則可以向任意的地方傳遞逸月。
1.3栓撞、范例講解:一對一關(guān)系
實際上使用引用傳遞,可以表述出生活中以下一種場景彻采。例如:一個人有一本書腐缤,一本書屬于一個人。從這樣一句話中可以得出這樣的結(jié)論:人應(yīng)該是一個具體的類肛响、書也應(yīng)該是一個具體的類岭粤,在人的類中應(yīng)該存在一個屬性表示書的,在書的類中也應(yīng)該存在一個屬性表示人特笋。
class Person{ // 定義Person類
private String name ; // 姓名
private int age ; // 年齡
private Book book ; // 一個人有一本書
public Person(String name,int age){
this.setName(name) ;
this.setAge(age) ;
}
public void setName(String n){
name = n ;
}
public void setAge(int a){
age = a ;
}
public String getName(){
return name ;
}
public int getAge(){
return age ;
}
public void setBook(Book b){
book = b ;
}
public Book getBook(){
return book ;
}
};
class Book{ // 定義Book類
private String title ; // 標題
private float price ; // 價格
private Person person ; // 一本書屬于一個人
public Book(String title,float price){
this.setTitle(title) ;
this.setPrice(price) ;
}
public void setTitle(String t){
title = t ;
}
public void setPrice(float p){
price = p ;
}
public String getTitle(){
return title ;
}
public float getPrice(){
return price ;
}
public void setPerson(Person p){
person = p ;
}
public Person getPerson(){
return person ;
}
};
public class RefDemo05{
public static void main(String arg[]){
Person per = new Person("張三",30) ;
Book bk = new Book("JAVA SE核心開發(fā)",90.0f) ;
per.setBook(bk) ; // 設(shè)置兩個對象間的關(guān)系剃浇,一個人有一本書
bk.setPerson(per) ; // 設(shè)置兩個對象間的關(guān)系,一本書屬于一個人
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()) ; // 也可以通過書找到其所有人
}
};
輸出結(jié)果:
從人找到書 --> 姓名:張三堤如;年齡:30蒲列;書名:JAVA SE核心開發(fā)窒朋;價格:90.0
從書找到人 --> 書名:JAVA SE核心開發(fā);價格:90.0蝗岖;姓名:張三侥猩;年齡:30
1.3、范例講解:進一步深入一對一關(guān)系
以上已經(jīng)玩曾了一個基本的關(guān)系抵赢,但是現(xiàn)在有了一個新的要求:一個人有一個孩子欺劳,每個孩子還會有一本書,那么該如何分析呢铅鲤?難道再單獨建立一個孩子類嗎划提?很明顯這樣做是很不可取的,因為一個孩子也是一個人邢享,所以此時腔剂,只需要簡單的修改Person類即可,在類中增加一個自己的引用驼仪。
class Person{ // 定義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 void setName(String n){
name = n ;
}
public void setAge(int a){
age = a ;
}
public String getName(){
return name ;
}
public int getAge(){
return age ;
}
public void setBook(Book b){
book = b ;
}
public Book getBook(){
return book ;
}
public void setChild(Person c){
child = c ;
}
public Person getChild(){
return child ;
}
};
class Book{ // 定義Book類
private String title ; // 標題
private float price ; // 價格
private Person person ; // 一本書屬于一個人
public Book(String title,float price){
this.setTitle(title) ;
this.setPrice(price) ;
}
public void setTitle(String t){
title = t ;
}
public void setPrice(float p){
price = p ;
}
public String getTitle(){
return title ;
}
public float getPrice(){
return price ;
}
public void setPerson(Person p){
person = p ;
}
public Person getPerson(){
return person ;
}
};
public class RefDemo06{
public static void main(String arg[]){
Person per = new Person("張三",30) ;
Person cld = new Person("張四",10) ; // 定義一個孩子
Book bk = new Book("JAVA SE核心開發(fā)",90.0f) ;
Book b = new Book("一千零一夜",30.3f) ;
per.setBook(bk) ; // 設(shè)置兩個對象間的關(guān)系掸犬,一個人有一本書
bk.setPerson(per) ; // 設(shè)置兩個對象間的關(guān)系,一本書屬于一個人
cld.setBook(b) ; // 設(shè)置對象間的關(guān)系绪爸,一個孩子有一本書
b.setPerson(cld) ; // 設(shè)置對象間的關(guān)系湾碎,一本書屬于一個孩子
per.setChild(cld) ; // 設(shè)置對象間的關(guān)系,一個人有一個孩子
System.out.println("從人找到書 --> 姓名:" + per.getName()+"奠货;年齡:"
+ per.getAge() +"介褥;書名:" + per.getBook().getTitle() + ";價格:"
+ per.getBook().getPrice()) ; // 可以通過人找到書
System.out.printl("從書找到人 --> 書名:" + bk.getTitle() + "递惋;價格:"
+ bk.getPrice() + "柔滔;姓名:" + bk.getPerson().getName() + ";年齡:"
+ bk.getPerson().getAge()) ; // 也可以通過書找到其所有人
// 通過人找到孩子萍虽,并找到孩子所擁有的書
System.out.println(per.getName() + "的孩子 --> 姓名:"
+ per.getChild().getName() + "睛廊;年齡:" + per.getChild().getAge()
+ ";書名:" + per.getChild().getBook().getTitle() + "杉编;價格:"
+ per.getChild().getBook().getPrice()) ;
}
};
輸出結(jié)果:
從人找到書 -->姓名:張三超全;年齡:30;書名:JAVA SE核心開發(fā)邓馒;價格:90.0
從書找到人 -->書名:JAVA SE核心開發(fā)嘶朱;價格:90.0;姓名:張三光酣;年齡:30
張三的孩子 -->姓名:張四疏遏;年齡:10;書名:一千零一夜;價格:30.3
2财异、總結(jié)
以上所用應(yīng)用范例下翎,到現(xiàn)在為止,只是在完成一些細小的模型宝当,但是這些模型都將成為日后Java EE開發(fā)中最重要的部分。希望可以反復(fù)理解引用傳遞的關(guān)系胆萧,并可以利用引用傳遞完成一些小的關(guān)系模型庆揩。