2010-01-17 5 views
56

Ho un concetto di variabili statiche ma quali sono i vantaggi dei metodi statici in una classe. Ho lavorato su alcuni progetti ma non ho reso statico un metodo. Ogni volta che ho bisogno di chiamare un metodo di una classe, creo un oggetto di quella classe e chiamo il metodo desiderato.Quando dovrei usare metodi statici in una classe e quali sono i vantaggi?

D: variabile statica in un metodo detiene il suo valore anche quando il metodo viene eseguito, ma accessibile solo nel suo metodo che contiene, ma qual è la migliore definizione di metodo statico?

Q: La chiamata al metodo statico senza creare oggetto di quella classe è l'unico vantaggio del metodo statico?

Q: Qual è l'intervallo accessibile per il metodo statico?

Grazie

+4

Questo è stato ampiamente discusso in SO, consulta http://stackoverflow.com/questions/169378/c-method-can-be-made-static-but-should-it/169423#169423 e altre domande che emergono quando cerchi "metodo statico". – PeterAllenWebb

risposta

58

La descrizione di una variabile statica è più adatta a quella trovata in C. Il concetto di una variabile statica in termini Orientato agli oggetti è concettualmente diverso. Sto attingendo dall'esperienza Java qui. I metodi e i campi statici sono utili quando concettualmente non appartengono a un'istanza di qualcosa.

Considerare una classe Math che contiene alcuni valori comuni come Pi o e, e alcune funzioni utili come sin e cos. E 'davvero non ha senso per creare istanze separate di utilizzare questo tipo di funzionalità, quindi sono meglio come statica:

// This makes little sense 
Math m = new Math(); 
float answer = m.sin(45); 

// This would make more sense 
float answer = Math.sin(45); 

In linguaggi OO (ancora una volta, da una Java prospettiva) funziona, o meglio conosciuta come metodi, non può avere variabili locali statiche. Solo le classi possono avere membri statici, che come ho detto assomigliano poco all'idea di statica in C.

+0

Non sono sicuro di essere d'accordo con l'affermazione "Non ha senso creare istanze separate per utilizzare questo tipo di funzionalità, quindi sono migliori come statiche" – Charbel

+0

@Charbel Riguardo al Math Ad esempio, la staticità avrebbe senso, a meno che non si consideri l'implementazione del [New Math] (https://www.youtube.com/watch?v=UIKGV2cTgqA). –

5

L'unica volta che si desidera utilizzare un metodo statico in una classe è quando un determinato metodo non richiede un'istanza di una classe da creare. Ciò potrebbe verificarsi quando si tenta di restituire un'origine dati condivisa (ad es. Singleton) o eseguire un'operazione che non modifica lo stato interno dell'oggetto (String.format ad esempio).

Questa voce di Wikipedia spiega i metodi statici abbastanza bene: http://en.wikipedia.org/wiki/Method_(computer_science)#Static_methods

2

variabili statiche e metodi statici sono legati alla classe, e non un'istanza della classe.

I metodi statici non devono contenere uno "stato". Qualsiasi cosa relativa a uno stato, dovrebbe essere legata a un oggetto istanziato e non alla classe.

8

In sostanza, i metodi statici consentono di scrivere codice procedurale in un linguaggio orientato agli oggetti. Ti consente di chiamare i metodi senza dover prima creare un oggetto.

2

Static Methods in PHP:

può essere chiamato senza creare un oggetto di classe.

Può solo richiamare metodi e funzioni statici.

15

I metodi statici non passano un puntatore "this" a un oggetto, quindi non possono fare riferimento a variabili o metodi non statici, ma di conseguenza possono essere più efficienti in fase di esecuzione (meno parametri e nessun overhead per creare e distruggere un oggetto).

Possono essere utilizzati per raggruppare i metodi coesivi in ​​una singola classe o per agire su oggetti della loro classe, come nel modello di fabbrica.

11

Sintassi (PHP) per i metodi statici:

<?php 
class Number { 
    public static function multiply($a, $b) { 
     return $a * $b; 
    } 
} 
?> 

Codice cliente:

echo Number::multiply(1, 2); 

Il che rende più senso di:

$number = new Number(); 
echo $number->multiply(1, 2); 

Come il metodo multiply() non utilizza alcun variabili di classe e come tale non richiede un'istanza di Number.

+0

piccolo pignolo: il numero suona più come una classe che rappresenta un valore numerico, non una classe di utilità che fornisce operazioni aritmetiche. – RecursiveExceptionException

1

La variabile statica viene utilizzata quando si desidera condividere alcune informazioni tra diversi oggetti della classe. Poiché la variabile è condivisa, ciascun oggetto può aggiornarlo e il valore aggiornato può essere disponibile anche per tutti gli altri oggetti. Poiché la variabile statica può essere condivisa, questi sono spesso chiamati come variabile di classe.

1

Gli elementi statici sono accessibili da qualsiasi contesto (ad esempio ovunque nello script), quindi è possibile accedere a questi metodi senza dover passare un'istanza della classe da oggetto a oggetto.

Gli elementi statici sono disponibili in ogni istanza di una classe, quindi è possibile impostare i valori che si desidera siano disponibili per tutti i membri di un tipo.

per ulteriori letture a link!