Почему я не могу вызвать унаследованный открытый метод без предварительной ссылки на него из метода main?

У меня есть ниже классы в том же пакете:

class Roo {
    public String doRooThings()
    {
        return "Rooing!";
    }
}

class Cloo extends Roo {
    public static void main(String[] args) 
    {
        System.out.println(doRooThings());
    }
}

Я получаю Не могу сделать статическую ссылку на нестатический метод doRooThings() из ошибки типа Roo при выполнении этого.

Но я могу вызвать метод doRooThings() (без предварительного указания ссылки) из открытого метода в дочернем классе, как показано ниже:

class Cloo extends Roo {
    public void testRoo()
    {
        System.out.println(doRooThings());
    }
    public static void main(String[] args) 
    {
        new Cloo().testRoo();
    }
}

Может кто-нибудь, пожалуйста, дайте мне знать, как это работает?

4 ответа

Решение

В первом случае основной метод является статическим, а метод doRooThings() - это нестатический метод. Внутри статического метода вы не можете ссылаться на нестатический (экземпляр) метод.

Но во втором случае вы можете вызывать нестатический метод testRoo (), потому что вы создаете экземпляр в статическом контексте. Аналогично, даже в первом случае вы вызываете нестатический метод, создавая экземпляр, как показано ниже:

новый Roo().doRooThings() или новый Cloo().doRooThings()

main является статическим методом, поэтому он не связан ни с одним экземпляром класса. В результате он не может вызвать метод экземпляра (так как он должен быть связан с экземпляром), если он сначала не создает экземпляр. Может быть, вам нужно больше узнать о значении статики?

Поскольку main() Метод работает в static контекст. Статический означает, что у вас нет действительного экземпляра класса. Это означает, что Java не знает, какой экземпляр вызывать этот метод...

Прочитайте некоторые основы, как это объяснение.

Потому что ваш метод doRooThings не является статичным, в то время как ваш основной метод является статическим. Вы можете позвонить в doRooThings двумя способами:

Первый

создайте объект Roo на вашем основном методе Roo roo = new Roo(); затем позвоните по roo.doRooThings();

второй

измени свой метод doRooThings() к статическому, public static void doRooThings();

дополнительный

если мы создаем статический метод или статическую переменную экземпляра, это означает, что он принадлежит этому классу.

на ваше new Cloo().testRoo(); Вы можете позвонить testRoo() метод, потому что вы создали новый экземпляр Cloo класс, имея new ключевое слово. это то же самое, что и мое первое предложение, единственное отличие было в моем первом предложении, я создаю новый экземпляр Roo класс и ссылаться на него roo

Другие вопросы по тегам