Создание статической ссылки на нестатический метод изнутри метода - PullRequest
0 голосов
/ 08 декабря 2018

Я понимаю ошибку "Невозможно сделать статическую ссылку на нестатический метод", но я столкнулся с этим:

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()?

1 Ответ

0 голосов
/ 08 декабря 2018

Прежде всего вы должны знать больше о статических и нестатических методах:

Статический метод принадлежит классу, а нестатический метод принадлежит объекту класса.То есть нестатический метод может быть вызван только для объекта класса, которому он принадлежит.Однако статический метод может быть вызван как для класса, так и для объекта класса.Статический метод может получить доступ только к статическим членам.Нестатический метод может обращаться как к статическим, так и к нестатическим членам, потому что во время вызова статического метода класс может не быть создан (если он вызывается для самого класса).В другом случае нестатический метод может быть вызван только тогда, когда класс уже создан.Статический метод является общим для всех экземпляров класса.Вот некоторые из основных отличий.Я также хотел бы отметить часто игнорируемую разницу в этом контексте.Всякий раз, когда метод вызывается в C ++ / Java / C #, неявный аргумент (ссылка «this») передается вместе с другими параметрами или без них.В случае статического вызова метода ссылка «this» не передается, поскольку статические методы принадлежат классу и, следовательно, не имеют ссылки «this».

Ссылка : Статические и нестатические методы

Как это работает?myClassInstance все еще как-то существует, потому что в этот момент я все еще внутри myMethod()?

myMethod - это метод экземпляра, который принадлежит myClassInstance.поэтому, когда вы звоните myMethod() внутри myMethod(), это эквивалентно this.myMethod()

Было бы лучше иметь static MyClass myClassInstance = new MyClass() на уровне класса, а затем каждый раз вызывать myClassInstance.myMethod()?

Когда мы объявляем член класса статическим, это означает, что независимо от того, сколько объектов класса создано, существует только одна копия статического члена.Статический член является общим для всех объектов класса.Все статические данные инициализируются нулем при создании первого объекта, если нет другой инициализации.Для получения дополнительной информации посетите Статические переменные: хорошо или плохо? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...