根据javatpoint中编写的限制,静态方法不能直接调用非静态方法。 “直接”到底是什么意思,为什么我不能这样做?是的,我可以通过哪些间接方式做到这一点?
答案 0 :(得分:4)
根据用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");
}
}
“直接”到底是什么意思,我为什么不能这样做?
它们可能表示“不使用实例”。这根本不是我直接定义“直接”的方式。例如,在上面的示例中,main
不能在没有实例对其进行调用的情况下调用hiThere
。但是一旦有了实例(在main
的情况下,通过创建一个实例),就可以直接在其上调用hiThere
。同样在示例中,go
可以直接调用hiThere
;它接收实例作为参数。
是的,我可以通过哪些间接方式做到这一点?
它们不是间接的:您需要一个实例来调用该方法。但是,当静态方法有一个实例时,调用该实例方法与其他任何方法调用一样直接。
答案 1 :(得分:3)
这意味着,如果您有实例方法a
,则不能从静态方法b
调用它
void a() {
// ...
}
static void b() {
a();
}
无效。
您不能仅仅因为静态方法未在实例内部运行而无法做到这一点,因此它不知道在哪个实例上调用该方法。
答案 2 :(得分:1)
这里的“直接”意味着您没有在对象上调用该方法。
例如,
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");
}
}
因此,当存在调用非静态方法的对象时,静态方法可以调用非静态方法。但是直接调用而不引用该对象是无法完成的。
您当然可以直接从另一个调用一个静态方法。您还可以直接从另一方法中调用一种非静态方法。
答案 3 :(得分:1)
静态方法绑定到该类。 非静态方法绑定到类(对象)的实例。
这意味着您可以像这样直接调用静态方法:
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
}
我可以间接实现的方式是什么?
从静态方法中调用非静态方法的“间接”方法是,首先使用非静态方法构造该类的对象(如第二个代码块所示)。