Java: ¿cómo llamar al método no estático desde el método principal?

Estoy aprendiendo Java y ahora tengo el siguiente problema: tengo el método principal declarado como

public static void main(String[] args) { ..... } 

¡Dentro de mi método principal, porque es estático , puedo llamar SOLAMENTE a otro método estático! Por qué ?

Por ejemplo: tengo otra clase

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

Así que en mi clase principal declaro un private ReportHandler rh = new ReportHandler();

Pero no puedo llamar a ningún método si no son estáticos.

¿Dónde sale esto mal?

EDITAR: lo siento, mi pregunta es: cómo ‘diseñar’ la aplicación para permitirme llamar a otra clase desde mi ‘punto de partida’ (el static void main ).

Simplemente necesita crear una instancia de ReportHandler:

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

El punto importante de los métodos de instancia es que están destinados a ser específicos de una instancia particular de la clase … por lo que primero deberá crear una instancia. De esta forma, la instancia tendrá acceso a la conexión correcta y a la statement preparada en su caso. Simplemente llamando a ReportHandler.executeBatchInsert , no hay suficiente contexto .

Es realmente importante que entiendas eso:

  • Los métodos de instancia (y campos, etc.) se relacionan con una instancia particular
  • Los métodos y campos estáticos se relacionan con el tipo en sí, no con una instancia particular

Una vez que comprenda esa diferencia fundamental, tiene sentido que no pueda invocar un método de instancia sin crear una instancia … Por ejemplo, tiene sentido preguntar: “¿Cuál es la altura de esa persona?” (para una persona específica) pero no tiene sentido preguntar: “¿Cuál es la altura de la Persona?” (sin especificar una persona).

Suponiendo que esté apoyando Java en un libro o tutorial, debería leer más ejemplos de métodos estáticos y no estáticos, etc. – es una distinción vital de entender, y tendrá todo tipo de problemas hasta que lo haya entendido .

Por favor encuentre la respuesta:

 public class Customer { public static void main(String[] args) { Customer customer=new Customer(); customer.business(); } public void business(){ System.out.println("Hi Harry"); } } 

Java es un tipo de progtwigción orientada a objetos, no una progtwigción de procedimientos. Entonces, todo en tu código debería estar manipulando un objeto.

public static void main es solo la entrada de su progtwig. No implica ningún objeto detrás.

Entonces, ¿qué es codificar con un objeto? Es simple, necesita crear un objeto / instancia particular, llamar a sus métodos para cambiar sus estados u otra función específica dentro de ese objeto.

por ejemplo, como

 private ReportHandler rh = new ReportHandler(); rh. 

Entonces cuando declaras un método estático , no se asocia con tu objeto / instancia de tu objeto. Y también está violado con su progtwigción OO.

el método estático generalmente se llama cuando esa función no está relacionada con ningún objeto detrás.

No puede llamar a un método no estático desde un método estático, porque la definición de “no estático” significa algo que está asociado con una instancia de la clase. No tienes una instancia de la clase en un contexto estático.

Un método estático significa que no necesita invocar el método en una instancia. Un método no estático (instancia) requiere que lo invoque en una instancia. Así que changeThisItemToTheColorBlue() : si tengo un método changeThisItemToTheColorBlue() y trato de ejecutarlo desde el método principal, ¿qué instancia cambiaría? No sabe. Puede ejecutar un método de instancia en una instancia, como someItem.changeThisItemToTheColorBlue() .

Más información en http://en.wikipedia.org/wiki/Method_(computer_programming)#Static_methods .

Puede pensar en una función miembro estática como una que existe sin la necesidad de que exista un objeto. Por ejemplo, el método Integer.parseInt () de la clase Integer es estático. Cuando necesite usarlo, no necesita crear un nuevo objeto Integer, simplemente llámelo. Lo mismo para main (). Si necesita llamar a un miembro no estático desde allí, simplemente coloque su código principal en una clase y luego desde main cree un nuevo objeto de su clase recién creada.

No puede llamar a un método no estático desde el principal sin creación de instancia, mientras que puede simplemente llamar a un método estático. La lógica principal detrás de esto es que, cada vez que ejecuta un archivo .class, todos los datos estáticos se almacenan en la RAM y, sin embargo, JVM (máquina virtual java) crearía el contexto de la clase mencionada que contiene todos los datos estáticos de la clase . Por lo tanto, es fácil acceder a los datos estáticos de la clase sin creación de instancia. El objeto contiene los datos no estáticos. El contexto se crea solo una vez, mientras que el objeto se puede crear cualquier cantidad de veces. El contexto contiene métodos, variables, etc. Mientras que el objeto contiene solo datos. por lo tanto, un objeto puede acceder a datos estáticos y no estáticos desde el contexto de la clase

Dado que desea llamar a un método no estático desde main, solo necesita crear un objeto de esa clase que conste de un método no estático y luego podrá llamar al método utilizando objectname.methodname (); Pero si escribe el método como estático, entonces no necesitará crear un objeto y podrá llamar al método usando methodname (); de main. Y esto será más eficiente ya que requerirá menos memoria que el objeto creado sin método estático.