Ich habe gehört, dass statische Methoden in Java nur statische Variablen verwenden sollten. Aber die Hauptmethode ist doch auch statisch, oder?
Antworten
Zu viele Anzeigen?Ihre Frage: Ist die Aussage "statische Methoden sollten nur statische Variablen verwenden" richtig?
Nein. Die Aussage ist nicht korrekt.
Die korrekte Aussage lautet: "Statische Methoden können nur die Instanzvariablen verwenden, die als statisch definiert sind".
Schauen Sie sich den folgenden Code an und lesen Sie die Kommentare:
Class A{
int i;
static int j;
public static void methodA(){
i = 5; //cannot use since i is not static
j = 2; //can use.
int k = 3; //k is local variable and can be used no problem
**EDIT:**//if you want to access i
A a = new A();
//A.i = 5; //can use.
a.i = 5; // it should be non-capital "a" right?
}
}
Zunächst einmal eine Formalität: Es ist NICHT wahr, dass " main
Methode ist ebenfalls statisch". Sie können eine nicht-statische main
Methode, mit welcher Signatur auch immer; es wird nur kein gültiger Einstiegspunkt für eine Java-Anwendung sein.
Was die Aussage "statische Methoden sollten nur statische Variablen verwenden" betrifft, so ist dies auch NICHT wahr. Das Schlüsselkonzept hierbei ist, dass statische Methoden und Felder klassenspezifisch und nicht instanzspezifisch sind. Sie können einfach nicht auf eine Instanzvariable/-methode zugreifen, wenn Sie keine Instanz dieser Klasse haben; dies ist ein Kompilierungsfehler.
Um genau zu sein, können Sie ohne eine Instanz nicht auf Instanzfelder/-methoden zugreifen. Auf statische Felder/Methoden können Sie ohne Instanz zugreifen. Wenn Sie von einer statischen Methode aus auf Instanzfelder/-methoden zugreifen müssen, müssen Sie auf die eine oder andere Weise eine Instanz dieser Klasse erhalten, entweder indem Sie sie einfach instanziieren oder indem Sie einen Verweis auf sie von einem statischen Feld oder Methodenparameter erhalten.
Schauen wir uns dieses einfache Beispiel an:
public static void main(String args[]) {
System.out.println(args.length);
}
length
est NICHT ein statisches Feld; es ist ein Instanzfeld von Array-Instanzen, die args
ist. Die statische Methode main
ist in der Lage, diese Instanz zu erhalten (und somit auf ihre Instanzmethoden und -felder zuzugreifen), da sie als Argument übergeben wird.
Auch, println
est NICHT eine statische Methode; sie ist eine Instanzmethode von PrintStream
Instanzen. Die statische Methode main
ist in der Lage, diese Instanz durch Zugriff auf das statische Feld out
der Klasse System
.
Zusammengefasst:
- Ein Java-Anwendungseinstiegspunkt ist eine Methode, die:
- heißt
main
- es
public
ystatic
- gibt zurück.
void
und nimmt eineString[]
Argument als Parameter
- heißt
- Eine Methode namens
main
muss kein Einstiegspunkt für eine Java-Anwendung sein- (aber es ist am besten, diesen Namen für diesen Zweck zu reservieren)
Außerdem,
- Auf Instanzfelder/Methoden kann nur über eine Instanz zugegriffen werden
- Auf statische Felder/Methoden kann ohne Instanz zugegriffen werden
- Statische Methoden können eine Instanz einer Klasse auf eine der folgenden Arten erhalten:
- Erstellung einer
new
Instanz - die Übergabe als Argument
- Zugriff über eine
static
Feld einer Klasse - die als Rückgabewert einer
static
Methode einer Klasse - sie als geworfenes Ei zu fangen
Throwable
- Erstellung einer
Vielleicht hilft Ihnen dieses Stück Code weiter:
public class Main {
private String instanceField = "Joe";
private void instanceMethod() {
System.out.println("Instance name=" + instanceField);
}
public static void main(String[] args) {
// cannot change instance field without an instance
instanceField = "Indy"; // compilation error
// cannot call an instance method without an instance
instanceMethod(); // compilation error
// create an instance
Main instance = new Main();
// change instance field
instance.instanceField = "Sydney";
// call instance method
instance.instanceMethod();
}
}
Sie können also nicht auf Instanzmitglieder zugreifen, ohne eine Instanz zu haben. Im Kontext einer statischen Methode haben Sie keinen Verweis auf eine Instanz, es sei denn, Sie erhalten oder erstellen eine.
Ich hoffe, das hilft.
Eine statische Methode wird für eine Klasseninstanz und nicht für ein Objekt einer Klasse aufgerufen. Das bedeutet, dass eine statische Methode nicht auf Instanzvariablen zugreifen kann, da diese nur in einem Objekt instanziiert sind.
Wenn Sie mit einer statischen Methode auf eine Instanzvariable zugreifen wollen, müssen Sie diese Variable als statisch deklarieren.
public class Test {
private static int value = 0;
public static void main(String[] args) {
value++;
}
}
Aber um ehrlich zu sein, ist es nicht die beste Idee, alles in statische Methoden zu schreiben. Es ist besser, die Hauptmethode zu verwenden, um neue Objekte zu instanziieren.
Um auf nicht statische Felder (Instanzvariablen) zugreifen zu können, müssen Sie eine Instanz haben.
Innerhalb einer nicht-statischen Methode, this
wird verwendet als Standard Instanz:
class AnyClass {
private String nonStaticField = "Non static";
void nonStaticMethod() {
this.nonStaticField = "a text"; // accessing field of this
nonStaticField = "a text"; // same as before
}
}
Innerhalb einer statischen Methode gibt es keine this
zu verwenden als Standard Instanz, aber Sie können 1 noch auf Instanzvariablen zugreifen, wenn Sie die Instanz bereitstellen:
class AnyClass {
private String nonStaticField = "Non static";
static void staticMethod() {
AnyClass example = new AnyClass();
example.nonStaticField = "new value for non-static field";
}
}
1 - muss das Feld auch zugänglich von Java's Zugangskontrolle (erklärt public
oder in der gleichen Klasse ...)
- See previous answers
- Weitere Antworten anzeigen