有了一个对象的引用,怎样可以知道包含它的对象的引用呢?比如对象A包含有对象B,对象B的引用传递给了另一个对象C的方法,那么在对象C的方法里,可以怎样得到对象A的引用呢?
好像在AWT里可以调用getParent()来得到,但我只是用基本的Java语言,没有用任何框架,Java语言本身提不提供这种功能呢? 刚从C语言转到Java,在C语言里很容易就可以通过指针得到了,但Java里怎样做在网上找了很久也没有找到答案,只好在这里向各位牛人求教了。
如果对象a拥有对象b的引用,现在在某个方法里你只有b的引用而想得到a的引用,这是原问题的意思对吧?
那么答案就是:你不能,即使C里也不能。
最简单的例子就是链表的实现了。如果在C里,一个链表节点是像这样定义的:
[code="c"]struct Node {
struct Node* next;
void* value;
};[/code]
一个典型的单向链表的节点。那么如果你现在手上有任意一个非空单向链表中任意不是头的节点的指针,你能找到头节点的指针么?
就是因为不能,所以才需要双向链表:
[code="c"]struct Node {
struct Node* prev;
struct Node* next;
void* value;
};[/code]
楼主提到AWT的getParent(),为了实现那个方法的功能,AWT组件里是保留了对parent的引用的。楼主如果需要让自己的对象有双向导航能力,也一样在两边相互保持对方的引用就行。
诚然,C里可以这样:
[code="c"]struct Foo {
/* ... */
};
struct Bar {
Foo foo;
};[/code]
这样Bar里保存的就不是Foo的指针而是Foo的实例。但这与双向导航的实现没关系,取得了foo的指针也不能类型安全的得到Bar的指针。
在Java里只有原始类型能直接嵌在对象里,对引用类型则只能保存其引用。