java-内部类

1 内部类与外部类的区别

  1. 内部类(除了局部内部类和匿名内部类)比外部类可以多使用三个修饰符:private、protected、static
  2. 非静态内部类不能拥有静态成员

2 内部类的分类

  1. 成员内部类
    1. 非静态内部类
    2. 静态内部类
  2. 局部内部类
  3. 匿名内部类

3 非静态内部类

  1. 非静态内部类不能有静态成员。
  2. 如果外部类成员变量、内部类成员变量与内部类方法的局部变量重名、可以通过 外部类类名.this、this来区分。
  3. 外部类静态成员不能直接(可以通过创建实例)访问非静态内部类的变量、方法,包括创建实例。

4 静态内部类

  1. 外部类的上一级是包,所以不可使用static修饰。但是静态内部类的上一级是外部类,可以使用static修饰。
  2. 静态内部类只能访问外部内部类的静态成员。
  3. 外部类内部类只能直接(可以通过创建实例访问其他的成员)访问静态内部类的静态成员。
  4. 接口内部类只能是静态内部类,默认使用public static修饰。

5 内部类的编译

  1. 内部类:OuterClass.class、OuterClass$InnerClass.class...
  2. 局部内部类:OuterClass.class、OuterClass$NInnerClass.class...
  3. 匿名类:OuterClass.class、OuterClass$NInnerClass.class...

6 使用内部类

6.1 在外部类内部使用内部类

6.2 在外部类以外使用内部类

  不能使用private修饰内部类,跟变量和方法的修饰符一个意思。

  定义内部类变量:OuterClass.InnerClass varName,如果外部类有包名,加上包名;

6.2.1 使用非静态内部类

  必须先创建外部类实例,才能创建内部类的实例。

  OuterInstance.new InnerContructor();

public class InnerClassTest {
    public InnerClassTest(){}
    
    public class A{
        public A(String a){
            System.out.println(a);
        }
    }
}

class B extends InnerClassTest.A{
    public B(InnerClassTest innerClassTest) {
        innerClassTest.super("hello");
    }
}

class C{
    InnerClassTest.A a = new InnerClassTest().new A("hello");
}
View Code

6.2.2 使用静态内部类

OuterClass.InnerClass var = new OuterClass.InnerClass(...);

7 局部内部类

  1. 不能用static和访问控制符修饰。
  2. 局部内部类和匿名内部类访问的局部变量默认是final修饰的,java 8以前必须显式使用final关键字修饰。

7.1 普通的

7.2 匿名内部类

  1. 必须实现一个类或一个接口
  2. 不能是抽象类,系统直接创建对象
  3. 不能定义构造器,没有类名。
原文地址:https://www.cnblogs.com/zhouj-happy/p/5841878.html