什么叫内部类?
定义在类内部的类就叫做内部类。
内部类分类?
内部类按定义位置分类:
- 成员内部类:和属性方法定义在一起的叫成员内部类。
- 局部内部类:定义在方法里面的内部类叫局部内部类(例如匿名类)。
内部类按修饰符分类?
- 静态类:被static修饰的内部类叫静态内部类
- 非静态类:不使用static修饰的内部类叫非静态内部类
静态内部类和非静态内部类的区别:
访问外部类属性和方法的方式不同:静态内部类只能直接访问外部类中静态的方法和属性,访问非静态方法和属性时必须创建外部类的对象。
静态内部类和非静态内部类中可以定义的东西不同:非静态内部类中不能定义静态成分,静态内部类中什么都可以定义
下图为在静态内部类和非静态内部类中调用外部类方法属性的区别:
由图可知:在非静态内部类中可以直接调用外部类的属性和方法(包括静态方法),但是在静态内部类中需要创建外部类对象才能调用,但是调用外部类静态方法时可以直接通过方法名调用。
如何创建这个非静态内部类对象?
外部类名.内部类名
内部类和外部类的区别:
访问方式不同:
内部类可以直接访问外部类中的成员
外部类必须创建内部类对象之后才能访问内部类
联系:
不论是外部类和内部类都会生成.class文件。
非静态内部类可以直接访问外部类的所有方法和属性(包括私有)
内部类可以直接访问外部类的属性
外部类必须创建内部类的对象才能访问内部类属性(两种情况)
第一种情况:在外部类里面访问内部类可以使用
Inner inner = new Inner();
Outer.Inner oi=new Outer.Inner();
第二种情况:在别的类中访问其他包的内部类,必须使用第二种创建方式,指定主从关系。(内部类必须是public修饰的)
非静态类创建对象,必须要创建一个外部类对象
Outer.Inner oi =new Outer().new Inner();
静态类创建对象,可以直接使用类名.静态内部类方法
Outer.Inner oi2=new Outer.Inner();