it-swarm.it

Java: come chiamare il metodo non statico dal metodo principale?

Sto imparando Java e ora ho il seguente problema: ho dichiarato il metodo principale come

public static void main(String[] args) {

..... }

All'interno del mio metodo principale, perché è statico Posso chiamare SOLO un altro metodo statico !!! Perché ?

Ad esempio: ho un'altra classe

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

Quindi nella mia classe principale dichiaro un private ReportHandler rh = new ReportHandler();

Ma non posso chiamare alcun metodo se non sono statici.

Dove va storto?

EDIT: scusa, la mia domanda è: come "progettare" l'app per permettermi di chiamare un'altra classe dal mio "punto di partenza" (il static void main).

37
stighy

Devi semplicemente creare un'istanza di ReportHandler:

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

Il punto importante dei metodi di istanza è che sono pensati per essere specifici per una particolare istanza della classe ... quindi dovrai prima creare un'istanza. In questo modo l'istanza avrà accesso alla connessione corretta e alla dichiarazione preparata nel tuo caso. Sto solo chiamando ReportHandler.executeBatchInsert, non c'è abbastanza contesto.

È davvero importante capire che:

  • I metodi di istanza (e campi ecc.) Si riferiscono a un'istanza particolare
  • I metodi e i campi statici si riferiscono al tipo stesso, non un'istanza particolare

Una volta che hai capito questa differenza fondamentale, ha senso che non puoi chiamare un metodo di istanza senza creare un'istanza ... Ad esempio, ha senso chiedere: "Qual è l'altezza di quella persona ?" (per una persona specifica) ma non ha senso chiedere "Qual è l'altezza della persona?" (senza specificare una persona).

Supponendo che tu ti stia appoggiando Java da un libro o tutorial, dovresti leggere altri esempi di metodi statici e non statici ecc. - È una distinzione vitale da capire e avrai tutti i tipi di problemi fino a quando non l'avrai capito.

59
Jon Skeet

Si prega di trovare la risposta:

public class Customer {

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

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

Java è un tipo di programmazione orientata agli oggetti, non una programmazione procedurale. Quindi ogni cosa nel tuo codice dovrebbe manipolare un oggetto.

public static void main è solo il entry del tuo programma. Non comporta alcun oggetto dietro.

Quindi cos'è la codifica con un oggetto? È semplice, è necessario creare un oggetto/istanza particolare, chiamare i loro metodi per cambiare i loro stati o svolgere altre funzioni specifiche all'interno di quell'oggetto.

per esempio. proprio come

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

Quindi quando dichiari un metodo statico, non si associa al tuo oggetto/istanza del tuo oggetto. Ed è anche una violazione della tua programmazione O-O.

Il metodo statico viene solitamente chiamato quando quella funzione non è correlata a nessun oggetto dietro.

6
Kit Ho

Non è possibile chiamare un metodo non statico da un metodo statico, poiché la definizione di "non statico" significa qualcosa associato a un istanza della classe. Non hai un'istanza della classe in un contesto statico.

3

Un metodo statico significa che non è necessario richiamare il metodo su un'istanza. Un metodo non statico (istanza) richiede di invocarlo su un'istanza. Quindi pensaci: se avessi un metodo changeThisItemToTheColorBlue() e provassi ad eseguirlo dal metodo principale, quale istanza cambierebbe? Non lo sa Puoi eseguire un metodo di istanza su un'istanza, come someItem.changeThisItemToTheColorBlue().

Maggiori informazioni su http://en.wikipedia.org/wiki/Method_ (computer_programming) #Static_methods .

1
wchargin

Poiché vuoi chiamare un metodo non statico da main, devi solo creare un oggetto di quella classe consistente in un metodo non statico e quindi sarai in grado di chiamare il metodo usando objectname.methodname (); Ma se scrivi il metodo come statico, non dovrai creare l'oggetto e potrai chiamare il metodo usando methodname (); dalla principale. E questo sarà più efficiente in quanto richiederà meno memoria rispetto all'oggetto creato senza metodo statico.

0
user9885720

Non puoi chiamare un metodo non statico dal principale senza la creazione dell'istanza, mentre puoi semplicemente chiamare un metodo statico. La logica principale dietro questo è che, ogni volta che si esegue un file .class tutti i dati statici vengono archiviati in RAM e tuttavia, JVM (Java virtual machine) creerebbe un contesto della classe menzionata che contiene tutti i dati statici della classe. Pertanto, è facile accedere ai dati statici dalla classe senza creazione dell'istanza. L'oggetto contiene i dati non statici Il contesto viene creato una sola volta, mentre l'oggetto può essere creato un numero qualsiasi di volte Il contesto contiene metodi, variabili ecc. Considerando che l'oggetto contiene solo dati, quindi un oggetto può accedere sia a dati statici che non statici dal contesto della classe

0
user8584649

Link utile per comprendere la parola chiave statica https://www.codeguru.com/Java/tij/tij0037.shtml#Heading79

0
Vicky Gupta

È possibile pensare a una funzione di membro statico come esistente senza la necessità che esista un oggetto. Ad esempio, il metodo Integer.parseInt () della classe Integer è statico. Quando è necessario utilizzarlo, non è necessario creare un nuovo oggetto Intero, è sufficiente chiamarlo. La stessa cosa per main (). Se hai bisogno di chiamare un membro non statico da esso, inserisci semplicemente il tuo codice principale in una classe e poi dal principale crea un nuovo oggetto della tua classe appena creata.

0
zero_dev