繁体   English   中英

从方法内部对非静态方法进行静态引用

[英]Making a static reference to a non-static method from inside the method

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

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()会更好吗?

首先,您应该更多地了解静态和非静态方法:

静态方法属于类,非静态方法属于类的对象。 也就是说,非静态方法只能在它所属的类的对象上调用。 然而,静态方法既可以在类上也可以在类的对象上调用。 静态方法只能访问静态成员。 非静态方法可以访问静态和非静态成员,因为在调用静态方法时,类可能不会被实例化(如果它是在类本身上调用的)。 在另一种情况下,非静态方法只能在类已经实例化时调用。 静态方法由类的所有实例共享。 这些是一些基本的区别。 我还想指出在这种情况下经常被忽视的差异。 每当在 C++/Java/C# 中调用方法时,都会传递一个隐式参数('this' 引用)和/不带其他参数。 在静态方法调用的情况下,“this”引用不会作为属于类的静态方法传递,因此没有“this”引用。

参考静态与非静态方法

这是如何运作的? myClassInstance仍然以某种方式存在,因为那时我还在myMethod()

myMethod是属于myClassInstance的实例方法。 因此,当您在myMethod()调用myMethod() myMethod()它等效于this.myMethod()

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

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

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

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()会更好吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM