静态方法不能直接调用非静态方法



根据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");
}
}

"直接"到底是什么意思,为什么我不能这样做?

它们可能意味着"不使用实例"。这根本不是我定义"直接"的方式。例如,在上面的示例中,如果没有实例来调用hiTheremain就无法调用它。但是一旦它有一个实例(在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
}

我可以通过哪些间接方式做到这一点?

从静态方法调用非静态方法的"间接"方法是首先使用非静态方法构造类的对象(如第二个代码块所示(。

最新更新