После доступа к статическим методам в статических внутренних классах из основного класса в Java, eclipse выдает предупреждение - PullRequest
2 голосов
/ 25 сентября 2019

У меня есть класс ->

    public class Machine

Там я объявил статический внутренний класс ->

   public static class Parts

Внутри статического внутреннего класса я объявил два статических метода -->

    public static void engine()
    public static void battery()

Теперь я хочу получить доступ к методам из моего основного класса App.Я использую Eclipse IDE.Я сделал -

    Machine.Parts machine = new Machine.Parts();
    machine.engine();
    machine.battery();

Затмение позволяет мне сделать это.Но это предупреждает меня -
Механизм статического метода из типа Machine.Parts должен быть доступен статическим способом
Механизм статического метода из типа Machine.Parts долженбыть доступным статическим способом

Как решить эту проблему?

Я пробовал поиск в Google и переполнение стека предыдущие вопросы.Но нигде не смог найти решения.

Мой код -

Machine.java ->

package demo28;

public class Machine {

    public static class Parts {
        public static void engine() {
            System.out.println("Machine engine is running");
        }
        public static void battery() {
            System.out.println("Machine battery is charging");
        }
    }
}

App.java ->

package demo28;

public class App {

    public static void main(String[] args) {
        run(new Machine.Parts());
    }

    public static void run(Machine.Parts machine) {
        machine.engine();
        machine.battery();
        System.out.println();
    }

}

Выход ->

Двигатель машины работает
Заряжается аккумулятор машины

Ожидается -> Нет предупреждения

Актуально -> Получение предупреждения

1 Ответ

3 голосов
/ 25 сентября 2019

Здесь:

 Machine.Parts machine = new Machine.Parts();

Вы создаете экземпляр этого внутреннего класса.Затем вы идете:

 machine.engine();

... вызывая статический метод , как если бы это был нестатический метод этого класса.

Да, приведенный выше код работает, но это плохая практика.Если вы хотели иметь «настоящие» нестатические методы, просто удалите это ключевое слово из сигнатур методов.В противном случае измените код на:

Machine.Parts.engine();

Потому что именно так действительно происходит в вашем примере кода.

...