内部クラスは、別のクラスの内部で定義されたクラスです。
内部クラスを使用する理由:
- 内部クラスは同じパッケージ内の他のクラスから隠すことができます
- 内部クラスのメソッドは、クラスのスコープを定義するデータ (プライベートなデータも含む) にアクセスできます。
構文形式は次のとおりです。
class OuterClass { // 外部类
// ...
class NestedClass { // 嵌套类,或称为内部类
// ...
}
}
内部クラスにアクセスするには、外部クラスのオブジェクトを作成してから、内部クラスのオブジェクトを作成します。一般に、静的内部クラスと非静的内部クラスがあります。
内部クラスの分類
-
外部クラスのローカルな場所(メソッド内など)で定義されます。
1) ローカル内部クラス (クラス名あり)
2) 匿名内部クラス (クラス名なし)
-
外部クラスのメンバー位置で定義されます。
1) メンバー内部クラス (静的変更なし)
2) 静的内部クラス (静的変更を使用)
1. メンバ内部クラス(非静的内部クラス)
非静的内部クラスは、別のクラス内にネストされたクラスです。これは、しばしば内部クラスと呼ばれる外部クラスのメンバーにアクセスできます。
内部クラス オブジェクトの作成: 内部クラスは外部クラスにネストされているため、最初に外部クラスを作成し、次に外部クラス オブジェクトを使用して内部クラス オブジェクトを作成する必要があります。
public class InnerClass {
public static void main(String args[])
{
OutClass myOutClass = new OutClass();
OutClass.InnerClass myInClass = myOutClass.new InnerClass();
System.out.println(myOutClass.x+myInClass.y);
}
}
class OutClass
{
int x = 10;
class InnerClass
{
int y = 5;
}
}
まず外部クラス オブジェクトを作成し、その外部クラス オブジェクトを使用して内部クラス オブジェクトを再度作成します。
外部クラス名. 内部クラス名 内部クラス オブジェクト = 外部クラス オブジェクト 新しい内部クラス コンストラクター
内部クラスは、private および protected 修飾子を使用して変更できます。外部クラスが内部クラスにアクセスしないようにする場合は、private 修飾子を使用できます。
2. 静的内部クラス
静的内部クラスは static キーワードを使用して定義できます。静的内部クラスにアクセスするために外部クラスを作成する必要はなく、直接アクセスできます: (上記の例)
public class InnerClass {
public static void main(String args[])
{
OutClass.InnerClass myInClass = new OutClass.InnerClass();
System.out.println(myInClass.y);
}
}
class OutClass
{
int x = 10;
static class InnerClass
{
int y = 5;
}
}
3. メンバーの内部クラスと外部クラスのメンバーは相互にアクセスします
内部クラスの高度な使用法は、外部クラスのプロパティとメソッドにアクセスすることです。
例は上記と同じです。外部クラスに文字列を追加し、フィールド x と外部クラスの文字列を取得するメソッドを内部クラス (非静的) に追加します。
public class InnerClass {
public static void main(String args[])
{
OutClass myOutClass = new OutClass();
OutClass.InnerClass myInnerClass = myOutClass.new InnerClass();
System.out.println(myInnerClass.getOutClass_Method());
}
}
class OutClass
{
int x = 10;
static String string = "Hello";
class InnerClass
{
int y = 5;
public int getOutClass_Method()
{
return x+string;
}
}
}
知らせ:
(1) 上記の例から、内部クラスは外部クラスの文字に直接アクセスできることがわかります。内部クラスのアクセス 静的内部クラスは、外部クラスのメンバーにアクセスできません。外部クラスのフィールドがプライベートの場合でも、内部クラスにはアクセスできます。
(2)外部クラスと内部クラスのメンバーが同じ名前の場合、内部クラスへのアクセスはデフォルトで近接性の原則に従います。外部クラスのメンバーにアクセスしたい場合は、(外部クラスname.this.member) にアクセスします
class OutClass { private int x = 10; class InnerClass { int x = 5; public int getOutClass_Method() { return this.x; //近接性の原理によれば、x の値は 5 であることに注意してください } } }戻り値が return OutClass.this.x の場合、x の値は 10
(3)、外部クラスアクセスメンバ内部クラス
メンバー内部クラスは外部クラスのメンバーとして理解できるため、外部アクセスでは最初にオブジェクトを作成する必要があります。つまり、外部クラスを使用してアクセスする内部クラス オブジェクトを作成します。
new OutClass().new InnerClass().getOutClass_Method()
4. 静的内部クラスが外部クラスのメンバーにアクセスする
外部クラスのメンバーにアクセスするには、内部クラスに外部クラスのオブジェクトを作成します。
形式: 新しい外部クラスのconstructor.field
class OutClass
{
private int x = 10;
static class InnerClass
{
int x = 5;
int y = 100;
public int getOutClass_Method()
{
return new OutClass().x;
}
}
}
この時点で、x の値は 10 になります。
要約すれば:
1. メンバーの内部クラス
1. 外部クラスは内部クラスのメンバーにアクセスし、最初に外部クラスのオブジェクトを作成します
形式: 外部クラス名. 内部クラス名 内部クラス オブジェクト = 外部クラス オブジェクト 新しい内部クラス コンストラクター
また
新しい外部クラス名.新しい内部クラス名
2. 内部クラスが外部クラスのメンバーにアクセスする
形式: 外部クラス名.this.member (フィールド) 外部クラス名.メソッド
また
直接インタビュー
2. 静的内部クラス
1. 外部クラスが内部クラスのメンバーにアクセスする
形式: 外部クラス名. 内部クラス名 内部クラス オブジェクト = 新しい外部クラス名. 内部クラス コンストラクター
2. 内部クラスが外部クラスのメンバーにアクセスする
形式: 新しい外部クラス名.メンバー (this.field)
5、ローカル内部クラス
1. ローカル内部クラスは、メソッド内など、外部クラスのローカルな位置に定義され、クラス名を持ちます。
2. ローカル クラスを宣言するときにアクセス修飾子を使用することはできません。また、ローカル クラスのスコープは、ローカル クラスが宣言されているブロックに制限されます。
3. 他の外部クラスはローカルの内部クラスにアクセスできません
4.ローカル内部クラスはメソッド/コード ブロックで定義されます。
6. 匿名の内部クラス
1. 匿名内部クラスの構文はかなり特殊ですが、匿名内部クラスはクラス定義であるだけでなく、オブジェクトそのものでもあるため、文法的には次の両方の性質を持っていますので注意してください。クラスとオブジェクト作成の特性を定義するため、匿名の内部クラス メソッドを呼び出すことができます。
2. 外部クラスのすべてのメンバー (プライベート クラスを含む) に直接アクセスできます
3. ステータスはローカル変数であるため、アクセス修飾子を追加できません
4. スコープ: メソッドまたはそれを定義するコード ブロック内のみ。
5. 匿名内部クラス — アクセス ---> 外部クラス メンバー [アクセス方法: 直接アクセス]
6. その他の外部クラス — アクセスなし ---> 匿名内部クラス (匿名内部クラスのステータスがローカル変数であるため) )
7. 外部クラスと匿名内部クラスのメンバーが同じ名前を持つ場合、匿名内部クラスはデフォルトで近接性の原則に従います。外部クラスのメンバーにアクセスしたい場合は、(externalクラス名.this.member) にアクセスします