从实例调用方法

时间:2011-10-06 06:55:21

标签: java oop

假设我有两个类AB,而后者又有一些方法,something()nothing(),并创建了B的实例在A中,作为

public class A {

    public A() {
        B b = new B();
        b.nothing();
    }

    public void something() {
        ...
    }
}

调用b.nothing()是所有标准内容,但实际上b可以调用a.something()的任何方法,假设A的实例被调用{{1} }}。如果没有,为什么在概念上错误?

4 个答案:

答案 0 :(得分:1)

  

是否有任何方法可以通过实例b调用a.something()

您无法在方法中掌握来电者,无法做到这一点。

  

如果没有,为什么这在概念上是错误的?

我立即想到两个问题:

  • 来电者的类型是什么?既然任何人都可以打电话给b.nothing(),你就不能假设它是一个Object会导致很多丑陋的演员。

  • b.nothing()的实施不应该关心关于谁在打电话给他。如果您重构A并将b.nothing()的呼叫转移到其他类,会发生什么?如果b.nothing()突然停止工作,那将是非常令人惊讶的。

答案 1 :(得分:1)

我认为在概念上没有任何错误。

但是,要使机制工作,b需要知道调用A的{​​{1}}实例。为此,something()的构造函数或其B方法需要将nothing()引用作为参数。

示例1:

A

示例2:

public class B {
  public void nothing(A a) {
    ...
    a.something();
    ...
  }
}

示例3:

第三种方式适用于某些情况。如果public class B { private final A a; public B(A a) { this.a = a; } public void nothing() { ... this.a.something(); ... } } B的内部类,则它具有对其A的关联实例的隐式引用。

A

}

答案 2 :(得分:0)

b.nothing()可以调用a.something()的唯一方法是告诉B关于A实例的实例。例如:

b.nothing(this);

其中B.nothing看起来像:

public void nothing(A a)
{
    // Do other stuff
    a.something();
}

或者,您可以将构造函数中的this传递给B,这将保留引用:

B b = new B(this);
b.nothing();

请注意,在构造函数调用期间让this转义通常是一个坏主意 - 您要让B.nothing()调用A.something()对象不是' t完全初始化 - 它的构造函数还没有完成执行。这有时会导致不良和难以诊断的行为。

答案 3 :(得分:0)

要执行此操作,b需要引用a。有两种方法可以提供:

  1. B的构造函数中传递此类引用,或者为B提供适当的setter。
  2. 如果BA的内部类,那么它会隐含地提供这样的引用。