[英]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.