强制在类中执行方法

时间:2013-06-19 13:53:52

标签: java

我正在使用Java,我想从类B中调用A类中的方法f2。是否可以这样做?

public class A{
  private B b = new B();

  public void f1(){
    b.f3();
  }

  public void f2(){
    // do something;
  }
}

public class B{
  public void f3(){
    // Call f2 of class A from here.
  }

}

5 个答案:

答案 0 :(得分:3)

您需要在类A中使用B的实例,并在该实例上调用f2。例如,您可以在f3

的主体内实例化一个
public class B {
    public void f3() {
        A a = new A();
        a.f2();
    }
}

另一种方法是f3接收A的实例:

 public class B {
    public void f3(A a) {
        a.f2();
    }
 }

还有另外一种方法,你可以让B实例化一个:

public class B {
    private final A a;
    public B() { this.a = new A(); }
    public void f3() {
         this.a.f2();
    }
}

最后,B可以在其构造函数中接收一个:

 public class B {
     private final A a;
     public B(A a) { this.a = a; }
     public void f3() {
         this.a.f2();
     }
 }

关键在于,如果要在类上调用实例方法,则必须拥有该类的实例

最后,我注意到您A.f1正在调用B.f3,并从那里调用A.f2。所以,看起来你最好的选择是上面的第二个选项。那就是:

public class A {
    private final B = new B();
    public void f1() { this.b.f3(this); }
    public void f2() { /* do something */ }
}

public class B {
    public void f3(A a) { a.f2(); }
}

这里的关键是我们将A的实例传递给B.f3。我们实现这一目标的方法是传递this引用,它是对当前正在执行的实例的引用。在A.f1中,这将是当前正在执行的A的实例。

答案 1 :(得分:1)

你需要一个A类实例才能做到这一点。

public class A{
  private B b = new B();

  public void f1(){
    b.f3(this);
  }

  public void f2(){
    // do smthing;
  }
}

public class B{
  public void f3(A a){
    a.f2(); // Call f2 of class A from here.
  }    
}

这种类型的代码结构通常比有用的更令人困惑。我建议改为做。

public class A{
  private B b = new B();

  public void f1(){
    WhatAf2Needs w = b.f3();
    f2(w);
  }

  public void f2(WhatAf2Needs w){
    // do smthing;
  }
}

public class B{
  public WhatAf2Needs f3(A a){
    return WhatAf2Needs;
  }    
}

答案 2 :(得分:1)

如果你想调用一个叫你的东西的方法,你必须让调用者使用this关键字来传递自己。在代码中,它将是:

public class A{
  private B b = new B();

  public void f1(){
    b.f3(this);
  }

  public void f2(){
    // do smthing;
  }
}

public class B{
  public void f3(A caller){
    caller.f2();
  }
}

答案 3 :(得分:0)

您必须在类A中实例化类B,并按照当前编写的方式对其进行任何方法调用。

答案 4 :(得分:0)

您也可以声明f2静态,并将其称为A.f2()。这种类型的东西很大程度上取决于你的类的设计。这里的其他答案也非常有效。

public class A{
  private B b = new B();

  public void f1(){
    b.f3();
  }

  public static void f2(){
    // do smthing;
  }
}

public class B{
  public void f3(){
    A.f2();
  }

}