Heim  >  Artikel  >  Java  >  Was bewirkt das Schlüsselwort static?

Was bewirkt das Schlüsselwort static?

(*-*)浩
(*-*)浩nach vorne
2019-08-21 15:41:044949Durchsuche

Heute lernen wir hauptsächlich das statische Schlüsselwort in der Java-Sprache.

Was bewirkt das Schlüsselwort static?

Die Bedeutung und Verwendungsszenarien des Schlüsselworts static

static ist eines der 50 Schlüsselwörter in Java. Das Schlüsselwort static kann verwendet werden, um Codeblöcke zu ändern, um statische Codeblöcke darzustellen, geänderte Mitgliedsvariablen, um globale statische Mitgliedsvariablen darzustellen, und geänderte Methoden, um statische Methoden darzustellen. (Hinweis: Gewöhnliche Klassen können nicht geändert werden, mit Ausnahme innerer Klassen. Warum ist das so?)

class A {
	static {
		System.out.println("A : 静态代码块");
	}
	
	static int i ;  // 静态变量
	
	static void method() {
		System.out.println("A: 静态方法");
	}
}

Kurz gesagt, der durch das Schlüsselwort static geänderte Inhalt ist statisch.

Statisch bedeutet dynamisch, dass die JVM beim Ausführen eines Java-Programms dynamisch Objekte erstellt und entsprechend den Anforderungen des Programms speichert (Speicher zuweist). Nach Abschluss des Vorgangs wird das Objekt durch den Garbage Recycler zerstört, d Speichern Sie den durch das Schlüsselwort static geänderten Inhalt. Beispielsweise werden Java-Klassen in die JVM geladen, und die JVM speichert die Klasse und ihre statischen Mitgliedsvariablen im Methodenbereich Durch Threads und GC kommt es selten vor, daher wird der durch das Schlüsselwort static geänderte Inhalt global gemeinsam genutzt und der Speicherplatz wird nur einmal zugewiesen.

Wenn also ein Teil der Klasse nicht zum Objekt gehört, sondern vom Objekt gemeinsam genutzt wird und zur Klasse gehört, können Sie überlegen, ob Sie ihn mit dem Schlüsselwort static ändern möchten.

Die Rolle des statischen Schlüsselworts

1 Modifizierter Codeblock

Der mit dem statischen Schlüsselwort in der Klasse geänderte Codeblock wird als statischer Code bezeichnet. und umgekehrt werden Codeblöcke, die nicht mit dem Schlüsselwort static geändert werden, als Instanzcodeblöcke bezeichnet.

Der Instanzcodeblock wird beim Erstellen des Objekts ausgeführt, d. h. jedes Objekt verfügt über einen eigenen Instanzcodeblock, was bedeutet, dass das laufende Ergebnis des Instanzcodeblocks den Inhalt des aktuellen Objekts beeinflusst Objekt und wird mit dem Objekt zerstört und verschwindet (Speicherrecycling); und der statische Codeblock ist der Codeblock, der ausgeführt wird, wenn die Java-Klasse in den JVM-Speicher geladen wird Beim Ausführen der JVM wird der statische Codeblock nur einmal ausgeführt.

Da die Hauptfunktion des statischen Codeblocks darin besteht, einige komplexe Initialisierungsarbeiten durchzuführen, wird der statische Codeblock im Methodenbereich nach der Klasse in der Form gespeichert, die das Ergebnis der Ausführung des statischen Codeblocks ist wird im Methodenbereich gespeichert, d. h. Initialisierung Die Menge wird im Methodenbereich gespeichert und von Threads gemeinsam genutzt.

2 Mitgliedsvariablen ändern

Die mit dem Schlüsselwort static in der Klasse geänderten Mitgliedsvariablen werden als statische Mitgliedsvariablen bezeichnet, da static keine lokalen Variablen ändern kann (warum?), statische Mitgliedsvariablen also auch aufgerufen werden, ist eine statische Variable. Statische Variablen ähneln Codeblöcken. Wenn die Klasse in den JVM-Speicher geladen wird, legt die JVM die statischen Variablen in den Methodenbereich und weist Speicher zu, der auch von Threads gemeinsam genutzt wird. Das Zugriffsformular lautet: Klassenname.statischer Mitgliedsname.

public class StaticTest {
	public static void main(String[] args) {
		System.out.println(D.i);
		System.out.println(new D().i);
	}
}
class D {
	static {
		i = 2;
		System.out.println("D : 静态代码块1");
	}
	static int i;
}

Statische Variablen werden in Klasseninformationen gespeichert und können von Threads gemeinsam genutzt werden. Sie gehören also natürlich auch zu jedem Objekt der Klasse, sodass auf statische Variablen über Objekte zugegriffen werden kann, der Compiler unterstützt dies jedoch nicht Wenn Sie es tun, wird eine Warnung ausgegeben.

Hinweis:

Die Ladereihenfolge statischer Variablen einer Klasse und statischer Codeblöcke der Klasse. Die Klasse lädt zuerst statische Variablen und dann statische Codeblöcke. Wenn jedoch mehrere statische Variablen und mehrere Codeblöcke vorhanden sind, werden diese in der Reihenfolge geladen, in der sie geschrieben werden.

class D {
	static {
		i = 2;
		System.out.println("D : 静态代码块1");
	}
	static {
		i = 6;
		System.out.println("D : 静态代码块2");
	}
	static int i;
}

Sie können über die Ergebnisse der Operation nachdenken.

Statische Variablen müssen nicht explizit initialisiert werden und die JVM gibt ihnen standardmäßig entsprechende Standardwerte. Beispielsweise ist der grundlegende Datentyp von Byte 0, Short ist 0, Char ist U0000, Int ist 0, Long ist 0L, Float ist 0,0F, Double ist 0,0D, Boolean ist False und der Referenztyp ist einheitlich Null.

Da statische Variablen im JVM-Speicher gemeinsam genutzt werden und geändert werden können, führt der Zugriff auf sie zu Thread-Sicherheitsproblemen (während Thread A neu schreibt, erhält Thread B seinen Wert, dann wird der Wert vor der Änderung oder der Wert erhalten). geänderter Wert? ), daher müssen Sie Multithreading berücksichtigen, wenn Sie statische Variablen verwenden. Wenn Sie sicherstellen können, dass statische Variablen unveränderlich sind, können Sie das Schlüsselwort final verwenden, um Thread-Sicherheitsprobleme zu vermeiden. Andernfalls müssen Sie die Synchronisierung verwenden, um Thread-Sicherheitsprobleme zu vermeiden, z. B. durch die Verwendung mit dem Schlüsselwort volatile.

Das Schlüsselwort static kann keine lokalen Variablen, einschließlich Instanzmethoden und statischen Methoden, ändern, da es sonst die ursprüngliche Absicht des Schlüsselworts static verletzt – die gemeinsame Nutzung.

3 Modifizierte Methoden

Mit dem Schlüsselwort static geänderte Methoden werden als statische Methoden bezeichnet, ansonsten als Instanzmethoden. Wird über Klassenname.Methodenname aufgerufen. Es ist jedoch zu beachten, dass statische Methoden direkt statische Variablen und andere statische Methoden der Klasse aufrufen können, jedoch keine Mitgliedsvariablen und Instanzmethoden direkt aufrufen können (es sei denn, sie werden über Objekte aufgerufen).

class D {
	static {
		i = 2;
		System.out.println("D : 静态代码块");
	}
	static final int i;
	int j;
	
	static void method() {
		System.out.println(i);
		System.out.println(new D().j);
		
		method1();
		new D().method2();
	}
	
	static void method1() {
		System.out.println(i);
	}
	void method2() {
		System.out.println(i);
	}
}

Hinweis: Da für den Zugriff auf die Instanzmethoden einer Klasse Objektaufrufe erforderlich sind und auf statische Methoden direkt über den Klassennamen zugegriffen werden kann, wie beginnt die Ausführung einer Klasse, ohne den Bereitstellungsserver zu berücksichtigen? Die größte Möglichkeit besteht darin, Java über die „Klassenname.statische Methode“ zu starten. Ich definiere so viele statische Methoden. Woher kennt die JVM den Haupteingang?

Vielleicht haben Sie an die Hauptmethode gedacht.

Ja, die Hauptmethode ist in der Java-Spezifikation als Haupteingang der Java-Klasse definiert. Der Betrieb von Java-Klassen wird durch die Hauptmethode gestartet:

 public static void main(String[] args) {
	for (String arg : args) {   // 参数由外部定义
		System.out.println(arg);
	}}

但注意main并不是Java关键字,它只是一个规定的程序入口的方法名字;另外main方法可以重载。

注意:static关键字虽然不能修饰普通类,但可以用static关键字修饰内部类使其变成静态内部类。static关键字本身的含义就是共享,而Java类加载到JVM内存的方法区,也是线程共享的,所以没必要用static关键字修饰普通类。

4 静态导入

在用import导入包或者类时,可以用static修饰包名或者类,表示静态导入。静态导入可以与动态导入放在一起比较来加深理解。

动态导入是当你程序运行时需要new一个不在此包中的类的对象时,才会根据全路径类名加载类;而静态导入则是随着类的加载而加载静态导入的类,所以它是提前导入的。

public class StaticTest {
	static void method1() {
		System.out.println("static method1");
	}
	
	static void method2() {
		System.out.println("static method2");
	}
}

静态导入:

import static com.starry.staticImport.StaticTest.method1;

public class Client {
	public static void main(String[] args) {
		method1();   // 
		StaticTest.method2();
	}
}

注意method1()是静态导入,所以可以不需要通过类名访问;而method2()没有导入,则需要通过类名调用。那么什么时候需要静态导入呢?

静态导入常用于静态方法以及含有静态方法的类,枚举类等的导入,可以在编译阶段确定导入类的信息或者方法信息。

static关键字的缺点

封装是Java类的三大特性之一,也是面向对象的主要特性。因为不需要通过对象,而直接通过类就能访问类的属性和方法,这有点破坏类的封装性;所以除了Utils类,代码中应该尽量少用static关键字修饰变量和方法

Das obige ist der detaillierte Inhalt vonWas bewirkt das Schlüsselwort static?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen