Java學習之引用傳遞及其應用
阿新 • • 發佈:2018-12-21
介紹一下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
我們分析一下記憶體變化過程
一開始,類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()
);
}
}