内部クラスの分類: 通常の内部クラス、静的内部クラス、プライベート内部クラス、ローカル内部クラス、および匿名内部クラス。
//外部类 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 in = new Out().new In() を使用して内部クラスのオブジェクトを生成できます
1. Out.最初は、生成する必要がある内部クラスのオブジェクトがどの外部クラスにあるかを示すためです
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 属性を指定せずにクラスの外部メンバー変数に直接アクセスすることがわかります。 name
それ以外の場合、内部クラスのローカル変数は外部クラスのメンバー変数を上書きします
そして、内部クラス自体のメンバー変数にアクセスするには、this.attribute nameを使用して外部クラスにアクセスできます。メンバー変数はOutを使用する必要があります.this. 属性名
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 にアクセスしても、外部クラスは生成されません)クラスオブジェクトは関係ありません)
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 を使用して内部クラス
上記のコードでは、操作のために In クラスのオブジェクトを Out クラスで生成する必要があり、Out.In in = new Out().new In() を使用して内部クラスのオブジェクトを生成することはできなくなりました。内部クラス
つまり、この時の内部クラス 外部クラスのみが制御可能です
同様に、私の心は私の体によってのみ制御され、他の人はそれに直接アクセスすることはできません
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); } }
実行結果:
3
12
上記のコードでは、内部クラスを外部クラスのメソッドに移動し、外部クラスのメソッドで内部クラス オブジェクトを生成して内部クラスを呼び出します。 Method
この時に外部クラスのメソッドに渡す必要がある場合はパラメータを入力し、外部クラスのメソッドパラメータはfinalを使って定義する必要があります
Finalについては特に意味はなく、単なる表現形式です
以上がJavaの内部クラス(基本)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。