Perché un campo / metodo statico - per definizione - non è legato a nessun singolo oggetto / istanza della classe, mentre un campo / metodo non statico si riferisce sempre a un oggetto / istanza reale in qualche modo.
Dato che probabilmente è stato troppo vago / astratto per rispondere alla domanda, e questo tipo di confusione deriva solitamente da un fraintendimento di ciò che in realtà significa statico, facciamo questo concreto con uno pseudocodice simile a C ++:
class Foo {
public:
static int a() { return 2; }
int b() { return d_x; }
Foo(int x) { d_x = x; }
private:
int d_x;
}
Il metodo statico a
non è legato a nessuna particolare istanza di Foo
, il che significa che può essere richiamato da qualsiasi posizione, indipendentemente dal fatto che tu abbia o meno un oggetto Foo
effettivo. In C ++ devi semplicemente scrivere Foo::a()
, e restituirebbe sempre 2.
Il metodo non statico b
è legato a una singola istanza di Foo
. Poiché restituisce semplicemente l'int all'interno di un determinato oggetto Foo
, non ha senso provare a chiamare b()
senza un oggetto Foo
specifico. Cosa ti aspetti che ritorni se non avesse un Foo
? Quindi Foo f; f.b();
ha senso ma Foo::b()
no.
Se provassi a effettuare una chiamata a () b (), ogni volta che chiamavo a () senza un'istanza effettiva di Foo
, chiamerei anche b () senza un'istanza effettiva di Foo
, quindi anche a () non ha senso.
In sostanza, i due metodi sono implementati in questo modo:
namespace Foo {
int a() {
return 2;
}
int b(Foo* this) {
return this->x;
}
};
Quando osservi i metodi in questo modo, è abbastanza ovvio perché b () può chiamare a () ma non viceversa: a () semplicemente non ha una Foo*
in giro per dare a b ( ).
Per inciso, puoi "aggirare" questa limitazione scrivendo un metodo statico che prende un oggetto Foo
effettivo e quindi chiama metodi non statici su quell'oggetto Foo
. Ma di solito è un odore di codice che indica che hai metodi statici che non dovrebbero essere un metodo statico o non statico che dovrebbe essere statico, o una classe che sta cercando di fare troppe cose contemporaneamente.