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

时间:2018-06-27 07:21:06

标签: java static

根据javatpoint中编写的限制,静态方法不能直接调用非静态方法。 “直接”到底是什么意思,为什么我不能这样做?是的,我可以通过哪些间接方式做到这一点?

4 个答案:

答案 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
}

  

我可以间接实现的方式是什么?

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