[英]How do I create a pointer variable to a reference variable in Java?
我想制作一個變量,使其指向其他參考變量所指向的內容,這樣,如果我更改了參考變量所指向的位置,則指針變量也將自動指向該新位置。
例如,假設我認為我最喜歡的書是我當地圖書館最喜歡的書。 如果我的圖書館更改了他們最喜歡的書,我會自動認為這是我最喜歡的書。
這是一些代碼來演示我的意思:
Book littleWomen = new Book("Little Women");
Book dracula = new Book("Dracula");
Book libraryFavourite = litteWomen;
Book myFavourite = libraryFavourite; //myFavoutie is now littleWomen
libraryFavourite = dracula; //i want myFavourite to update to point to dracula, now.
在上面的代碼中,更改libraryFavourite
指向的內容並不會自動更改myFavourite
指向的內容。 它一直指向着littleWomen
。
我理解上面的代碼為什么不起作用,因為我是說我想“這樣做”。 我知道引用變量保存內存地址,因此myFavourite = libraryFavourite
只是將libraryFavourite
指向的內存地址分配到myFavourite
,因此將來對libraryFavourite
所做的更改不會更改myFavourite
。 我只包含上面的代碼來幫助闡明我想要的行為,但是了解我將需要一種不同的方法來實現。
該鏈接討論了對類的別名(並且收到的回答基本上是無法完成的)。 不過,別名並不是我想要做的,因為我想自由地更改myFavourite
以停止指向圖書館最喜歡的書,而不是指向其他內容(例如,我剛發現的一些新書,愛上了)。
要實現這種行為,您必須將引用存儲在對象中,而不是本地值中。 它永遠不會像您期望的那樣工作。 變量僅指向對象,如果更改它,則僅使其指向不同的對象-您也不能更改根對象!
Favorite libraryFavorite = new Favorite(littleWomen);
Favorite myFavorite = libraryFavorite;
libraryFavorite.set(dracula);
//now myFavorite.get also points to dracula
而收藏夾只是參考持有者:
public class Favorite {
private Book book;
public Favorite(Book book) {
this.book = book;
}
public void set(Book newBook) {
this.book = newBook;
}
public Book get() {
return book;
}
}
沒有辦法做到這一點。 當您將一個參考(referenceA)分配給另一個參考(referenceB)時。 referenceA復制了referenceB的內存地址,僅此而已。 referenceA忘了referenceB。 如果referenceB指向另一個內存地址,則該更改不適用於referenceA。
一種解決方法是讓您的書類具有一個構造函數,該構造函數將另一本書作為參數,在首次初始化它時使用它,然后對其進行突變。 也許您想要一個子類,以便將喜歡的Book
視為Book
。 實際上,我建議您不要這樣做,而應該為書准備一個吸氣劑,然后執行favourite.get().whateverYouWantToDoWithMe();
然后,您可以這樣做:
Book littleWomen = new Book("Little Women");
Book dracula = new Book("Dracula");
Book libraryFavourite = new Book(littleWomen);
Book myFavourite = libraryFavourite; //myFavourite is now littleWomen
libraryFavourite.setBook(dracula); //myFavourite is now dracula
在仍然允許Book
不可變的同時實現此功能的一種可能方法如下:
public class ReferenceBook extends Book {
private Book book;
public ReferenceBook(Book book) {
this.book = book;
}
public void setBook(Book book) {
this.book = book;
}
public boolean equals(Object o){
if (o instanceof Book) {
return o.equals(book);
}
return false;
}
// and so on for other methods
}
然后,您可以這樣做:
Book littleWomen = new Book("Little Women");
Book dracula = new Book("Dracula");
ReferenceBook libraryFavourite = new ReferenceBook(littleWomen);
Book myFavourite = libraryFavourite; //myFavourite is now littleWomen
libraryFavourite.setBook(dracula); //myFavourite is now dracula
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.