当前位置: 首页 > 知识库问答 >
问题:

尝试使用Java实现接口时调用非静态方法

商和颂
2023-03-14

我正在做一个简单的计算器分配,我需要在代码的实现中使用一个Java接口。我已经将接口设置如下:

public interface OperationInterface {

    // create symbolic constants to define operation options
    static final int ADDITION = 1;
    static final int SUBTRACTION = 2;
    static final int MULTIPLICATION = 3;
    static final int DIVISION = 4;

    // return answer to requested calculation as a string
    public String toString(int argumentOne, int argumentTwo);
}

然后我有我的“添加”类,如下所示:

public class Add implements OperationInterface {
    // override toString method by returning answer to calculation as a string
    public String toString(int argumentOne, int argumentTwo)
    {
        return "" + (argumentOne + argumentTwo);
    }
}

然后,我尝试从我的客户端进程调用这个Add.toString()方法,如下所示:

mOut.print(Add.toString(argumentOne, argumentTwo));

其中mOut是一个ActivityInterface。我目前的问题是toString在Android Studio中用红色下划线,错误是“无法从静态上下文引用非静态方法toString(int, int)”。如果我将toString方法设为静态,我在Add类中会收到不同的错误。我想我的方法是错误的,所以我希望得到一些指导。

另外,我想使用我的静态最终int来确定要调用哪个类,例如,如果(操作== ADDITION),然后调用Add.toString(int,int),并且类似于减法,乘法和除法类。我目前看不到这样做的方法,所以再次非常感谢任何指导。谢谢

共有2个答案

马涵蓄
2023-03-14

您的“toString”方法不是静态的,因此如果不为它所在的类创建对象,就无法调用它。

如果方法“toString”是一个静态方法,您的代码将会工作,因为静态方法属于类而不是对象,您可以用类名直接调用它。这就是为什么它说“非静态方法toString(int,int)不能从静态上下文中引用”,因为你试图以静态方式访问一个非静态的方法。

为该类创建一个对象,并从中调用所需的方法。

东方海
2023-03-14

您的接口定义了特定于实例的行为,但您正在尝试调用Add。toString,就像它是一个静态方法一样。它不是,它是一个实例方法。

要使用实例方法,必须有一个实例:

Add a = new Add();
mOut.print(a.toString(argumentOne, argumentTwo));

关于根据< code>operation变量选择使用哪个操作,我可能会使用< code >开关:

switch (operation) {
    case ADDITION:
        // ...
        break;
    case SUBTRACTION:
        // ...
        break;
    //...and so on...
}

记住要有一个< code>default子句。

在生产代码中可能(也可能不会)使用其他方法(使用< code>Map

非常小心,不要在这里实际做作业(因为这会对您不利,剥夺学习机会),但是您可能会使用< code>switch来创建实例,而不是实际调用< code>toString。例如,代码可能非常粗略

  • 声明没有初始值的变量
  • 使用开关为其分配适当的实例
  • 切换后,在其上调用字符串

这意味着变量需要是操作界面类型,而不是添加(或减去等)。这可能是练习的重点。

附注:与其连接空字符串来将 int 转换为字符串,不如例如

return "" + (argumentOne + argumentTwo);

考虑String.valueOf(int),例如:

return String.valueOf(argumentOne + argumentTwo);
 类似资料:
  • 问题内容: Java-8允许在接口内部定义静态方法,但仅通过接口名称限制其调用: 9.4:接口可以声明静态方法,这些方法在不引用特定对象的情况下被调用。 例如: 导致错误: 在JLS中,这种禁令经常有一种解释。在这种情况下,我没有发现任何详细信息。因此,我正在寻找对此规则的全面或权威的解释:为什么禁止通过特定的对象引用调用静态方法?它有什么坏处? 问题答案: 相当强烈的共识是,有关类的静态方法也不

  • 问题内容: 当我需要一堆无状态实用程序方法时,Java 8中的最佳实践是什么。有一个 不会 被任何人(即and)实现的接口是正确的吗?还是采用旧方法-具有并使用私有构造函数|| 更好?枚举? 问题答案: 接口的主要目的是提供一种类型和对该类型的操作词汇(方法)。它们之所以有用且灵活,是因为它们允许多个实现,并且实际上,它们旨在允许在类层次结构中不相关的实现。 问题问, 具有任何人都不会实现的接口是

  • 问题内容: 尝试在静态类中调用非静态方法时遇到错误。 无法从类型播放中静态引用非静态方法methodName() 我不能使该方法静态,因为这也给我一个错误。 此静态方法无法从xInterface隐藏实例方法 有什么办法可以在另一个静态方法中轮回调用非静态方法?(这两种方法位于单独的包和单独的类中)。 问题答案: 从静态方法中调用非静态方法的唯一方法是使类的实例包含非静态方法。根据定义,非静态方法是

  • 我是C#新手,我不明白编译器为什么不抱怨这段代码。以下是类的层次结构: 执行代码: 执行时<代码>---- 当决定调用什么函数时--运行时还是编译时?如果我弄脏了一个新的< code>class CAble : IAble怎么办?

  • 我最近对 PHP 5.4 进行了更新,但收到有关静态和非静态代码的错误。 这是错误: 这是第371行: 我希望有人能帮忙。

  • 这个问题相当复杂,我不知道以前是否有人问过,因为我不知道如何在搜索框中表达这个问题。 下面是代码: 静态成员将在更多静态方法中再次使用,但我需要首先将其时区设置为“UTC”。有没有方法调用<code>。setTimeZone(“UTC”)一劳永逸?或者我必须调用<code>。setTimeZone(“UTC”)在每个静态方法中?