java中的内部类
目录
- java中的内部类
- 1.定义
- 2.分类
- 非静态成员式的内部类
- 局部内部类
- 匿名内部类
- 静态成员式内部类
- 总结
1.定义
- 内部类是一个定义在另一个类中的类
- 内部类可以把一些数据统一的隐藏起来,从而增强面向对象的封装性
2.分类
-
非静态成员式的内部类
- 非静态成员式内部类可以访问该类定义所在的作用域中的所有数据,方法,包括私有数据
- 非静态成员式内部类不能声明static成员
- 非静态成员式内部类不能在该类定义静态方法中直接使用
- 访问非静态成员式内部类:外部类名.内部类 变量 = new 外部类名().new 内部类名()
- 非静态成员式内部类可以实现多继承
-
局部内部类
- 局部内部类定义在代码块、方法体内
- 局部内部类不能使用,private,public,protected,static修饰
- 局部内部类作用域仅限于当前方法中
- 局部内部类和非静态成员式内部类一样,不能拥有静态成员
- 局部内部类访问的局部变量必须是final修饰的,java8以后会自动添加上隐藏式的final
-
匿名内部类
- 匿名局部内部类
public abstract class Person {public abstract void sleep(); }
public class Student extends Person {@Overridepublic void sleep() {System.out.println("学生睡觉");} }
public class Test {public static void main(String[] args) {Person p1 = new Person() {@Overridepublic void sleep() {System.out.println("学生睡觉");}};p1.sleep();Person p2 = new Student();p2.sleep();} }
在上面的代码中p1对象和p2对象一样,但是p1对象只能使用一次
- 匿名内部类使用前提,必须继承一个父类,或者去实现一个接口
-
静态成员式内部类
- 静态内部类,场景:如果一个类只想把另一个类隐藏起来,而不想引用外部类对象,类似于工具类
- 访问静态内部类的方法:外部类名.内部类名 = new 外部类名.内部类名()
- 静态成员式内部类创建实例对象的时候不必创建外部类对象
- 静态成员式内部类可以直接访问外部类的静态成员,不能直接访问外部类的非静态成员
- 外部类可以通过完整的类名直接访问静态内部类的静态成员
总结
内部类的出现是为了减少一个类的使用,即:如果该类只会使用一次,并且他的父类或者要实现的接口,那么就可以方便的使用内部类,这样可以让代码的结构更加紧凑