Java内部类

Java 内部类
分四种:成员内部类、局部内部类、静态内部类和匿名内部类。
成员内部类
成员内部类中不能定义静态变量,静态方法和静态代码块
可以访问外部类的所有成员(包括静态和私有的,可以使用外部类的泛型: 外部类.this.属性或方法,静态的不用this.)
成员外部类不可以访问内部类中的方法,属性(因为内部类还么没有实例化)
成员外部类的变量如果和内部类的变量没有同名的,则可以直接用变量名访问外部类的变量
必须在外部类中才可以实例化内部类,所以外部类构造不内部类构造方法快
成员内部类编译后文件名是: 外部类名$内部类名.class
成员内部类的访问权限可以是public 默认 protected private 可以有abstract内部类 final内部类
成员内部类中不可以定义接口,枚举, 但可以定义无数个抽象类,内部类,内部类中的内部类中的内部类…….
成员内部类可以实现接口和继承(可以继承内部类 /神经病/)
实例内部类: 外部实例对象.new 内部类() 或者在外部类中定义一个返回内部类实例的方法(静态方法不可以实例内部类)
外部类可以访问内部类中的private(其他内部类一样)
结论:内部中不可有静态,可以访问外部类所有,必须有外部类才可以有内部类,外部类不可以访问内部类除构造方法,构造块外的所有

局部内部类
局部类可以定义在所有方法中(包括静态方法,构造方法,构造代码块和静态代码块 就像一个成员变量一样)
不可以声明权限,可以声明为final和abstrace其他不可以,其实和成员变量一样(abstract除外)
静态方法中的成员内部类不可以使用外部类中中非静态
局部内部类可以访问外部类所有
只有声明局部内部类中的方法才可以实例化局部内部类
不可以声明静态和外部类一样
可以访问外部方法中的局部变量
this.变量名访问内部类中的变量 外部类类名.this.变量名访问成员变量,方法同理(和成员内部类一样)
不可以在局部内部类未声明前实例它,必须在声明后面实例它
可以实现接口,继承类
11.局部内部类访问形参和成员变量必须声明形参和实参为final 不过jdk1.8中不用声明为final只要不多次复制就可以了 (因为局部变量生命周期和方法一样,当栈帧(方法)出栈时有可能内部类对象可能存在于堆中,那是变量已经不存在了,但final修饰的局部变量在堆(heap)中)

结论:局部内部类就是一个局部变量(但它可以声明为abstract)

静态内部类
实例不需要外部类”帮忙” new 外部类名.内部类名();
静态内部类不能直接访问外部类的非静态成员,静态内部类可以直接访问外部类的静态成员数据
静态内部类可以有静态方法和静态属性和静态代码块
实例化静态内部类不会调用外部类中的静态代码块

结论:相当余一个独立的类,但它可以访问外部类中的静态属性和静态方法

匿名内部类:只可以使用一次,没变量名
形式: new 接口或抽象类(抽象类的构造参数){
成员变量…..
复写方法……
自定义方法….
};

匿名类部类不可以添加构造方法可以添加普通代码块
匿名内部类不可以有static
匿名内部类如果实例抽象类会先执行匿名内部类中的构造代码快
匿名内部类访问形参和成员变量必须声明形参和实参为final 不过jdk1.8中不用声明为final只要不多次复制就可以了(和局部内部类一样)

总结
成员内部类规则看成普通方法
静态内部类规则看成静态方法
局部内部类规则看成局部变量(可以声明为abstract)
匿名内部类看成是一个实现类
局部内部类和匿名内部类只可以使用一次赋值的成员变量和形参
只有匿名内部类不可以定义构造方法

你可能感兴趣的:(java,内部类)