什么是内部类
将一个类A定义在另一个类B里面,里面的那个类A就称为“内部类(InnerClass)”,类B则称为“外部类(OuterClass)。
为什么需要内部类
具体来说,当一个事物A的内部,还有一个部分需要完整的结构B进行描述,而这个内部的完整的结构B又只为外部事物A提供服务,不在其他地方单独使用,那么整个内部类的完整结构B最好使用内部类。
总的来说,遵循“高内聚、低耦合”的面向对象开发原则
内部类使用举例:
Thread类内部声明了state类,表示线程的生命周期
HashMap类中声明了Node类,表示封装的Key和Value
内部类的分类:(参考变量的分类)
成员内部类:直接声明在外部类的里面
使用static修饰的:静态成员内部类
不使用static修饰的:非静态成员内部类
public class OuterClassTest { public static void main(String[] args) { //1.静态内部类 Person.Dog dog = new Person.Dog(); dog.eat(); //2.非静态内部类的实例化 //错误方式:Person.Bird( Person p1 = new Person(); Person.Bird bird = p1.new Bird(); bird.eat();; bird.show("百灵鸟"); bird.show1(); } } class Person{ String name = "Tom"; int age = 24; static class Dog{ public void eat(){ System.out.println("狗吃骨头"); } } //非静态成员内部类 class Bird{ String name = "啄木鸟"; public void eat(){ System.out.println("鸟吃虫子"); } public void show(String name){ System.out.println("age:" + age); System.out.println("PersonName:" + Person.this.name); System.out.println("BirdName:" + this.name); System.out.println("ParamName:" + name); } public void show1(){ eat(); this.eat(); Person.this.eat(); } } public void eat(){ System.out.println("人吃饭"); } }
局部内部类:声明在方法内、构造器内、代码块内的内部类
匿名的局部内部类:
非匿名的局部内部类:
内部类这节的知识点:
成员内部类的理解
如何创建成员内部类的实例
如何在成员内部类中调用外部类的结构
局部内部类的基本使用
关于成员内部类的理解:
从类的角度看:
内部可以声明属性、、方法、构造器、代码块内部类等结构
此内部类可以声明父类,可以实现接口
可以使用fianl修饰
可以使用abstract修饰
从外部类的成员的角度看:
在内部可以调用外部类的结构。比如:属性、方法等
除了使用public、缺省权限修饰之外,还可以使用private、protected修饰
可以使用static修饰