簡體   English   中英

如何在Java中創建指向參考變量的指針變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM