如何从另一个类调用非静态抽象方法

Posted

技术标签:

【中文标题】如何从另一个类调用非静态抽象方法【英文标题】:How to call a non static abstract method from another class 【发布时间】:2014-04-05 00:07:35 【问题描述】:

这是我的抽象类的标题

public abstract class RecursiveGo extends JFrame implements ActionListener

我想从这个类中取出一个方法,它是非静态的,并在这个类的驱动程序的main方法中调用它。我还没有制作驱动程序,但我知道如果我将这个类扩展到驱动程序并将驱动程序作为子类,它会出现错误,因为我不会覆盖 actionlistener。如何在非抽象驱动程序中从这个抽象类调用非静态方法?

【问题讨论】:

【参考方案1】:

如果有一个有用的非静态方法依赖于类的子集(即不依赖于 ActionListener),但整个类必须保持抽象,听起来那里有一条干净的分隔线.重构类以提取子集,并将其提供给您的驱动程序。

public abstract class RecursiveGo extends JFrame implements ActionListener 

  private final UsefulSubset usefulSubset;

  public RecursiveGo() 
    usefulSubset = new UsefulSubset();
  

  // Static, so you can address it as RecursiveGo.UsefulSubset.
  // Maybe it extends JFrame, too, and if made a top-level class
  // then RecursiveGo could further subclass the subset.
  public static class UsefulSubset 
    void methodCall 
  


class YourDriver 
  public static void main(String[] args) 
    RecursiveGo.UsefulSubset instance = new RecursiveGo.UsefulSubset();
    instance.methodCall();
  

当然,也许这个有用的子集可以作为一个***类独立存在,这样会更好。代码具有延展性,如果它的形状不符合您的喜好,请随意更改形状。

正如 ajb 在 cmets 中指出的那样,看看将方法设为静态是否值得。就我个人而言,我更喜欢依赖注入和模拟框架,所以我不喜欢搬山让方法成为静态的,但这当然是解决你问题的简单方法。

【讨论】:

或者他所说的调用的“非静态方法”没有引用任何实例字段,实际上可能是静态的。 @ajb 非常正确,但鉴于 OP 明确表示“非静态”,我该反驳谁? 等等,类声明如何:public static class UsefulSubset 出现在 RecursiveGo 类中? 风格问题;你当然可以把分解出来的类放在而不是inside你的RecursiveGo。如果另一个类中的一个类是static,则它被称为“静态嵌套类”并且仅用于组织。如果不是,那么它被称为“内部类”,并且恰好属于外部类的一个实例。静态嵌套类可以设为私有,并且非常适合隐藏实现细节。 Find out more here. @user3224584 我认为这些问题超出了您原始问题的范围,而是与语法有关。无论如何,我认为有用的答案不适合这个 cmets 领域。我鼓励您使用 Code Review 板或 Java 聊天室为您的实现提供进一步的具体帮助。【参考方案2】:

在其驱动程序中创建一个 RecursiveGo 实例,该实例应为其驱动程序(子类)的实例,因为我们无法实例化抽象类的实例。然后调用创建对象的非静态方法,看看是否能解决您的问题。

【讨论】:

通过创建实例我想你的意思是这样做:RecursiveGo g = new RecursiveGo();当我这样做时,我得到一个错误,因为它说你不能实例化一个抽象类。 你是在 RecursiveGo 的子类中创建这个实例吗? 我无法将驱动程序设为子类,因为我无法覆盖 actionlistener 方法(这意味着子类也必须是抽象的)。因此,我无法创建该类的实例(除非您知道如何在保持其功能的同时覆盖 actionlistener)。如果你想让我的驱动程序成为子类,我需要弄清楚如何在抽象类的主方法中调用非静态方法。【参考方案3】:

从技术上讲,您无法在 Java 中完成您所要求的事情。由于实现接口的类必须在该接口中定义方法,因此您必须定义该方法,或者考虑另一种方法来完成您正在尝试做的事情。例如,您可以尝试让 RecursiveGo 不实现 ActionListener,然后扩展 RecursiveGo,然后仍然拥有一个 ActionListener - 您将使用提供的默认 ActionListener(如果存在)。

【讨论】:

以上是关于如何从另一个类调用非静态抽象方法的主要内容,如果未能解决你的问题,请参考以下文章

抽象类借口构造函数静态方法成员

继承抽象static

java中有哪些类型的方法,如何调用它们?

java中级,知识点归纳

抽象类和接口的区别

java接口与抽象方法区别