【问题标题】:Is it possible to call non-static method without instance creation?是否可以在不创建实例的情况下调用非静态方法?
【发布时间】:2015-11-04 14:15:14
【问题描述】:

对我来说很清楚这个问题的答案是NO,但就在今天我来了

Context.setCredentials(userId, pwd.toCharArray());

其中 setCredentials 是非静态方法。 Intellij IDEA 将此突出显示为错误,因此我的项目没有编译,但是,在 Eclipse 中一切正常,它怎么会

解决问题不是问题,但我想了解为什么会发生这种情况。附:我可能会认为这可能是特定于项目的。

更新

在调用 setCredentials 之前,会发生另一个调用:

Context.initContext()

我们在哪里调用了以下方法:

synchronized private static void initContext(String connectionString) {
    if (_this == null) {
        _this = new Context(connectionString);
    }
}

this 在同一个 Context 类中定义如下:

private static Context _this;

似乎它可以工作,如果我们的实例被创建,Eclipse 显示它正确,但是,它在类中,非常奇怪的代码。

【问题讨论】:

  • 发布Context对象的代码
  • 不,这是不可能的。清理你的 Eclipse 项目,它可能很混乱。
  • 确实如此。甚至创建字符串用户; if(user == "") 将产生错误。必须启动变量。
  • 好的,我清理了我的项目,但它仍然解决了所有问题,并且在 Eclipse 中没有显示此行的错误。
  • 我认为可以在 lambda 表达式中传递非静态方法。例如,String::length

标签: java eclipse intellij-idea


【解决方案1】:

清理并重新构建您的项目。要调用任何非静态方法,您必须拥有该类的实例。

注意:您不能在 Java 中的任何静态方法中访问非静态变量,但反向很好,即您可以访问静态变量或从非静态方法调用静态方法,而不会出现任何编译时错误。

【讨论】:

    【解决方案2】:

    好的,答案很明确NO,但现在我将尝试解释为什么会这样。实际上,这里对 Java 没有什么可做的,更多的是关于 IDE,而更多的是关于项目设置

    该项目最初是在 Eclipse 中开发的,但是,在我尝试在 Intellij IDEA 中构建它时,我没有包含 Eclipse 项目设置,因此 IDEA 识别了它作为来源并尝试编译。这就是它抱怨的原因。

    所以,问题是在 Eclipse 中,这个类的文件夹在源代码中包含,然而,所有文件同时排除。因此编译器没有包含这个文件,Eclipse 也没有显示错误。我想注意到,因为我对 Eclipse 没有太多经验,所以很难找到它,而且我没有认识到源文件图标之间的以下区别:

    但是,我认为在 Intellij IDEA 中识别速度可能会更快一些:

    我认为最好对这种情况下结论:如果您没有非常具体的原因,请不要从源文件夹中排除任何文件。如果不维护此代码,最好将其删除或将其移至其他地方。

    【讨论】:

      【解决方案3】:

      答案是 Yes 来自 java 8。这是因为一个称为方法引用(Lambda 表达式)的概念。

      示例: 在图像中,如果您看到“compareToIgnoreCase”实际上是一个 non static 方法,我在没有实际创建 String 类实例的情况下调用了该方法。这个概念称为方法参考。

      【讨论】:

        【解决方案4】:

        这显然是 IDE 错误。

        尝试清理构建,确保没有其他错误。

        你应该尽量不要盲目依赖编译器消息,错误在eclipse和Android Studio中都很常见,甚至Xcode有时也会发疯。

        希望这会有所帮助。

        【讨论】:

        • 嘿,如果你投了反对票,至少留下评论解释原因,如果我不知道我失败的地方,就没有办法变得更好。
        • 我不是反对者,但您的回答没有提供解决方案。 OP 已经表示他/她尝试清理和重建项目。此外,您声明“这显然是一个 IDE 错误。”但是您没有解释是什么使它如此“明显”成为 IDE 错误。我个人认为这不是那么清楚。无论如何,它肯定不能回答这个问题。
        • 不确定这个问题是否有真正的答案,我只是试图把我的一些知识。
        • 如果您不确定是否有答案,那么只需发表评论,而不是答案。最好标记问题。
        猜你喜欢
        • 1970-01-01
        • 2019-09-03
        • 1970-01-01
        • 1970-01-01
        • 2022-06-27
        • 1970-01-01
        • 1970-01-01
        • 2023-01-05
        • 1970-01-01
        相关资源
        最近更新 更多