Java 强制在类中执行方法

Java 强制在类中执行方法,java,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. } } 您需要类B中的A

我正在使用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.
  }

}

您需要类
B
中的
A
实例,并在该实例上调用
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
的实例。

在类
B
中需要
A
的实例,并在该实例上调用
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
的实例。

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

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

您还可以声明
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();
  }

}

您还可以声明
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();
  }

}

您需要一个类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;
  }    
}

您需要一个类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;
  }    
}

如果要调用调用您的对象的方法,必须让调用方使用
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();
  }
}

如果要调用调用您的对象的方法,必须让调用方使用
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();
  }
}

好的,是的,只要你有一个
A
的实例可以调用它……我假设你想调用调用它的实例,而不仅仅是任何
A
实例?@Peter Lawrey true。就是so@user1448906:这为您解决了该场景。请看最后一个代码示例。是的,只要您有一个
A
实例可以调用它……我假设您想调用调用它的实例,而不仅仅是任何
A
实例?@Peter Lawrey true。就是so@user1448906:这为您解决了该场景。请参阅最后一个代码示例。这是不可能的。您可以将其添加到问题中。正如我所说,根据你的课程和程序设计,有很多方法可以做到这一点。这是真的。但是你猜,我已经找到了适合我的解决方案。这是不可能的。你可以把它添加到你的问题中。正如我所说,根据你的课程和程序设计,有很多方法可以做到这一点。这是真的。但是你猜,我已经找到了适合我的解决方案。