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

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

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() на static, public static void doRooThings();

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

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

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

licensed under cc by-sa 3.0 with attribution.