内部类基础

成员内部类

1.外部类只有两种访问控制符,即public和default(包访问控制级别)。原因:外部类的上一级程序单元是包,所以它只有两种作用域:同一个包内和任何位置,这样只需要用public和default即可,用public 修饰的类可以被任何位置的其他类访问,而不添加访问控制符的类的访问控制权限为包访问级别,即该类只能被同一个包的其他类访问。
2.内部类有四种访问控制符,因为内部类实际上就是外部类的一个成员,所以内部类的上一级程序单元为类,因此它有四种作用域:同一个类、同一个包、父子类和任何位置,因此可以使用四种访问控制权限。
3.外部类可以访问内部类的私有属性。 **

package com.fjnu.Review;

public class InstanceInnerClass {
    int a;
    private int b;
    static int c;

    public static void main(String[] args) {
        //外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问
        InstanceInnerClass.Inner1 inner1 = new InstanceInnerClass().new Inner1();
        System.out.println(inner1.p);
    }

    class Inner1{
        int o;
        private int p = 5;

        int getPb(){
            return p + c;
        }
    }
}

局部内部类

局部内部类不能有访问权限修饰符和static修饰符,即默认为default,但可以用final修饰,同方法中的变量。

匿名内部类

1.匿名内部类能够在实现父类或者接口中的方法情况下同时产生一个相应的对象,但是前提是这个父类或者接口必须先存在才能这样使用。
2.匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

静态内部类

静态内部类不依赖于外部类,可以直接创建对象,Outer.Inner inner = new Outer.Inner();

深入理解内部类

内部类的使用场景和好处