Подтвердить что ты не робот

Java: как вызвать нестатический метод из основного метода?

Я изучаю Java, и теперь у меня есть следующая проблема: у меня основной метод объявлен как

public static void main(String[] args) {

..... }

Внутри моего основного метода, потому что он статический, я могу вызывать ТОЛЬКО другой статический метод !!! Зачем?

Например: у меня есть другой класс

 public class ReportHandler {       
     private Connection conn;   
     private PreparedStatement prep;
     public void executeBatchInsert() { ....
 } }

Поэтому в моем основном классе я объявляю private ReportHandler rh = new ReportHandler();

Но я не могу вызвать любой метод, если они не являются статичными.

Где это идет не так?

РЕДАКТИРОВАТЬ: извините, мой вопрос: как "спроектировать" приложение, чтобы я мог вызывать другой класс из моей "начальной точки" (static void main).

4b9b3361

Ответ 1

Вам просто нужно создать экземпляр ReportHandler:

ReportHandler rh = new ReportHandler(/* constructor args here */);
rh.executeBatchInsert(); // Having fixed name to follow conventions

Важным моментом методов экземпляра является то, что они предназначены для конкретного экземпляра класса... поэтому вам нужно сначала создать экземпляр. Таким образом, экземпляр будет иметь доступ к правильному соединению и подготовленному заявлению в вашем случае. Просто вызывая ReportHandler.executeBatchInsert, контекста недостаточно.

Очень важно понять, что:

  • Методы экземпляров (и поля и т.д.) относятся к конкретному экземпляру
  • Статические методы и поля относятся к самому типу, а не к конкретному экземпляру

Как только вы понимаете это фундаментальное различие, имеет смысл, что вы не можете вызвать метод экземпляра без создания экземпляра... Например, имеет смысл спросить: "Какая высота этого человека?" (для конкретного человека), но не имеет смысла спрашивать: "Какая высота человека?" (без указания лица).

Предполагая, что вы наклоняете Java из книги или учебника, вы должны прочитать больше примеров статических и нестатических методов и т.д. - это важное различие, чтобы понять, и у вас будут всевозможные проблемы, он это понимал.

Ответ 2

Пожалуйста, найдите ответ:

public class Customer {

    public static void main(String[] args) {
        Customer customer=new Customer();
        customer.business();
    }

    public void business(){
        System.out.println("Hi Harry");
    }
}

Ответ 3

Java - это своего рода объектно-ориентированное программирование, а не программирование процедур. Таким образом, каждая вещь в вашем коде должна манипулировать объектом.

public static void main - это только запись вашей программы. Это не связано с каким-либо объектом.

Итак, что такое кодирование с объектом? Это просто, вам нужно создать конкретный объект/экземпляр, вызвать их методы для изменения своих состояний или выполнить другую конкретную функцию внутри этого объекта.

например. точно так же, как

private ReportHandler rh = new ReportHandler();
rh.<function declare in your Report Handler class>

Поэтому, когда вы объявляете метод static, он не связывается с вашим объектом/экземпляром вашего объекта. И это также нарушает ваше программирование O-O.

static метод обычно вызывается, когда эта функция не связана с каким-либо объектом.

Ответ 4

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

Ответ 5

Статический метод означает, что вам не нужно вызывать метод в экземпляре. Нестатический (экземпляр) метод требует, чтобы вы вызывали его в экземпляре. Поэтому подумайте об этом: если у меня есть метод changeThisItemToTheColorBlue(), и я пытаюсь запустить его из основного метода, какой экземпляр он изменит? Он не знает. Вы можете запустить метод экземпляра в экземпляре, например someItem.changeThisItemToTheColorBlue().

Дополнительная информация на http://en.wikipedia.org/wiki/Method_(computer_programming)#Static_methods.

Ответ 6

Вы можете думать о статической функции-члене как о том, что существует без необходимости существования объекта. Например, метод Integer.parseInt() из класса Integer является статическим. Когда вам нужно использовать его, вам не нужно создавать новый объект Integer, вы просто вызываете его. То же самое для main(). Если вам нужно вызывать нестатический член из него, просто поместите свой основной код в класс, а затем из основного создайте новый объект вашего вновь созданного класса.

Ответ 7

Вы не можете вызывать нестатический метод из основного без создания экземпляра, тогда как вы можете просто вызвать статический метод. Основная логика этого заключается в том, что всякий раз, когда вы выполняете файл .class, все статические данные сохраняются в ОЗУ, но JVM (Java-виртуальная машина) будет создавать контекст упомянутого класса, который содержит все статические данные класса, Таким образом, легко получить доступ к статическим данным из класса без создания экземпляра. Объект содержит нестатические данные Контекст создается только один раз, тогда как объект может создаваться любое количество раз. контекст содержит методы, переменные и т.д. В то время как объект содержит только данные. таким образом, объект может обращаться к статическим и нестатическим данным из контекста класса

Ответ 8

Поскольку вы хотите вызывать нестатический метод из main, вам просто нужно создать объект этого класса, состоящий из нестатического метода, и тогда вы сможете вызывать метод с помощью objectname.methodname(); Но если вы напишите метод как статический, вам не нужно будет создавать объект, и вы сможете вызывать метод с помощью methodname(); от основного. И это будет более эффективным, поскольку потребует меньше памяти, чем объект, созданный без статического метода.