内部类
1、内部类概念
概念:在一个类的内部再定义一个完整的类
特点:
- 内部类可直接访问外部类的私有成员,而不破坏封装性
- 可为外部类提供必要的内部功能组件
//Out外部类 public class Out { //String为Out类的私有属性 private String name; //In为内部类 public class In{ public void printName(){ System.out.println(name); } } }
此处我们可以看见,Out类内部定义了一个In类,这个In类就是Out的内部类,它可以直接访问外部类Out的私有成员name。
2、内部类分类
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类

3、成员内部类
- 在类的内部定义,与实例变量、实例方法同级别的类
- 创建内部类对象时,必须依赖外部类对象
如果想要创建内部类对象,必须先实例化一个外部类对象,然后通过外部类的对象来创建内部类的对象,如以下代码:
//1.创建外部类对象 Out outer = new Out(); //2.创建内部类对象 Out.In inner = outer.new In();
- 当外部类、内部类存在重名属性时,会优先访问内部类属性
- 成员内部类中,不能定义静态成员,但可以包含静态常量
4、静态内部类
- 不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员(与成员内部类不同)
//Out外部类 public class Out { //String为Out类的私有属性 private String name = "outer"; private int age = 20; //In为静态内部类,级别和外部类相同 public static class In{ private String address = "xxx"; private String phone = "11"; //可以包含静态成员 private static int num = 100; public void show(){ /** * 调用外部类的属性 * 1.首先创建外部类对象 * 2.调用外部类对象成员属性 */ Out outer = new Out(); System.out.println(outer.name); System.out.println(outer.age); } } }
其中静态内部类如果想使用外部类的成员,必须先创建外部类对象,然后调用外部类对象成员属性。
//创建内部类对象,这里并没有实例化外部类对象 Out.In inner = new Out.In();
创建静态内部类对象时,不需要创建外部类对象,可直接创建。
- 只有内部类可以是静态static的,普通的类不可以是静态类
5、局部内部类
- 定义在外部类的方法中,作用范围和创建对象仅限于当前方法,所以需要在方法中创建内部类的对象
//Out外部类 public class Out { //String为Out类的私有属性 private String name = "outer"; private int age = 20; public void show(){ //定义局部变量 String address = "xxx"; //局部内部类 class In{ private int id = 1; public void show2(){ //可以直接访问外部类的属性 System.out.println(Out.this.name); System.out.println(Out.this.age); //访问内部类的属性 System.out.println(this.id); //访问方法的局部变量 System.out.println(address); } } //在方法内部创建局部内部类对象 In inner = new In(); inner.show2(); } }
注:可以直接访问外部类的成员属性
- 局部内部类跟局部变量一样,不可以加访问修饰符
- 局部内部类中不可以添加静态成员,但是可以添加静态常量
6、匿名内部类
- 没有类名的局部内部类(一切特征与局部内部类相同)
- 必须继承一个父类或者实现一个接口
- 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
public interface USB { void service(); }
这是一个接口USB
//使用匿名内部类 USB usb = new USB() { @Override public void service() { System.out.println("连接成功"); } }; usb.service();
这是一个匿名内部类,相当于要使用某一个接口时,临时构建一个内部类
欢迎关注微信公众号,不定期分享学习笔记与资料,与Mike一起学java,谢谢~

浙公网安备 33010602011771号