从方法内部对非静态方法进行静态引用

时间:2018-12-08 12:56:24

标签: java static static-methods non-static

我了解“无法静态引用非静态方法”错误,但是遇到了这个问题:

public class MyClass {

    public static void main(String[] args) {
        MyClass myClassInstance = new MyClass();        

        while (true) {
            myClassInstance.myMethod();
            myMethod();//Cannot make a static reference to the non-static method myMethod()
        }       
    }// END main

    void myMethod() {
        try {
            //Stuff 
            }
        } catch (Exception e) {
            myMethod();
        }
    }// END myMethod

}// END MyCLass

我不能只是从myMethod()调用main,而是可以从方法本身内部进行调用(在这种情况下,如果发生异常,我想再次调用myMethod())。

这是如何工作的? myClassInstance还在吗,因为那时我仍在myMethod()里面?
在班级拥有static MyClass myClassInstance = new MyClass()并每次都致电myClassInstance.myMethod()会更好吗?

2 个答案:

答案 0 :(得分:1)

首先,您应该了解有关静态和非静态方法的更多信息:

  

静态方法属于此类   并且非静态方法属于   类的对象。这是一个   非静态方法只能被调用   在一个类的对象上   属于。静态方法可以   但是在课堂上都被称为   以及该类的对象。一种   静态方法只能访问静态   成员。非静态方法可以   访问静态和非静态   成员,因为当时   静态方法被调用,该类   可能未实例化(如果是)   调用类本身)。在里面   在其他情况下,非静态方法可以   仅在班级有   已经实例化。静态的   方法由的所有实例共享   班级。这些是一些基本的   差异。我也想要   指出一个经常被忽略的差异   在这种情况下。只要有方法   在C ++ / Java / C#中调用,是隐式的   参数(“ this”参考)是   与/没有一起通过   参数。如果是静态方法   呼叫,“ this”引用不是   作为静态方法传递的属于   类,因此没有“ this”   参考。

参考Static Vs Non-Static methods

  

这是如何工作的? myClassInstance仍然以某种方式存在,因为   那一点我还在myMethod()里面吗?

myMethod是属于myClassInstance的实例方法。因此,当您在myMethod()内部调用myMethod()时,等效于this.myMethod()

  

最好在班级有static MyClass myClassInstance = new MyClass()然后每次都叫myClassInstance.myMethod()吗?

当我们将一个类的成员声明为静态成员时,意味着无论该类中创建了多少个对象,静态成员只有一个副本。该类的所有对象共享一个静态成员。如果没有其他初始化,则在创建第一个对象时,所有静态数据都将初始化为零。有关更多信息,请访问Static Variables : Good or Bad?

答案 1 :(得分:0)

让我帮助您。您只需要在主函数中创建 Upperclass 变量。通过它调用函数。

很简单。因为背后有逻辑。您无法调用甚至不存在的函数或变量。

之后,通过创建Upperclass对象将很有意义。

public class Upperclass{        
    int var = 0;
    public static void main(String args[]){  
        Upperclass func= new Upperclass();
        func.var = 1;
        func.displayCount();       
    }
    
public void displayvariable(){
    System.out.println("" + var);
}

}

如果您对我的答案有任何疑问,请发表评论。我会尽快与您联系。

谢谢

如果您需要其他帮助,我会在这里