Differenza tra metodi statici e metodi di istanza


88

Stavo solo leggendo il testo che mi è stato dato nel mio libro di testo e non sono davvero sicuro di aver capito cosa sta dicendo. Fondamentalmente mi dice che i metodi statici oi metodi di classe includono la parola chiave "modificatore" static. Ma non so davvero cosa significhi?

Qualcuno potrebbe spiegarmi in termini molto semplici cosa sono i metodi statici o di classe?

Inoltre, posso ottenere una semplice spiegazione su cosa sono i metodi di istanza?

Questo è quello che mi danno nel libro di testo:

Ci sono importanti implicazioni pratiche della presenza o dell'assenza del modificatore statico. Un metodo di classe pubblica può essere invocato ed eseguito non appena Java elabora la definizione della classe a cui appartiene. Questo non è il caso di un metodo di istanza. Prima di poter richiamare ed eseguire un metodo di istanza pubblica, è necessario creare un'istanza della classe a cui appartiene. Per utilizzare un metodo di classe pubblica, è sufficiente la classe. D'altra parte, prima di poter utilizzare un metodo di istanza pubblica, è necessario disporre di un'istanza della classe.

Il modo in cui un metodo statico viene invocato all'interno della definizione di un altro metodo varia a seconda che i due metodi appartengano o meno alla stessa classe. Nell'esempio sopra, factorial e main sono entrambi metodi della classe MainClass. Di conseguenza, l'invocazione di fattoriale nella definizione di principale fa semplicemente riferimento al nome del metodo, "fattoriale".

Risposte:


161

Il paradigma di base in Java è che si scrivono classi e che tali classi vengono istanziate. Gli oggetti istanziati (un'istanza di una classe) hanno attributi associati ad essi (variabili membro) che influenzano il loro comportamento; quando l'istanza ha eseguito il suo metodo, farà riferimento a queste variabili.

Tuttavia, tutti gli oggetti di un particolare tipo potrebbero avere un comportamento che non dipende affatto dalle variabili membro; questi metodi sono meglio resi statici. Essendo statico, non è richiesta alcuna istanza della classe per eseguire il metodo.

Puoi farlo per eseguire un metodo statico:

MyClass.staticMethod();//Simply refers to the class's static code

Ma per eseguire un metodo non statico, devi fare questo:

MyClass obj = new MyClass();//Create an instance
obj.nonstaticMethod();//Refer to the instance's class's code

A un livello più profondo, quando il compilatore mette insieme una classe, contiene diversi puntatori a metodi. Quando questi metodi vengono eseguiti, segue i puntatori ed esegue il codice all'estremità remota. Se viene creata un'istanza di una classe, l'oggetto creato contiene un puntatore alla "tabella dei metodi virtuali", che punta ai metodi da chiamare per quella particolare classe nella gerarchia di ereditarietà. Tuttavia, se il metodo è statico, non è necessaria alcuna "tabella del metodo virtuale": tutte le chiamate a quel metodo vanno esattamente nello stesso punto della memoria per eseguire lo stesso identico codice. Per questo motivo, nei sistemi ad alte prestazioni è meglio utilizzare un metodo statico se non si fa affidamento sulle variabili di istanza.


2
grazie mille per gli esempi di codice che sembrano familiari, quindi ora capisco
Panthy

4
@Rohan Un altro buon modo di vedere la cosa è che qualsiasi cosa static(una classe, un metodo o un campo) non appartiene a nulla, resta in classe solo per scopi organizzativi.
gobernador

1
inoltre i campi statici sono usati come oggetti dati (uno che contiene i dati e quindi non può cambiare ma puoi manipolare i dati al suo interno). I metodi statici possono essere chiamati solo su campi statici e d'ora in poi portano la stessa nozione di rimanere costanti o non cambiare o non istanziare !!
user2416728

1
@ user2416728 Il tuo commento è molto confuso. I campi statici possono essere modificati, ma il loro ambito è globale per il loro ambiente di esecuzione. Pertanto, qualsiasi codice che ha accesso a detto campo ha accesso agli stessi dati. Questo non è equivalente al fatto che i dati restino costanti (a meno che non venga utilizzato un modificatore "finale").
Nathaniel Ford

2
sì, "non cambiare" >> volevo dire non può essere istanziato !!
user2416728

19

I metodi e le variabili che non sono dichiarati come statici sono noti come metodi di istanza e variabili di istanza. Per fare riferimento a metodi e variabili di istanza, devi prima istanziare la classe significa che devi prima creare un oggetto di quella classe.Per statico non è necessario istanziare la classe u puoi accedere ai metodi e alle variabili con il nome della classe usando il segno del punto il quale è in (.)

per esempio:

Person.staticMethod();           //accessing static method.

per il metodo non statico è necessario creare un'istanza della classe.

Person person1 = new Person();   //instantiating
person1.nonStaticMethod();       //accessing non-static method.

8

Metodi statici, le variabili appartengono all'intera classe, non solo a un'istanza di un oggetto. Un metodo statico, la variabile è associata alla classe nel suo insieme piuttosto che a istanze specifiche di una classe. Ogni oggetto condividerà una copia comune dei metodi statici, le variabili. C'è solo una copia per classe, indipendentemente dal numero di oggetti creati da essa.


8

Differenza tra metodi statici e metodi di istanza

  1. I metodi di istanza sono metodi che richiedono la creazione di un oggetto della sua classe prima di poter essere chiamato. I metodi statici sono i metodi in Java che possono essere chiamati senza creare un oggetto di classe.

  2. Il metodo statico viene dichiarato con la parola chiave statica. Il metodo dell'istanza non è con la parola chiave statica.

  3. Metodo statico significa che esisterà come una singola copia per una classe. Ma i metodi di istanza esistono come copie multiple a seconda del numero di istanze create per quella classe.

  4. I metodi statici possono essere richiamati utilizzando il riferimento alla classe. I metodi di istanza o non statici vengono richiamati utilizzando il riferimento all'oggetto.

  5. I metodi statici non possono accedere direttamente ai metodi e alle variabili di istanza. Il metodo dell'istanza può accedere direttamente alle variabili statiche e ai metodi statici.

Riferimento: geeksforgeeks


4

Metodi di istanza => invocati su un'istanza specifica di una classe specifica. Il metodo vuole sapere su quale classe è stato invocato. Il modo in cui accade c'è un parametro invisibile chiamato "questo". All'interno di "this" abbiamo membri della classe di istanza già impostati con valori. "Questa" non è una variabile. È un valore, non è possibile modificarlo e il valore è riferito al destinatario della chiamata. Ex: chiami i riparatori (metodo di istanza) per riparare la tua TV (programma effettivo). Viene fornito con strumenti (parametro "questo"). Viene fornito con strumenti specifici necessari per riparare la TV e può anche aggiustare altre cose.

Nei metodi statici => non esiste una cosa come "questo". Es: lo stesso riparatore (metodo statico). Quando lo chiami devi specificare quale riparatore chiamare (come l'elettricista). E lui verrà e aggiusterà solo la tua TV. Ma non ha strumenti per aggiustare altre cose (non esiste un parametro "questo").

I metodi statici sono generalmente utili per operazioni che non richiedono alcun dato da un'istanza della classe (da 'this') e possono eseguire lo scopo previsto esclusivamente utilizzando i loro argomenti.


2

Il comportamento di un oggetto dipende dalle variabili e dai metodi di quella classe. Quando creiamo una classe, creiamo un oggetto per essa. Per i metodi statici, non li richiediamo poiché i metodi statici indicano che tutti gli oggetti avranno la stessa copia, quindi non è necessario un oggetto. per esempio:

Myclass.get();

Nel metodo di istanza ogni oggetto avrà un comportamento diverso, quindi dovrà chiamare il metodo utilizzando l'istanza dell'oggetto. per esempio:

Myclass x = new Myclass();
x.get();

1

Se lo stato di un metodo non deve essere modificato o non utilizzerà alcuna variabile di istanza.

Vuoi chiamare il metodo senza istanza.

Se funziona solo sugli argomenti forniti.

Le funzioni di utilità sono una buona istanza di metodi statici. cioè math.pow (), questa funzione non cambierà lo stato per valori diversi. Quindi è statico.


1

In breve, i metodi statici e le variabili statiche sono a livello di classe dove come metodi di istanza e variabili di istanza sono a livello di istanza o di oggetto.

Ciò significa che ogni volta che viene creata un'istanza o un oggetto (utilizzando new ClassName ()), questo oggetto conserverà la propria copia delle variabili dell'istanza. Se hai cinque diversi oggetti della stessa classe, avrai cinque diverse copie delle variabili di istanza. Ma le variabili ei metodi statici saranno gli stessi per tutti questi cinque oggetti. Se hai bisogno di qualcosa di comune da usare per ogni oggetto creato, rendilo statico. Se hai bisogno di un metodo che non necessita di dati specifici dell'oggetto per funzionare, rendilo statico. Il metodo statico funzionerà solo con la variabile statica o restituirà i dati sulla base degli argomenti passati.

class A {
    int a;
    int b;

    public void setParameters(int a, int b){
        this.a = a;
        this.b = b;
    }
    public int add(){
        return this.a + this.b;
   }

    public static returnSum(int s1, int s2){
        return (s1 + s2);
    }
}

Nell'esempio sopra, quando chiami add () come:

A objA = new A();
objA.setParameters(1,2); //since it is instance method, call it using object
objA.add(); // returns 3 

B objB = new B();
objB.setParameters(3,2);
objB.add(); // returns 5

//calling static method
// since it is a class level method, you can call it using class itself
A.returnSum(4,6); //returns 10

class B{
    int s=8;
    int t = 8;
    public addition(int s,int t){
       A.returnSum(s,t);//returns 16
    }
}

Nella prima classe, add () restituirà la somma dei dati passati da un oggetto specifico. Ma il metodo statico può essere utilizzato per ottenere la somma da qualsiasi classe non indipendente da qualsiasi istanza o oggetto specifico. Quindi, per metodi generici che necessitano solo di argomenti per funzionare possono essere resi statici per mantenerli tutti ASCIUTTI.


0

Metodo di istanza vs metodo statico

  1. Il metodo di istanza può accedere direttamente ai metodi di istanza e alle variabili di istanza.

  2. Il metodo dell'istanza può accedere direttamente alle variabili statiche e ai metodi statici.

  3. I metodi statici possono accedere direttamente alle variabili statiche e ai metodi statici.

  4. I metodi statici non possono accedere direttamente ai metodi e alle variabili di istanza. Devono usare il riferimento all'oggetto. E il metodo statico non può utilizzare questa parola chiave poiché non esiste un'istanza a cui fare riferimento per "questo".


-2

Il modificatore statico quando posto davanti a una funzione implica che esiste solo una copia di quella funzione. Se il modificatore statico non è posto davanti alla funzione, con ogni oggetto o istanza di quella classe viene creata una nuova copia di quella funzione. :) Lo stesso è il caso delle variabili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.