こんにちは!私たちは引き続き、Java のネストされたクラスのトピックを調査していきます。前回のレッスンでは、非静的入れ子クラス (内部クラスとも呼ばれます) について説明しました。 今日は別のグループに移り、静的ネストされたクラスを詳しく見てみましょう。 彼らは他のグループとどう違うのですか?このようなクラスを宣言するときは、すでによく知られている static キーワードを使用します。
public class Boeing737 {
private int manufactureYear;
private static int maxPassengersCount = 300;
public Boeing737(int manufactureYear) {
this.manufactureYear = manufactureYear;
}
public int getManufactureYear() {
return manufactureYear;
}
public static class Drawing {
public static int getMaxPassengersCount() {
return maxPassengersCount;
}
}
}
Boeing737
この例では、このモデルの飛行機を作成する外部クラスがあります。そして、製造年 ( int manufactureYear
) というパラメーターを 1 つ持つコンストラクターを持っています。int maxPassengersCount
最大乗客数という静的変数も 1 つあります。同じモデルのすべての航空機で同じなので、必要なコピーは 1 つだけです。さらに、静的な内部クラスであるDrawing
飛行機のブループリントがあります。このクラスでは、航空機に関するすべてのサービス情報をカプセル化できます。この例では、わかりやすくするために製造年に限定しましたが、他の多くの情報が含まれる可能性があります。 前回の講義で説明したように、このような入れ子になったクラスを作成すると、カプセル化が強化され、より現実的な抽象化が促進されます。静的ネストされたクラスと非静的ネストされたクラスの違いは何ですか? 1. 静的クラス オブジェクトは、Drawing
外部クラスの特定のインスタンスへの参照を保存しません。前回の講義の自転車の例を思い出してください。
public class Bicycle {
private String model;
private int mawWeight;
public Bicycle(String model, int mawWeight) {
this.model = model;
this.mawWeight = mawWeight;
}
public void start() {
System.out.println("Go!");
}
public class SteeringWheel {
public void right() {
System.out.println("Steering wheel to the right!");
}
public void left() {
System.out.println("Steering wheel to the left!");
}
}
}
SteeringWheel
そこでは、外部クラス (自転車) のオブジェクトへの参照が、気づかれずに内部クラス (ハンドル) の各インスタンスにどのように渡されるか について説明しましたBicycle
。外部クラスのオブジェクトがなければ、内部クラスのオブジェクトは存在できません。これは、静的に入れ子になったクラスには当てはまりません。静的に入れ子になったクラスのオブジェクトは、単独で簡単に存在できます。この点において、静的クラスは非静的クラスよりも「独立」しています。唯一のポイントは、そのようなオブジェクトを作成するときに、外部クラスの名前を指定する必要があるということです。
public class Main {
public static void main(String[] args) {
Boeing737.Drawing drawing1 = new Boeing737.Drawing();
Boeing737.Drawing drawing2 = new Boeing737.Drawing();
}
}
Drawing
前回の講義ではクラスSeat
(自転車シート) が非静的だったのに、クラスを静的に したのはなぜですか? 前回と同様に、例を理解するために少し「哲学」を追加してみましょう :) 自転車のシートとは異なり、図面の本質は飛行機の本質とそれほど密接に結びついておりません。自転車がなければ、別の座席オブジェクトはほとんどの場合無意味になります (ただし、常にではありません - これについては前回のレッスンで説明しました)。絵の本質はそれ自体に意味があります。たとえば、航空機の修理を計画しているエンジニアに役立つ可能性があります。計画に飛行機自体は必要なく、どこにでも配置できます。図面だけで十分です。さらに、同じモデルのすべての航空機の図面は同じであるため、座席と自転車のような厳密な接続はありません。したがって、オブジェクトはDrawing
特定の航空機オブジェクトへのリンクを必要としません。2. 外部クラスの変数およびメソッドへの異なるアクセス。静的にネストされたクラスは、外部クラスの静的フィールドにのみアクセスできます。この例では、クラスには外部クラスから静的変数の値を返すDrawing
メソッドがあります。ただし、値を返すメソッドを作成することはできません。結局のところ、変数は非静的です。つまり、変数は特定のインスタンスに属している必要があります。そして、すでにわかったように、静的に入れ子になったクラスの場合、外側のクラスのオブジェクトが簡単に欠落する可能性があります。したがって、制限があります:) 外部クラスの静的変数にどのようなアクセス修飾子があるかは関係ありません。たとえ であっても、静的にネストされたクラスからのアクセスは存在します。上記のすべては、静的変数へのアクセスだけでなく、静的メソッドへのアクセスにも関係します。重要!内部クラス宣言内の単語は、作成できるオブジェクトが 1 つだけであることを意味するものではありません。オブジェクトと変数を混同しないでください。静的変数について話している場合、はい、たとえば、静的クラス変数は単一のコピーに存在します。ただし、入れ子になったクラスに適用すると、そのオブジェクトに外部クラスのオブジェクトへの参照が含まれないことだけが意味されます。そして、好きなだけオブジェクトを作成できます。 getMaxPassengersCount()
maxPassengersCount
getManufactureYear()
Drawing
manufactureYear
manufactureYear
Boeing737
private
static
maxPassangersCount
static
public class Boeing737 {
private int manufactureYear;
private static int maxPassengersCount = 300;
public Boeing737(int manufactureYear) {
this.manufactureYear = manufactureYear;
}
public int getManufactureYear() {
return manufactureYear;
}
public static class Drawing {
private int id;
public Drawing(int id) {
this.id = id;
}
public static int getPassengersCount() {
return maxPassengersCount;
}
@Override
public String toString() {
return "Drawing{" +
"id=" + id +
'}';
}
public static void main(String[] args) {
for (int i = 1; i < 6; i++) {
Boeing737.Drawing drawing = new Boeing737.Drawing(i);
System.out.println(drawing);
}
}
}
}
メソッドをmain()
ネストされたクラス内で直接宣言し (これに特別な理由はありません。これが可能であることがわかるだけです)、5 つのオブジェクトを作成しましたDrawing
。外部クラスのオブジェクトが 1 つも存在しないにもかかわらずです。ご覧のとおり、問題はありませんでした:) コンソール出力:
Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
これでレッスンは終わりです。念のため、Oracle ドキュメントのそれらに関するセクションへのリンクを残しておきます。不明な点があれば読んでください。今度は、いくつかの問題を解決します。:)
GO TO FULL VERSION