Javaコードブロックの使用
記事の内容は、Shang Silicon Valley、jdk8、Eclipse環境から選択されています
コードブロックの機能
- コードブロックはクラスの内部メンバーの1つであり、staticキーワードでのみ変更できます。静的コードブロックは、静的コードブロックと呼ばれます。
- コードブロックは中括弧{}として記述され、初期化コードは括弧内に記述されます。
- コードブロックは初期化ブロックとも呼ばれ、一般的にクラスのプロパティに初期値を割り当てるために使用されます。
- 静的コードブロック内のコードは、クラスのロード時に実行でき、非静的コードブロック内のコードは、オブジェクトの作成時に実行できます。
- 静的コードブロック内のコードは、静的プロパティとメソッドのみを呼び出すことができ、非静的プロパティとメソッドを呼び出すことはできません。非静的コードブロックは、静的プロパティとメソッド、および非静的プロパティとメソッドを呼び出すことができます。
コードブロックの使用法
静的コードブロック
静的コードブロックは、コードブロックの先頭にあるstaticキーワードで変更されたコードブロックです。
コードは次のとおりです。
package com.atguigu.java3;
import com.atguigu.java2.MainTest;
public class BlockTest {
public static void main(String[] args) {
String str = Person.desc;
}
}
class Person{
int age;
String name;
static String desc ="我是一个人";
public Person(){
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
//静态代码块
static{
System.out.println("hello,static block");
}
//非静态代码块
{
System.out.println("hello block");
}
public void eat(){
System.out.println("人要吃饭");
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + "]";
}
public static void info(){
System.out.println("我是一个快乐的人");
}
}
操作の結果は次のとおりです。
こんにちは、静的ブロック
staticキーワードで変更された静的コードブロックは、クラスの情報がメソッド領域に読み込まれるときに、コードブロックのコンテンツもクラスのメソッド領域に読み込まれることを意味します。コードブロックと方法は、すぐに実行できるということです。
クラスがロードされると、静的コードブロックのコンテンツもすぐに実行されます。コードでは、String str = Person.desc;このステートメントは静的属性を呼び出します。このとき、実際には最初にクラスの情報をロードしてから、静的属性を呼び出します。静的コードブロックの内容はクラスのロードとともに実行されるため、出力hello、静的ブロック。
非静的コードブロック
静的コードブロックと同様に、非静的コードブロックはオブジェクトの作成時に実行されます。
mainメソッド内に2つのオブジェクトを作成します
public static void main(String[] args) {
String str = Person.desc;
Person p1 = new Person();
Person p2 = new Person();
}
結果は
hello、staticブロック
helloブロック
helloブロック
コードブロックの使用
クラスは通常1回しかロードされないため、静的コードブロックは通常1回だけ実行されます。クラスは複数のオブジェクトを作成できるため、非静的コードブロックは複数回実行できます。
コードブロックを使用して、オブジェクトのプロパティに値を割り当てることができます。
たとえば、非静的コードブロックに割り当てステートメントを追加します。
//非静态代码块
{
System.out.println("hello block");
age = 1;
}
public static void main(String[] args) {
String str = Person.desc;
Person p1 = new Person();
Person p2 = new Person();
System.out.println(p1.age);
}
このとき、mainメソッドの実行結果は
hello、staticブロック
helloブロック
helloブロック
1
同様に、静的コードブロックは静的プロパティに値を割り当てることもできます。といった:
//静态代码块
static{
System.out.println("hello,static block");
desc = "aabb";
}
public static void main(String[] args) {
String str = Person.desc;
System.out.println(Person.desc);
Person p1 = new Person();
Person p2 = new Person();
System.out.println(p1.age);
}
操作の結果は次のとおりです。
hello、static block
aabb
hello block
hello block
1
静的コードブロックの割り当てが、静的属性の明示的な割り当てを上書きしていることがわかります。
ps:複数のコードブロックと静的コードブロックをクラスで定義できます。実行の順序は定義の順序であり、静的コードブロックの実行は非静的コードブロックの実行よりも優先される必要があります。これは、クラスのロードは、非静的コードブロックの実行に先行する必要があります。オブジェクトの作成によって決定されます。複数のコードブロックを定義できますが、通常、複数のコードブロックを定義する必要はありません。複数のコードブロックを1つにマージする必要はありません。
属性が割り当てられる順序
属性の割り当てには、
- デフォルトの初期化(整数型は0に初期化され、参照型はnullに初期化されます)
- 表示の初期化(プロパティを宣言するときに初期化します)
- コンストラクターでの初期化
- オブジェクトを取得したら、オブジェクトを介して初期化します。属性またはオブジェクト。メソッド
上記の4つの方法の順序は初期化の順序です。1つ目は元の初期化方法であり、優先度が低いと理解できます。つまり、後者の初期化方法は前の初期化方法を上書きします。
ここで、もう1つのメソッド、つまり、コードブロック内の属性を初期化する方法があります。この初期化メソッドの優先度は、表示初期化メソッドと同じ優先度です。
package com.atguigu.java3;
public class OrderTest {
public static void main(String[] args) {
Order order = new Order();
System.out.println(order.orderID);
}
}
class Order{
int orderID = 3;
{
orderID = 4;
}
}
結果は4です
ただし、次の表示初期化とコードブロック初期化のシーケンスを交換する場合
class Order{
{
orderID = 4;
}
int orderID = 3;
}
出力結果は3です。
出力結果は定義されたシーケンスにのみ依存するため、コードブロックの初期化と表示の初期化の優先順位は同じであることがわかります。
- デフォルトの初期化(整数型は0に初期化され、参照型はnullに初期化されます)
- 表示の初期化(属性宣言時の初期化)/コードブロックの初期化
- コンストラクターでの初期化
- オブジェクトを取得したら、オブジェクトを介して初期化します。属性またはオブジェクト。メソッド