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