Java学習の道-静的キーワードの使用
概要概要
static
これはJavaプログラムの静的修飾子です。静的修飾子とは何ですか?
ご存知のとおり、プログラム内の変数またはコードは、コンパイル時にメモリを格納するためにシステムによって自動的に割り当てられます。いわゆる静的とは、割り当てられたメモリがコンパイル後に常に存在し、メモリが解放されるまで解放されないことを意味します。プログラムが実行されて終了します。このスペース。つまり、プログラムが実行されている限り、このメモリは常に存在します。
static
これは「グローバル」または「静的」を意味し、メンバー変数とメンバーメソッドを変更するために使用され、静的静的コードブロックを形成することもできますが、Java言語にはグローバル変数の概念はありません。
1つの静的属性
クラスメンバー変数を静的に分類するかどうかに応じて、次の2つのタイプがあります。
- 1つは、静的変数またはクラス変数と呼ばれる、静的変数によって変更される変数です。
- もう1つは、インスタンス変数と呼ばれる、静的によって変更されない変数です。
2つの違いは次のとおりです。
- JVMは、静的に1回だけメモリを割り当て、メモリには静的変数のコピーが1つだけあります(メモリ節約)。
- クラスをロードするプロセスで静的変数のメモリ割り当てを完了します。
- 静的変数のロードは、インスタンスのロードに先行します。
- インスタンスが作成されるたびに、メモリがインスタンス変数に割り当てられ、インスタンス間のインスタンス変数は相互に影響しません。
使用のタイミング:通常の状況では、クラスに属し、インスタンスオブジェクトとともに変化する変数を静的変数に設定しません。
アクセス許可
オブジェクトを呼び出す | クラス属性 | インスタンス属性 |
---|---|---|
クラス | ✓✓ | ✘ |
インスタンスオブジェクト | ✓✓ | ✓✓ |
public class Demo {
public static void main(String[] args) {
// 直接通过 Man 类调用 gender 属性
System.out.println(Man.gender);
// 实例属性
Man m1 = new Man();
m1.name = "张三";
Man m2 = new Man();
m2.name = "李四";
System.out.println(m1.name);
System.out.println(m2.name);
// 通过实例对象调用 gender 属性
System.out.println(m1.gender);
// 通过 m1 修改了类属性,那么 m2 输出的类属性也会变化
m1.gender = "女";
System.out.println(m2.gender);
}
}
class Man {
String name;
static String gender="男";
}
2、静的メソッド
静的メソッドはクラス名で直接呼び出すことができ、任意のインスタンスを呼び出すこともできます。
したがって、thisキーワードとsuperキーワードは静的メソッドでは使用できず、クラスのインスタンス変数とインスタンスメソッドに直接アクセスすることはできません(つまり、静的メンバー変数と静的なしのメンバーメソッド)。静的メンバー変数とのメンバーメソッドのみにアクセスできます。クラスにアクセスできます。インスタンスメンバーは特定のオブジェクトに関連付けられているためです。
静的メソッドはインスタンスから独立しているため、抽象メソッドではなく静的メソッドを実装する必要があります。
使用時期:通常、クラス属性の変更方法とツールクラスの方法をクラスメソッドとして設定します。
通話許可
オブジェクトを呼び出す | クラスメソッド | インスタンスメソッド |
---|---|---|
クラス | ✓✓ | ✘ |
インスタンスオブジェクト | ✓✓ | ✓✓ |
3つの静的コードブロック
静的コードブロックは、静的コードブロックとも呼ばれます。これは、クラスメンバーから独立したクラス内の静的ステートメントブロックです。複数の場合があり、位置は自由に配置できます。メソッド本体にはありません。通常のコードブロックは、インスタンスの作成時に実行され、クラスの属性とメソッド、およびインスタンスの属性とメソッドにアクセスできます。
JVMは、クラスのロード時にこれらの静的コードブロックを実行します。静的コードブロックが複数ある場合、JVMはクラスに表示される順序でそれらを実行し、各コードブロックは1回だけ実行されます。
オブジェクト | クラス属性とクラスメソッドにアクセスする | インスタンスのプロパティとインスタンスメソッドにアクセスする |
---|---|---|
静的コードブロック | ✓✓ | ✘ |
通常のコードブロック | ✓✓ | ✓✓ |
public class Demo {
static {
System.out.println("Hello!");
}
public static void main(String[] args) {
System.out.println(new Man());;
}
static {
System.out.println("Bye!");
}
}
class Man {
{
System.out.println("Nice to meet you.");
System.out.println(this.getClass());
}
}
// Hello!
// Bye!
// Nice to meet you.
// class Man
上記の例から、静的コードブロックが最初に自動的に順番に実行されることがわかります。
計算によって静的変数を初期化する必要がある場合は、クラスがロードされたときに1回だけ実行される静的コードブロックを宣言することで、静的変数を処理できます。インスタンスの作成時にインスタンスオブジェクトを操作する必要がある場合は、通常のコードブロックを使用できます。