如何在Java中为引用变量创建指针变量?

时间:2014-10-28 01:02:34

标签: 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。我只包含上面的代码来帮助澄清我想要的行为,但是理解我需要一种不同的方法来实现。

This链接谈论了一个类的别名(收到的答案基本上是无法完成的)。但是,别名并不是我想做的,因为我希望可以自由地改变myFavourite以停止指向图书馆最喜欢的书,而不是其他东西(例如,一些新书,我新近发现并爱上了。)

3 个答案:

答案 0 :(得分:3)

要实现此类行为,您必须在对象中存储引用而不是本地值。 它应该永远不会像你期待的那样工作。变量只指向对象,如果你改变它,你只需要指向不同的对象 - 你也不能改变根对象!

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;
  }
}

答案 1 :(得分:0)

没有办法做到这一点。将引用(referenceA)分配给另一个引用(referenceB)时。 referenceA复制referenceB的内存地址和它的内存地址。 referenceA忘了referenceB。如果referenceB指向另一个内存地址,则该更改不适用于referenceA。

答案 2 :(得分:0)

一种解决方法是让你的书类有一个构造函数,它将另一本书作为参数,在你第一次初始化它时使用它,然后改变它。也许您需要一个子类,因此您可以将收藏夹视为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