【问题标题】:Making a static reference to a non-static method from inside the method从方法内部对非静态方法进行静态引用
【发布时间】:2018-12-08 12:56:24
【问题描述】:

我了解“无法对非静态方法进行静态引用”错误,但我遇到了这个错误:

public class MyClass {

    public static void main(String[] args) {
        MyClass myClassInstance = new MyClass();        

        while (true) {
            myClassInstance.myMethod();
            myMethod();//Cannot make a static reference to the non-static method myMethod()
        }       
    }// END main

    void myMethod() {
        try {
            //Stuff 
            }
        } catch (Exception e) {
            myMethod();
        }
    }// END myMethod

}// END MyCLass

我不能只从main 调用myMethod(),但我可以从方法本身内部调用(在这种情况下,如果发生异常,我想再次调用myMethod())。

这是如何工作的? myClassInstance 是否还在那里,因为那时我还在 myMethod() 里面?
在课堂上使用static MyClass myClassInstance = new MyClass() 然后每次都调用myClassInstance.myMethod() 会更好吗?

【问题讨论】:

  • 当然不能。另一个方法是 MyClass 类实例的一部分,而不是类本身。你真的应该了解类和对象方法
  • myMethod 是一个 instance 方法。调用使用myMethod() 等价于this.myMethod()。在作为实例方法的 myMethod() 内部,this 存在:它是当前对象。在 static 方法 main() 内部,没有this。所以这个电话没有意义。

标签: java static static-methods non-static


【解决方案1】:

首先你应该了解更多关于静态和非静态方法的知识:

一个静态方法属于该类 并且非静态方法属于 一个类的对象。这是一个 只能调用非静态方法 在一个类的对象上 属于。静态方法可以 但是在课堂上都被称为 以及类的对象。一种 静态方法只能访问静态 成员。非静态方法可以 访问静态和非静态 成员因为当时 调用静态方法,类 可能不会被实例化(如果是 调用类本身)。在里面 其他情况下,非静态方法可以 仅在类有时调用 已经实例化了。一个静态的 方法由所有实例共享 班上。这些是一些基本的 差异。我也想要 指出一个经常被忽视的差异 在这种情况下。每当一个方法是 在 C++/Java/C# 中调用,隐式 参数(“this”引用)是 与/不与其他一起传递 参数。如果是静态方法 调用,'this' 引用不是 作为静态方法传递的属于 类,因此没有“这个” 参考。

参考Static Vs Non-Static methods

这是如何工作的? myClassInstance 仍然存在,因为在 那一点我还在myMethod()里面?

myMethod 是属于myClassInstance 的实例方法。所以当你在myMethod() 中调用myMethod() 时,它相当于this.myMethod()

在课堂级别使用static MyClass myClassInstance = new MyClass(),然后每次调用myClassInstance.myMethod() 会更好吗?

当我们将类的成员声明为静态时,这意味着无论创建多少类对象,静态成员都只有一个副本。静态成员由类的所有对象共享。如果不存在其他初始化,则在创建第一个对象时将所有静态数据初始化为零。欲了解更多信息,请访问Static Variables : Good or Bad?

【讨论】:

    猜你喜欢
    • 2011-06-25
    • 2023-04-02
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多