—— 你放心去浪,我替你说谎。
一、内部类与外部类之间的关系
1、内部类定义于外部类中,是一个相对独立的实体,对该外部类文件进行编译,会产生两个.class文件,其中内部类的.class文件名名称为 外部类名$内部类名.class。
2、内部类可以访问外部类的所有方法和属性,即使是私有,这是因为内部类持有一个外部类的一个引用。外部类无法直接访问内部类的属性和方法,必须通过内部类的对象引用才能进行访问,如果是静态内部类,外部类可以通过内部类的类名来引用静态变量。
3、内部类如果要声明静态变量,内部类必须声明为静态类。
二、非静态内部类对象的创建
1、在外部类之外创建内部类对象,需要先创建外部类对象,在通过外部类对象调用内部类的构造方法进行实例化。外部类对象只能调用内部类的构造方法,非构造方法以及元素必须通过内部类引用才能调用。
2、如果在外部类内部创建内部类对象,可以直接调用内部类的构造方法进行创建。构造方法可以被外部类调用,其他方法和属性必须通过内部类引用或类名才能调用。
三、内部类的分类
1、成员内部类:定义在外部类中的普通类(非static),属于外部类的成员,可以访问外部类的任何变量和方法。
2、局部内部类:定义在外部类的局部范围内,例如定义在方法中,只允许在方法中访问该内部类,不允许在方法外访问。局部内部类一般用在用于辅助解决问题而又不希望创建一个公共类的场景。
3、匿名内部类:匿名内部类是没有类名的局部内部类,因此它没有构造方法,必须定义在方法中,不能用访问修饰符修饰,不能具有静态成员,必须实现抽象类或者接口。
4、静态内部类:非静态内部类在编译完成后会拥有外部类的一个引用,因此它可以调用外部类的所有属性方法,同时,非静态内部类不能拥有静态变量。静态内部类没有拥有外部类的引用,静态内部类只能调用外部类的静态成员,不能访问非静态成员,外部类可以直接调用静态内部类的成员
四、内部类的创建
1、外部类外:通过外部类实例来调用new InnerClass()进行实例化
2、外部类内:new InnerClass(),对于静态内部类,不需要借助外部类实例进行创建,对于非静态内部类,需要借助外部类实例才能创建。
class Test{
public static void getInnerClass1(){
new InnerClass1();//不需要借助外部类实例创建
}
static class InnerClass1{
}
public static void getInnerClass2(){
new Test(). new InnerClass2();//需要借助外部类实例创建
}
class InnerClass2{
}
}
来源:https://www.cnblogs.com/st-client/p/8904983.html