ホームページ Java &#&チュートリアル 静的キーワードは何をするのでしょうか?

静的キーワードは何をするのでしょうか?

Aug 21, 2019 pm 03:41 PM
java

今日は主にJava言語のstaticキーワードを勉強します。

静的キーワードは何をするのでしょうか?

静的キーワードの意味と使用シナリオ

static は、Java の 50 個のキーワードの 1 つです。 static キーワードを使用すると、静的コード ブロックを表すようにコード ブロックを変更したり、グローバル静的メンバー変数を表すように変更したメンバー変数を変更したり、静的メソッドを表すように変更したメソッドを変更したりすることができます。 (注: 内部クラスを除き、通常のクラスは変更できません。これはなぜですか?)

class A {
	static {
		System.out.println("A : 静态代码块");
	}
	
	static int i ;  // 静态变量
	
	static void method() {
		System.out.println("A: 静态方法");
	}
}
ログイン後にコピー

つまり、static キーワードによって変更された内容は静的です。

静的は動的に相対的なものです。動的とは、Java プログラムが JVM 上で実行されるときに、JVM がプログラムのニーズに応じて動的にオブジェクトを作成し、オブジェクトを格納 (メモリの割り当て) することを意味します。オブジェクトのミッション後完了すると、オブジェクトはガベージ リサイクラーによる破棄、つまり、メモリのリサイクルは JVM によって均一に管理され、新しく作成された他のオブジェクトに割り当てられます。静的とは、Java プログラムが実行される前に、JVM がロードされたクラスにスペースを割り当てることを意味します。 static キーワードによって変更されたコンテンツ (静的メンバー変数など) を保管する場合、Java クラスが JVM にロードされ、JVM はクラスとその静的メンバー変数をメソッド領域に保管します。メソッド領域は共有領域であることがわかっています。スレッドによる処理や GC はほとんど発生しないため、static キーワードによって変更されたコンテンツはグローバルに共有され、記憶域スペースは 1 回だけ割り当てられます。

したがって、クラスの一部のコンテンツがオブジェクトに属していないが、オブジェクトによって共有され、クラスに属している場合、それを変更するために static キーワードを使用するかどうかを検討できます。

静的キーワードの役割

1 コード ブロックを変更する

クラス内で static キーワードを使用して変更されたコード ブロックは、静的コードと呼ばれますおよびその逆 static キーワードで変更されていないコード ブロックは、インスタンス コード ブロックと呼ばれます。

インスタンス コード ブロックは、オブジェクトの作成時に実行されます。つまり、各オブジェクトは独自のインスタンス コード ブロックを持ちます。つまり、インスタンス コード ブロックの実行結果が現在のコンテンツの内容に影響します。オブジェクトはオブジェクトに応じて変化し、破壊されて消滅します (メモリのリサイクル)、静的コード ブロックは、Java クラスが JVM メモリにロードされるときに実行されるコード ブロックです。クラスのロードは実行中に 1 回だけ発生するため、 JVM の実行中、静的コード ブロックは 1 回だけ実行されます。

静的コード ブロックの主な機能は、複雑な初期化作業を実行することであるため、静的コード ブロックは、静的コード ブロックの実行結果を示す形式で、クラスに続くメソッド領域に格納されます。メソッド領域に格納される、つまり初期化 数量はメソッド領域に格納され、スレッドによって共有されます。

2 メンバー変数の変更

クラス内で static キーワードを使用して変更されたメンバー変数は、静的メンバー変数と呼ばれます。なぜなら、static はローカル変数を変更できないため (なぜですか?)、静的メンバー変数も変更できます。呼び出されるのは静的変数です。静的変数はコード ブロックに似ており、クラスが JVM メモリにロードされると、JVM は静的変数をメソッド領域に配置し、スレッドによって共有されるメモリを割り当てます。アクセス形式は、クラス名.静的メンバー名です。

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;
}
ログイン後にコピー

静的変数はクラス情報に保存され、スレッド間で共有できます。もちろん、クラスのすべてのオブジェクトにも属しているため、オブジェクトを通じて静的変数にアクセスできますが、コンパイラはこれをサポートしていません. これを実行すると警告が表示されます。

注:

クラスの静的変数とクラスの静的コード ブロックの読み込み順序。クラスは最初に静的変数をロードし、次に静的コード ブロックをロードしますが、複数の静的変数と複数のコード ブロックがある場合は、書き込まれた順序でロードされます。

class D {
	static {
		i = 2;
		System.out.println("D : 静态代码块1");
	}
	static {
		i = 6;
		System.out.println("D : 静态代码块2");
	}
	static int i;
}
ログイン後にコピー

操作の結果について考えることができます。

静的変数は明示的に初期化する必要はなく、JVM はデフォルトで対応するデフォルト値をそれらの変数に与えます。たとえば、byte の基本データ型は 0、short は 0、char は \u0000、int は 0、long は 0L、float は 0.0f、double は 0.0d、boolean は false、参照型は一律に null です。 。

静的変数は JVM メモリ内で共有され、変更できるため、それらにアクセスするとスレッド セーフティの問題が発生します (スレッド A が書き換えている間、スレッド B がその値を取得します。その場合、取得されるのは変更前の値です)。または変更された値?)、そのため、静的変数を使用する場合は、マルチスレッドを考慮する必要があります。静的変数が不変であることを確認できる場合は、final キーワードを使用してスレッド セーフティの問題を回避できます。そうでない場合は、volatile キーワードと併用するなど、同期を使用してスレッド セーフティの問題を回避する必要があります。

静的キーは、インスタンス メソッドや静的メソッドを含むローカル変数を変更できません。変更すると、静的キーワードの本来の目的である共有に違反します。

3 変更されたメソッド

static キーワードで変更されたメソッドは静的メソッドと呼ばれ、それ以外の場合はインスタンス メソッドと呼ばれます。クラス名.メソッド名を通じて呼び出されますが、静的メソッドは静的変数やクラスの他の静的メソッドを直接呼び出すことはできますが、メンバー変数やインスタンス メソッドを直接呼び出すことはできないことに注意してください (オブジェクトを通じて呼び出されない限り)。

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);
	}
}
ログイン後にコピー

注: クラスのインスタンス メソッドにはアクセスするためにオブジェクト呼び出しが必要であり、静的メソッドにはクラス名を通じて直接アクセスできるため、デプロイメント サーバーを考慮せずにクラスはどのようにして実行を開始するのでしょうか。最大の可能性は、「クラス名.静的メソッド」を通じて Java を開始することです。非常に多くの静的メソッドを定義していますが、JVM はどのようにしてメインの入り口を認識するのでしょうか?

おそらくメインの方法を思いついたのではないでしょうか。

はい、main メソッドは、Java クラスのメインの入り口として Java 仕様によって定義されています。 Java クラスの操作は main メソッドによって開始されます:

 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关键字修饰变量和方法

以上が静的キーワードは何をするのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Feb 07, 2025 pm 12:11 PM

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。

See all articles