Почему я не могу вызвать унаследованный открытый метод без предварительной ссылки на него из метода 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