java中的内部类

115 阅读2分钟

1.定义

  1. 内部类是一个定义在另一个类中的类
  2. 内部类可以把一些数据统一的隐藏起来,从而增强面向对象的封装性

2.分类

  1. 非静态成员式的内部类

    1. 非静态成员式内部类可以访问该类定义所在的作用域中的所有数据,方法,包括私有数据
    2. 非静态成员式内部类不能声明static成员
    3. 非静态成员式内部类不能在该类定义静态方法中直接使用
    4. 访问非静态成员式内部类:外部类名.内部类 变量 = new 外部类名().new 内部类名()
    5. 非静态成员式内部类可以实现多继承
  2. 局部内部类

    1. 局部内部类定义在代码块、方法体内
    2. 局部内部类不能使用,private,public,protected,static修饰
    3. 局部内部类作用域仅限于当前方法中
    4. 局部内部类和非静态成员式内部类一样,不能拥有静态成员
    5. 局部内部类访问的局部变量必须是final修饰的,java8以后会自动添加上隐藏式的final
  3. 匿名内部类

    1. 匿名局部内部类
     public abstract class Person {
         public abstract void sleep();
     }
    
     public class Student extends Person {
     ​
         @Override
         public void sleep() {
             System.out.println("学生睡觉");
         }
     }
    
     public class Test {
         public static void main(String[] args) {
             Person p1 = new Person() {
     ​
                 @Override
                 public void sleep() {
                     System.out.println("学生睡觉");
                 }
             };
     ​
             p1.sleep();
     ​
             Person p2 = new Student();
             p2.sleep();
         }
     }
    

    在上面的代码中p1对象和p2对象一样,但是p1对象只能使用一次

    1. 匿名内部类使用前提,必须继承一个父类,或者去实现一个接口
  4. 静态成员式内部类

    1. 静态内部类,场景:如果一个类只想把另一个类隐藏起来,而不想引用外部类对象,类似于工具类
    2. 访问静态内部类的方法:外部类名.内部类名 = new 外部类名.内部类名()
    3. 静态成员式内部类创建实例对象的时候不必创建外部类对象
    4. 静态成员式内部类可以直接访问外部类的静态成员,不能直接访问外部类的非静态成员
    5. 外部类可以通过完整的类名直接访问静态内部类的静态成员

总结

内部类的出现是为了减少一个类的使用,即:如果该类只会使用一次,并且他的父类或者要实现的接口,那么就可以方便的使用内部类,这样可以让代码的结构更加紧凑