内部类
一、内部类
- 定义:将类写在 其他类 (外部类)的内部。可以写在成员位置、局部位置。
- 使用场景:在描述事物时,若一个事物内部,还包含其它可能还包含的事物。
- 例如:汽车中包含发动机,此时发动机就可以用内部类描述。
- 分类:成员内部类,局部内部类、匿名内部类,静态内部类。
- 内部类编译的特点:(OuterClass 外部类 InnerClass 内部类)
- 对一个外部类来说,在编译成功后,会出现两个Class文件。一个是 OuterClass.class ,另一个是 OuterClass$InnerClass.class 文件
- 内部类访问特点:
- 内部类 可以直接访问外部类的成员。
- 外部类 要访问内部类,必须要建立内部类对象。否则不可访问。
- 成员内部类
1 public class OuterClass { 2 3 class InnerClass01{ 4 //成员内部类 5 } 6 7 { 8 class InnerClass02{ 9 //局部内部类1 10 } 11 } 12 13 void method(){ 14 class InnerClass02{ 15 //局部内部类2 16 } 17 } 18 19 }
- 实例化方法:
- 方式一:在外部类的内部 :内部类 对象名 = new 内部类(实参列表);
-
InnerClass innerClass = new InnerClass("InnerClass"); innerClass.show("调用内部类");
//在外部类内部 - 方法二:在外部类的外部 :外部类.内部类 对象名 = new 外部类(实参列表).new 内部类(实参列表)
-
1 OuterClass.InnerClass innerClassss = new OuterClass().new InnerClass("方式二创建"); 2 innerClassss.show("内部类局部变量");
//在外部类外 - 注意事项:
- 内部类不能定义静态代码块
- 局部内部类
- 定义位置:定义在外部类方法体中的局部位置,与访问方法中的几部变量相似,可以通过调用方法进行访问。局部内部类还可以写在外部类的代码块中
- 明确:局部内部类时,可以将内部类当作局部变量来理解。
- 匿名内部类
- 没有类名的一种内部类 属于局部内部类的一种形式。
- 使用前提:必须要继承或者实现。
-
1 //抽象类 2 abstract class csAnimal { 3 public abstract void eat(); 4 public abstract void eata(); 5 6 public abstract void all(); 7 8 } 9 //方式二。通过定义匿名内部类来实现 10 csAnimal bird2 = new csAnimal() { 11 @Override 12 public void eat() { 13 System.out.println("匿名内部类实现的小鸟在吃东西。。。。。"); 14 } 15 16 @Override 17 public void eata() { 18 19 } 20 21 @Override 22 public void all() { 23 24 } 25 26 }; 27 bird2.eat(); 28 bird2.eata(); 29 30 31 32 //方式三、通过 匿名对象+匿名内部类 来实现 33 new csAnimal() { 34 @Override 35 public void eat() { 36 System.out.println("匿名内部的另外一种写法。。。。。"); 37 } 38 39 @Override 40 public void eata() { 41 System.out.println("ttttttttttttt。。。。。"); 42 } 43 44 @Override 45 public void all() { 46 eat(); 47 eata(); 48 } 49 }.all();
- 静态内部类
- 定义:关键字 static 修饰的内部类 就叫做静态内部类。
- 明确:将静态内部类,看做静态变量理解。
- 语法:
- 【修饰符】class 外部类名{
【修饰符】static class 内部类名{
//类体
}
}
- 静态内部类的创建方式:
- 方式一:在外部类的内部
- 内部类 对象 = new 内部类(实参列表);
- 方式二:在外部类的外部
- 外部类.内部类 对象名 = new 外部类的.内部类(实参列表);

浙公网安备 33010602011771号