Ich fange an, in Java zu programmieren.Was ist "statisch"?
Ein Buch sagte, dass ich in diesem Fall statische verwenden sollte, aber nicht klar sagen, warum ich sollte oder was es bedeutet.
Können Sie das klären?
Ich fange an, in Java zu programmieren.Was ist "statisch"?
Ein Buch sagte, dass ich in diesem Fall statische verwenden sollte, aber nicht klar sagen, warum ich sollte oder was es bedeutet.
Können Sie das klären?
Das Konzept von static
hat damit zu tun, ob etwas Teil einer Klasse oder eines Objekts (Instanz) ist.
Im Fall der main
Methode, die als static
deklariert wird, heißt es, dass die main
Methode eine Klassenmethode ist - ein Verfahren, das Teil einer Klasse ist, die nicht Teil eines Objekts. Dies bedeutet, dass eine andere Klasse eine Klassenmethode einer anderen Klasse aufrufen kann, indem sie auf ClassName.method
verweist. Zum Beispiel das Aufrufen der Run-Methode von MyClass
erreicht werden durch würden:
MyClass.main(new String[]{"parameter1", "parameter2"});
Auf der anderen Seite wird ein Verfahren oder ein Feld ohne die static
modifier bedeutet, dass es Teil eines Objekts (oder auch als „Instanz“) ist und nicht ein Teil einer Klasse. Es wird bezeichnet durch den Namen des jeweiligen Objekts, an dem das Verfahren oder das Feld gehört, statt der Klassenname:
MyClass c1 = new MyClass();
c1.getInfo() // "getInfo" is an instance method of the object "c1"
Da jede Instanz unterschiedliche Werte, die Werte einer Methode oder ein Feld mit der haben könnte demselben Namen in verschiedenen Objekte müssen nicht unbedingt gleich sein:
MyClass c1 = getAnotherInstance();
MyClass c2 = getAnotherInstance();
c1.value // The field "value" for "c1" contains 10.
c2.value // The field "value" for "c2" contains 12.
// Because "c1" and "c2" are different instances, and
// "value" is an instance field, they can contain different
// values.
die beiden Begriffe Instanz und Klassenvariablen Kombination. Lassen Sie uns sagen, dass wir eine neue Klasse deklarieren, die sowohl Instanz und Klassenvariablen und Methoden enthält:
class AnotherClass {
private int instanceVariable;
private static int classVariable = 42;
public int getInstanceVariable() {
return instanceVariable;
}
public static int getClassVariable() {
return classVariable;
}
public AnotherClass(int i) {
instanceVariable = i;
}
}
Die obige Klasse hat eine Instanzvariable instanceVariable
, und eine Klassenvariable classVariable
, die mit einem static
Modifikator deklariert wird. In ähnlicher Weise gibt es eine Instanz und eine Klassenmethode zum Abrufen der Werte.
Der Konstruktor für die Instanz verwendet einen Wert, der der Instanzvariable als Argument zugewiesen wird. Die Klassenvariable wird auf 42
initialisiert und nie geändert.
wir tatsächlich die oben Klasse verwenden und sehen, was passiert:
genannt werdenAnotherClass ac1 = new AnotherClass(10);
ac1.getInstanceVariable(); // Returns "10"
AnotherClass.getClassVariable(); // Returns "42"
Beachten Sie die verschiedenen Möglichkeiten, die Klassen- und Instanzmethoden. Die Art, wie sie auf die Klasse unter dem Namen AnotherClass
verweisen, oder die Instanz unter dem Namen ac1
. Lassen Sie sich noch weiter gehen und die Verhaltensunterschiede der Methoden siehe:
AnotherClass ac1 = new AnotherClass(10);
AnotherClass ac2 = new AnotherClass(20);
ac1.getInstanceVariable(); // Returns "10"
AnotherClass.getClassVariable(); // Returns "42"
ac2.getInstanceVariable(); // Returns "20"
AnotherClass.getClassVariable(); // Returns "42"
Wie zu sehen ist, eine Instanzvariable ist eine, die von einem Objekt gehalten wird (oder „Instanz“), deshalb einzigartig für diesen speziellen Fall des In diesem Beispiel sind die Objekte ac1
und ac2
.
Eine Klassenvariable dagegen ist nur für die gesamte Klasse eindeutig. Um diesen Punkt besser über selbst, lassen Sie uns auf die AnotherClass
eine neue Methode hinzu:
public int getClassVariableFromInstance() {
return classVariable;
}
Führen Sie dann die folgenden Schritte aus:
AnotherClass ac1 = new AnotherClass(10);
AnotherClass ac2 = new AnotherClass(20);
ac1.getInstanceVariable(); // Returns "10"
ac1.getClassVariableFromInstance(); // Returns "42"
ac2.getInstanceVariable(); // Returns "20"
ac2.getClassVariableFromInstance(); // Returns "42"
Obwohl getClassVariableFromInstance
ist eine Instanzmethode, wie sie, indem sie zu sehen sie werden unter Bezugnahme auf die Instanzen ac1
und ac2
aufgerufen und liefern beide den gleichen Wert 42
. Dies liegt daran, dass sie sich in beiden Instanzmethoden auf die Klassenmethode classVariable
beziehen, die für die Klasse eindeutig ist, nicht für die Instanz - es gibt nur eine einzige Kopie von classVariable
für die Klasse AnotherClass
.
Ich hoffe, dass einige, was der Modifikator static
für verwendet wird.
The Java Tutorials von Sun hat einen Abschnitt namens Understanding Instance and Class Members, die auch in die beiden Arten von Variablen und Methoden geht.
finden Sie eine nette Beschreibung auf Wikipedia
Zum Beispiel darauf, wie in der Klasse Math, Sie Dinge wie
Math.Abs(x);
ohne
Math m = new Math();
Diese sind zu sagen, sagen kann, statische Methoden, da Sie keine Instanz benötigen. Instanzmethoden sind die Methoden, bei denen Sie eine Instanz einer Klasse benötigen.
Employee e = new Employee();
e.Terminate();
Eine statische Methode ist eine, die für die Klasse ein Ganzes gilt, nicht für ein bestimmtes Element. .goExtinct() wäre eine Methode der Duck-Population als Ganzes, keine bestimmte Ente. main ist öffentlich und statisch, weil es immer verfügbar sein muss und nicht Teil einer bestimmten Klasse ist.
In jeder objektorientierten Programmiersprache wie Java oder C++ erstellen Sie Klassen, die auf der grundlegenden Ebene wie BluePrints eines Gebäudes sind. Sie können sich einen Blueprint ansehen und feststellen, wie verschiedene Komponenten miteinander verbunden sind, aber Sie können nicht wirklich darin leben. Dasselbe gilt für Klassen und Objekte. Klassen sind Blaupausen und Sie erstellen eine Instanz einer Klasse, die ein Objekt genannt wird. Für denselben Bauplan können Sie mehrere Gebäude haben, für eine Klasse können Sie mehrere Objekte haben. Ein Objekt ist eine Instanz einer Klasse. Jede Methode in einer Klasse kann für ein Object oder eine Instanz einer Klasse aufgerufen werden, während für den Aufruf von statischen Methoden eine Instanz nicht benötigt wird. Sie können ClassName.method() direkt aufrufen, ohne eine Instanz einer Klasse zu erstellen.
der Regel haben Sie ein Objekt haben, eine Instanz einer Klasse, um Methoden zu nennen, für mindestens zwei Gründen:
Sie erstellen Objektinstanzen durch die Klasse Konstruktor aufrufen:
MyObject a = new MyObject();
Statische Methoden sind Methoden, die nicht Instanzen Objekt angebracht sind. Sie können durch einfaches Benennen der Klasse aufgerufen werden. Als Ergebnis dieser sie
Viele Leute betrachten statische Methoden als schlechtes Entwurfsmuster und empfehlen, sie nicht zu verwenden (außer public static void main
). Suchen Sie im Singleton-Instanzmuster nach einer Alternative.
In diesem speziellen Fall muss die Hauptmethode statisch sein, da die JVM Klassen laden und Objekte erstellen wird. Wenn Sie ein Java-Programm starten, sucht die JVM nach der Definition der Klasse, die an sie übergeben wurde, und lädt sie. So führt Java MyClass dazu, dass die Definition der MyClass-Klasse geladen wird.
Per Definition wird ein Java-Programm in der main() -Methode der Klasse gestartet, die an die JVM als anfänglich zu ladende Klasse übergeben wurde. Zu diesem Zeitpunkt wurde keine Instanz (Objekt) vom Typ MyClass erstellt, daher muss die Hauptmethode statisch sein, um den Start der Ausführung Ihres Programms zu ermöglichen.
Wenn Sie sehen möchten, welche Klassen während der Ausführung eines Java-Programms geladen werden, können Sie die Befehlszeilenoption -verbose: class verwenden.
Es wird Zeiten geben, in denen Sie ein Klassenmitglied definieren möchten, das unabhängig von einem Objekt dieser Klasse verwendet wird. Normalerweise muss auf ein Klassenmitglied nur in Verbindung mit einem Objekt seiner Klasse zugegriffen werden. Es ist jedoch möglich, ein Element zu erstellen, das ohne Referenz auf eine bestimmte Instanz verwendet werden kann. Um ein solches Mitglied zu erstellen, müssen Sie seiner Deklaration das Schlüsselwort static voranstellen. Wenn ein Element als statisch deklariert wird, kann auf es zugegriffen werden, bevor alle Objekte seiner Klasse erstellt werden und ohne auf ein Objekt Bezug zu nehmen. Sie können beide Methoden und Variablen als statisch deklarieren. Das häufigste Beispiel für ein statisches Member ist main(). main() wird als statisch deklariert, da es aufgerufen werden muss, bevor Objekte vorhanden sind. Die beiden Typen von statischen Elemente sind statische Felder und statische Methoden:
Static field:
Ein Feld, das mit dem Schlüsselwort static, wie dies erklärt hat:
private static int ballCount:
Die Position des statischen Schlüsselwort ist austauschbar mit der Positionen der Sichtbarkeitsschlüsselwörter (privat und öffentlich, sowie geschützt). Als Ergebnis arbeitet die folgende Anweisung, auch:
static private int ballCount;
Als Konvention, neigen die meisten Programmierer zuerst die Sichtbarkeit Schlüsselwort zu setzen.
Der Wert eines statischen Felds ist für alle Instanzen der Klasse gleich. Mit anderen Worten, wenn eine Klasse ein statisches Feld namens CompanyName hat, haben alle Objekte, die aus der Klasse erstellt wurden, den gleichen Wert für CompanyName.
Statische Felder werden erstellt und initialisiert, wenn die Klasse das erste Mal geladen wird. Dies geschieht, wenn auf ein statisches Member der Klasse verwiesen wird oder wenn eine Instanz der Klasse erstellt wird, je nachdem, was zuerst eintritt.
Static method:
Eine mit dem Schlüsselwort static deklarierte Methode. Wie statische Felder sind statische Methoden der Klasse selbst zugeordnet, nicht einem bestimmten Objekt, das von der Klasse erzeugt wird. Daher müssen Sie kein Objekt aus einer Klasse erstellen, bevor Sie die von der Klasse definierten statischen Methoden verwenden können.
Die bekannteste statische Methode ist main, die von der Java-Laufzeit aufgerufen wird, um eine Anwendung zu starten. Die Hauptmethode muss statisch sein, dh Anwendungen werden standardmäßig in einem statischen Kontext ausgeführt.
Eine der grundlegenden Regeln beim Arbeiten mit statischen Methoden besteht darin, dass Sie nicht von einer statischen Methode auf eine nicht statische Methode oder ein statisches Feld zugreifen können, da die statische Methode keine Instanz der Klasse zum Referenzieren von Instanzmethoden oder aufweist Felder.
sehr gute Erklärung. – Zaki
Vielen Dank SOO Machte dies das statische Keyword in meinem Kopf;) – Dayan