前言
内部类可以分为四类:普通内部类、静态内部类、匿名内部类、局部内部类。
普通内部类
/**
* Function:普通内部类测试
*
* @author 一毛钱的魅力
* created on 2021/11/14
**/
public class OuterClazz {
public int outField_1=1;
protected int outField_2=2;
int outField_3=3;
private int outField_4=4;
public class CommonInnerClazz{
public int innerField_1=11;
protected int innerField_2=22;
int innerField_3=33;
private int innerField_4=44;
void printOuterAndInnerFields(){
//内部类对象依赖外部类的实例对象,内部类可以访问外部类对象中的所有权限字段。
System.out.println(String.format("访问外部类对象全部权限字段:%s;%s;%s;%s",outField_1,outField_2,outField_3,outField_4));
System.out.println(String.format("内部类对象字段:%s;%s;%s;%s",innerField_1,innerField_2,innerField_3,innerField_4));
}
}
public static void main(String[] args) {
CommonInnerClazz commonInnerClazz = new OuterClazz().new CommonInnerClazz();
commonInnerClazz.printOuterAndInnerFields();
System.out.println(commonInnerClazz.innerField_4);
}
执行结果
结论:普通内部类对象可以访问外部类对象中所有访问权限字段,同时,外部类对象也可以通过内部类的对象引用访问内部类中定义的所有访问权限字段。
注意:普通内部类中不可以定义静态属性
静态内部类
结论:静态内部类就像外部类的一个静态成员一样,创建其对象无需依赖外部类对象。同时,静态内部类非静态方法也无法访问外部的非静态成员,外部类依然可以利用静态对象访问静态内部类对象的所有访问权限的成员。
注意:静态内部类可以定义静态成员变量。
匿名内部类
匿名内部类有多种形式,其中最常见的一种形式莫过于在方法参数中新建一个接口对象/类对象,并实现这个接口申明/类中原有的方法。
/**
* Function:功能描述
*
* @author 一毛钱的魅力
* created on 2021/11/14
**/
public class AnonymousInnerClazzTest {
public int outField_1=1;
protected int outField_2=2;
int outField_3=3;
private int outField_4=4;
interface IPrinter{
void print(Object obj);
}
void test(){
IPrinter iPrinter = new IPrinter() {
int a=11;
@Override
public void print(Object obj) {
System.out.println(obj);
System.out.println("匿名内部类成员属性:"+a);
System.out.println("外部类对象成员属性:"+outField_4);
}
};
iPrinter.print(new Object(){
@Override
public String toString() {
return super.toString();
}
});
}
public static void main(String[] args) {
new AnonymousInnerClazzTest().test();
}
}
结论:在匿名内部类中可以使用外部类的属性,但外部类却不能使用匿名内部类中定义的属性。
局部内部类
/**
* Function:功能描述
*
* @author 一毛钱的魅力
* created on 2021/11/14
**/
public class LocalInnerClazzTest {
public int outField_1=1;
protected int outField_2=2;
int outField_3=3;
private int outField_4=4;
void test(){
class LocalInnerClazz{
private int field=11;
void print(){
System.out.println(outField_4);
}
}
new LocalInnerClazz().print();
}
public static void main(String[] args) {
new LocalInnerClazzTest().test();
}
}
结论:局部内部类里可以访问外部类对象所有权限的字段,而外部类却不能访问局部内部类中定义的字段,因为局部内部类的定义只在其特定的方法体/代码块中有效。