実際、名前が示すように、内部クラスはクラス内のクラスであり、クラス内には別のクラスが存在します。
内部クラスは 4 つのタイプに分類されます:
1. 通常の内部クラス
2. 静的内部クラス
3.メソッド内部クラス
4. 匿名内部クラス
1つずつ学んでいきましょう~~
A. 通常の内部クラス:
まずコードを通して理解しましょう:
package InternalClass; /** * 内部类 */ public class Car { public int a = 10; public int b = 20; //外部类的方法 public void method() { System.out.println("我是外部类Car的普通方法!"); bus b = new bus(); //创建内部类的对象 b.internalMethod(); } //内部类(在Car类中的bus类) public class bus { int b = 30; //内部类方法 public void internalMethod() { System.out.println("**这是bus内部类的普通方法!"); System.out.println("**我是内部类,现在在访问外部类Car的a:" + a); System.out.println("**我是内部类,现在在访问内部类bus的b:" + this.b); System.out.println("**我是内部类,现在在访问外部类bus的b:" + Car.this.b); //注意,如果在内部类需要使用外部类的属性,必须通过外部的类去this外部类的属性 } } //程序运行入口: public static void main(String[] args) { Car car = new Car(); //创建外部类的对象 car.method(); // 运行上面的代码 会输出 : 我是外部类Car的普通方法! //运行内部类的方法 //在上面method方法中已经创建了内部类bus的对象b //这里就是通过使用外部类Car的对象car去new一个内部类对象 bus b = car.new bus(); //通过内部类对象b 去使用方法即可 b.internalMethod(); //输出: /* **这是bus内部类的普通方法! **我是内部类,现在在访问外部类Car的a:10 **我是内部类,现在在访问内部类bus的b:30 **我是内部类,现在在访问外部类bus的b:20 */ } }
B. 静的内部クラス:
静的内部クラスは、名前が示すように、内部クラスも変更しますstatic を使用して静的にします。オブジェクトを作成せずに、外部クラスの名前を使用して直接呼び出すことができます:
package InternalClass; public class Person { String name = "小王"; static int age = 20; //创建静态内部类 public static class Student{ String name = "小红"; //静态内部类的方法 public static void study(){ Person p = new Person(); //创建外部类的对象 //静态访问非静态需要使用对象去调用 System.out.println("内部类静态方法访问外部非静态成员:"+p.name); System.out.println("内部类静态方法访问外部静态成员:"+Person.age); System.out.println("内部类静态方法访问内部非静态成员:"+new Student().name); } } //程序运行入口 public static void main(String[] args) { //静态内使用方法不需要创建对象 Student.study(); } /* 输出: 内部类静态方法访问外部非静态成员:小王 内部类静态方法访问外部静态成员:20 内部类静态方法访问内部非静态成员:小红 */ }
C. メソッド内部クラス:
Method内部クラスは、名前が示すように、外部クラスのメソッドでもあります。本体内に新しいクラスを作成します。
package InternalClass; /** * 方法内部类 */ public class Student { //方法 public void study(){ int age = 20; String name = "小王"; //在方法内写类:方法内部类 class child{ //方法内部类的方法 public void play(){ System.out.println("孩子喜欢玩!"); } } //在外部类study的方法内创建一个生成内部类child的对象,并使用方法 child c = new child(); c.play(); } //程序执行入口 public static void main(String[] args) { Student stu = new Student(); //这里调用study方法后,在study方法体内创建了child的对象和调用了play的方法 stu.study(); } } //输出:我叫:小王我今年:20我爱学习 // 孩子喜欢玩!
内部クラスの概要 (制限が多いため、有料にする必要があります)使用シナリオに注意してください):
1. クラス
2 の前にアクセス修飾子を置くことはできません。
2. このメソッド内でのみ使用できます
3. 作成できません静的情報
4. メソッド内のローカル変数とパラメータには直接アクセスできますが、変更することはできません
5. 外部クラスの情報には自由にアクセスできます
D. 匿名内部クラス:匿名内部クラスは名前のない内部クラスです:
最初にインターフェイスを定義します: 1. 匿名内部クラスは静的メンバーを定義できません。メソッド 2. 匿名内部クラスのメソッドは抽象メソッドにすることはできません 3. 匿名内部クラスは、インターフェイスまたは抽象親クラスのすべての抽象メソッドを実装する必要があります。 1. 内部クラスを使用する理由 2. 内部クラスの利点: 以上がJava内部クラスインスタンスの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。public interface USB {
void read();
}
package InternalClass;
/**
* 匿名内部类
*/
public class Child {
public static void main(String[] args) {
USB u = new USB() {
@Override
public void read() {
System.out.println("这是匿名内部类,是USB接口没有具名的子类,必须重写 接口做具体实现");
}
};
u.read();
}
}
4. 内部クラスによってアクセスされる匿名外部クラスのメンバー変数またはメンバー メソッドは、static
で変更する必要があります。内部クラスの概要:
内部クラスは、親クラスを継承し、インターフェイスを実装できるというクラスの基本的な特性を備えています。実際の問題では、インターフェイスでは解決できない問題がいくつか発生します。この場合、内部クラスを使用して、特定のクラスまたは抽象クラスを継承すると、複数の継承クラスが機能しないことによって引き起こされる一連の問題が間接的に解決されます。