内部クラスは理解するのが簡単ではありませんが、平たく言えば、あるクラスには別のクラスも含まれているという意味です
人間が脳、手足、器官などの体の部分で構成されているのと同じように、内部クラスは臓器の 1 つ、心臓など: 独自の属性と動作 (血液、鼓動) もあります
明らかに、ここでは心臓を属性やメソッドで一方的に表すことはできませんが、クラスが必要です
そして心臓外部クラスの内部にある内部クラスです
例 1: 内部クラスの基本構造
//外部类 class Out { private int age = 12; //内部类 class In { public void print() { System.out.println(age); } } } public class Demo { public static void main(String[] args) { Out.In in = new Out().new In(); in.print(); //或者采用下种方式访问 /* Out out = new Out(); Out.In in = out.new In(); in.print(); */ } }
実行結果: 12
上記の例から、内部クラスが内部クラスであることを理解するのは難しくありません。実際、クラスは優れたコード構造を大きく損なうのですが、なぜ内部クラスを使用する必要があるのでしょうか?
内部クラスは、外部クラスのオブジェクトを生成することなく、外部クラスのメンバー変数(プライベートを含む)を自由に使用できるため、これが内部クラスの唯一の利点でもあります
心臓が血液に直接アクセスできるのと同じように、医師を通して採血する代わりに体に血液を注入します
プログラムがコンパイルされると、Out.class と Out$In.class という 2 つの .class ファイルが生成されます
ここで、$ は上記のプログラムの Out.In のファイルを表します.
Out.In in = new Out( ).new In() は、内部クラス オブジェクトを生成するために使用できます。このメソッドには、注意する必要がある 2 つの小さな知識点があります
1。最初は、生成する必要がある内部クラスのオブジェクトがどの外部クラスにあるかを示すことです。
2、内部クラスのオブジェクトを生成する前に、まず外部クラスのオブジェクトを取得する必要があります。クラスは外部クラスのメンバー変数にアクセスします
例2: 内部クラスの変数アクセスフォーム
class Out { private int age = 12; class In { private int age = 13; public void print() { int age = 14; System.out.println("局部变量:" + age); System.out.println("内部类变量:" + this.age); System.out.println("外部类变量:" + Out.this.age); } } } public class Demo { public static void main(String[] args) { Out.In in = new Out().new In(); in.print(); } }
実行結果:
ローカル変数: 14
内部クラス変数: 13
外部クラス変数: 12
例 1 から、内部クラスに同じ名前のメンバー変数とローカル変数がない場合、内部クラスは Out.this を指定せずにクラスの外部のメンバー変数に直接アクセスすることがわかります。属性名
それ以外の場合、内部クラスのローカル変数は外部クラスのメンバー変数を上書きします
そして、内部クラス自体のメンバー変数にアクセスする場合は、 this.attribute name を使用して外部クラスにアクセスすることができます メンバー変数は使用する必要がありますOut.this. 属性名
例 3: 静的内部クラス
class Out { private static int age = 12; static class In { public void print() { System.out.println(age); } } } public class Demo { public static void main(String[] args) { Out.In in = new Out.In(); in.print(); } }
実行結果: 12
static を使用して内部クラスを静的にすると、内部クラスは外部クラスの静的メンバー変数にのみアクセスできることがわかります。制限があります
第二に、内部クラスは静的であるため、Out.In を全体として見ることができ、内部クラスのオブジェクトを直接新しいものにすることができます (クラス名を介して static にアクセスしても、外部クラスのオブジェクトは生成されません)。関係ありません)
例 4: プライベート内部クラス
class Out { private int age = 12; private class In { public void print() { System.out.println(age); } } public void outPrint() { new In().print(); } } public class Demo { public static void main(String[] args) { //此方法无效 /* Out.In in = new Out().new In(); in.print(); */ Out out = new Out(); out.outPrint(); } }
実行結果: 12
内部クラスを外部クラスのメソッドによってのみ操作したい場合は、private を使用して内部クラスを宣言できます
上記のコードでは、Out クラスでは、操作のために In クラスのオブジェクトが生成されなければなりません。また、Out.In in = new Out().new In() を使用して内部のオブジェクトを生成することはできなくなります。つまり、この時点での内部クラスは、外部クラスによってのみ使用できます。
例 5: メソッド内部クラス
class Out { private int age = 12; public void Print(final int x) { class In { public void inPrint() { System.out.println(x); System.out.println(age); } } new In().inPrint(); } } public class Demo { public static void main(String[] args) { Out out = new Out(); out.Print(3); } }
実行結果:
312
この時点で外部クラスのメソッドにパラメータを渡す必要がある場合は、クラスの外部メソッドのパラメータをfinalを使用して定義する必要があります。finalについては、ここでは特別な意味はありません。上記は Java の内部クラスの概要です。詳細については、PHP Chinese Net (www.php.cn) を参照してください。