初学者对象引用问题

时间:2009-11-19 22:04:57

标签: java

如果我在主类中实例化一个对象,请说:

SomeObject aRef = new SomeObject();

然后我从主类中实例化另一个对象,比如说:

AnotherObject xRef = new AnotherObject();

AnotherObject的实例如何使用aRef引用来访问SomeObject中的方法? (使用SomeObject的相同实例)

9 个答案:

答案 0 :(得分:6)

为什么不通过引用原始AnotherObject来实例化SomeObject

e.g。

SomeObject obj = new SomeObject();
AnotherObject obj2 = new AnotherObject(obj);

AnotherObject看起来像:

// final used to avoid misreferencing variables and enforcing immutability
private final SomeObject obj;

public AnotherObject(final SomeObject obj) {
   this.obj = obj;
}

因此AnotherObject引用了之前创建的SomeObject。然后它可以使用此引用来调用方法。如果在AnotherObject范围之外不需要原始对象,则在AnotherObject内创建它并以这种方式强制封装。

答案 1 :(得分:1)

我认为你所问的是关于范围的问题。你问xRef在执行过程中如何使用aRef?答案是aRef引用需要在实例化时传递给xRef对象

xRef = new AnotherObject(aRef)

或实例化之后你可以

xRef.setSomeObject(aRef)

答案 2 :(得分:1)

他的问题的答案是让第一个类成为静态类。

答案 3 :(得分:0)

xRef.SetSomeObject(aRef);

其中SetSomeObject具有类似

的签名
public void SetSomeObject(SomeObject obj)
{
    obj.DoStuff();
}

并且是AnotherObject类型的成员函数。

答案 4 :(得分:0)

战略设计模式和装饰设计模式有两种不同的方式。

例如,您可以:

class AnotherObject
{
    private SomeObject mySomeObject;
    public AnotherObject(SomeObject mySomeObject)
    {
        this.mySomeObject = mySomeObject;
    }

    function doSomethingUsingStrategy()
    {
        mySomeObject.doItTheMySomeObjectWay();
    }

    function setMySomeObject(SomeObject mySomeObject)
    {
        this.mySomeObject = mySomeObject;
    }
}

然后,您可以使用不同的策略:

myAnotherObject.setMySomeObject(new ExtendsSomeObject);
myAnotherObject.doSomethingUsingStrategy()

答案 5 :(得分:0)

您需要在构造函数AnotherObject中使用AnotherObject xRef = new AnotherObject(aRef)或使用setter方法xRex.setSomeObject(aRef)AnotherObject的实例提供aRef的引用。在这种情况下,class AnotherObject { SomeObject aRef; public AnotherObject(SomeObject aRef) { this.aRef = aRef; } public void doSomethingWithSomeObject() { aRef.doSomething(); } } 需要有一个实例变量来存储可以在内部使用的aRef,如:

SomeObject

您还可以将AnotherObject的实例传递给xRef.doSomethingWithSomeObject(aRef)上需要class AnotherObject { public void doSomethingWithSomeObject(SomeObject aRef) { aRef.doSomething(); } } 的方法。

{{1}}

答案 6 :(得分:0)

有很多方法可以做到(正如其他人指出的那样)。你真的想要考虑你的对象结构......

也许你的main方法甚至不应该实例化aRef,也许它应该在xRef的构造函数中实例化(这是xRef往往是aRef功能的“部分”的情况。

如果aRef在某些时候可能有多个实例,您可能根本不想将其存储起来,那么只要xRef方法使用它就可以传入它。

这是您需要在业务逻辑级别考虑对象模型的地方。对象之间有什么关系等。

(我的猜测是你希望xRef实例化aRef并保留引用本身,然后如果你的“main”真的需要与aRef交谈,它可以要求xRef转发消息或者向xRef询问它的aRef实例。 )

答案 7 :(得分:0)

你必须传递参考,然后用它做点什么。

class AnotherObject {
     SomeObject someObject;

     public void setSomeObject( SomeObject some ) {
         this.someObject = some;
     }

     public void doSomethingWithSomeObject() {
         this.someObject.someMethod();
     }

     ..... rest of your code 
 }

这样你就可以在main方法中使用它了

 public static void main( String [] args ) {
     SomeObject xRef = new SomeObject();
     AnotherObject aRef = new AnotherObject();
     // pass the ref... 
     aRef.setSomeObject( xRef );
     // use it
     aRef.doSomethingWithSomeObject();
 }

这就是你需要的吗?

答案 8 :(得分:-1)

AnotherObject可以拥有某种类型为SomeObject的成员或属性吗?这也是解决这个问题的另一种方法。

因此,如果AnotherObject类中存在“SomeObjectMember”成员:

xRef.SomeObjectMember = aRef;