根据javatpoint编写的限制,静态方法不能直接调用非静态方法。"直接"到底是什么意思,为什么我不能这样做?是的,我可以通过哪些间接方式做到这一点?
根据javatpoint编写的限制,静态方法不能直接调用非静态方法。
当然可以。他们只需要一个实例来调用它们。下面是直接调用非静态方法的静态方法的示例:
class Example {
public static void main(String[] args) {
Example e = new Example();
e.hiThere(); // <========== Direct call to instance method
go(e);
}
private static void go(Example e) {
e.hiThere(); // <========== Direct call to instance method
}
private void hiThere() {
System.out.println("Hi there");
}
}
"直接"到底是什么意思,为什么我不能这样做?
它们可能意味着"不使用实例"。这根本不是我定义"直接"的方式。例如,在上面的示例中,如果没有实例来调用hiThere
,main
就无法调用它。但是一旦它有一个实例(在main
的情况下,通过创建一个实例(,它就可以直接调用hiThere
。同样在示例中,go
可以直接调用hiThere
;它接收一个实例作为参数。
是的,我可以通过哪些间接方式做到这一点?
它们不是间接的:您需要一个实例来调用该方法。但是,当静态方法具有实例时,调用实例方法与调用任何其他方法一样直接。
这意味着如果你有一个实例方法a
你不能从静态方法调用它b
所以
void a() {
// ...
}
static void b() {
a();
}
无效。
你不能这样做,因为静态方法没有在实例中运行,所以它不知道在哪个实例上调用该方法。
这里的"直接"意味着你没有在对象上调用该方法。
例如
public class Foo {
public static void method1() {
Foo myFoo = new Foo();
myFoo.method2(); // This is OK - we're calling method2 on an object.
method2(); // This doesn't compile - we're trying to call method2 directly.
}
public void method2() {
System.out.println("This is method2");
}
}
因此,当存在调用非静态方法的对象时,静态方法可以调用非静态方法。 但是直接调用,而不引用对象,是无法完成的。
当然,您可以直接从另一个静态方法调用一个静态方法。 您也可以直接从一个非静态方法调用另一个非静态方法。
静态方法绑定到类。 非静态方法绑定到类(对象(的实例。
这意味着您可以像这样(直接(调用静态方法:
SomeClass.someStaticMethod();
但是要调用非静态方法,你需要先构造一个类的对象(这就是你所说的"间接"的意思(:
SomeClass obj = new SomeClass();
obj.someNonStaticMethod();
因此,如果您处于静态方法中,则处于任何对象实例之外。这意味着不能调用非静态方法。Java不会神奇地知道你想在什么对象上工作/执行该方法。
public static void someStaticMethod()
{
//You aren't working with any object here
}
但是,如果您使用的是非静态方法,则位于对象实例内部。这意味着您可以调用您现在正在使用的对象的其他非静态方法。这些都是类中的非静态方法(和超类,如果它们正确设置了访问修饰符(。
public void someNonStaticMethod()
{
//This is valid now.
this.someOtherNonStaticMethod(); //"this." is optional
}
public void someOtherNonStaticMethod()
{
//Do some stuff
}
我可以通过哪些间接方式做到这一点?
从静态方法调用非静态方法的"间接"方法是首先使用非静态方法构造类的对象(如第二个代码块所示(。