Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态方法不能直接调用非静态方法_Java_Static - Fatal编程技术网

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

Java 静态方法不能直接调用非静态方法,java,static,Java,Static,根据中写入的限制,静态方法不能直接调用非静态方法。“直接”的确切含义是什么?为什么我不能这样做?是的,我可以用什么间接的方法来做呢?这意味着如果你有一个实例方法a,你不能从静态方法b调用它 void a() { // ... } static void b() { a(); } 无效 您不能这样做,因为静态方法没有在实例中运行,因此它不知道在哪个实例上调用该方法。这里的“直接”表示您没有在对象上调用该方法 比如说, public class Foo { public s

根据中写入的限制,静态方法不能直接调用非静态方法。“直接”的确切含义是什么?为什么我不能这样做?是的,我可以用什么间接的方法来做呢?

这意味着如果你有一个实例方法
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");
   }
}
因此,当有一个非静态方法正在被调用的对象时,静态方法调用非静态方法是可以的。但是不引用对象的直接调用是无法完成的

当然,您可以直接从一个静态方法调用另一个静态方法。您还可以直接从另一个非静态方法调用一个非静态方法

根据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");
    }
}
类示例{
公共静态void main(字符串[]args){
示例e=新示例();

e、 hoheree();//静态方法绑定到类。 非静态方法绑定到类(对象)的实例

这意味着您可以像这样(直接)调用静态方法:

SomeClass.someStaticMethod();
但要调用非静态方法,需要首先构造类的对象(这就是“间接”的意思):


因此,如果你在一个静态方法中,你就在任何对象实例之外。这意味着你不能调用一个非静态方法。Java无法神奇地知道你想在哪个对象上使用/执行该方法

public static void someStaticMethod()
{
    //You aren't working with any object here
}
但是,如果您在非静态方法中,则您在对象实例中。这意味着您可以调用当前正在使用的对象的其他非静态方法。这些都是类中的非静态方法(以及超类,如果它们正确设置了访问修饰符)


我可以用哪些间接的方法来做这件事


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

通过声明一个静态方法,表示对该方法的调用不会改变对象的状态。因此,您不需要声明该方法的类的实例,也不能调用可以改变实例状态的方法。“我可以用哪些间接方法来做?”取决于您想要实现什么。“静态方法不能直接调用非静态方法”是一个非常误导性的说法。如果教程真的这么说,那就太不幸了。
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
}