成员内部类
1、定义:在类的内部定义的一个类;
2、使用:
2.1、内部类可以直接使用外部类的的成员(属性及方法)
外部类名.this.成员(方法及属性)
直接使用
2.2、外部类调用内部类的成员,必须先创建对象
2.3、其他的类访问内部类的成员,必须先创建内部类的对象
外部类.内部类 对象名 = new 外部类().new 内部类();
3、内部类的权限
1、内部类的权限和成员方法一样,private,默认,protected,public
2、外部类只能使用public 和默认
3、private效果等同于私有化方法,别的类无法进行调用,但是外部类可以直接调用,可以通过方法return回去。
4、我们可以把内部类当做一个类中的方法来看待
5、内部类同时具有方法和类的所有权益
4、内部类的作用:当一个类中的成员过多的时候,再次对类中的成员进行分组
静态内部类
1、定义
使用static关键字来修饰内部类
2、使用
2.1调用静态内部类中的非静态方法
new 外部类.内部类();
2.2、调用静态内部类中的静态方法
new 外部类.内部类.方法();
2.3、静态内部类调用外部的非静态方法
必须先创建外部类的对象然后才能进行调用
3、注意事项
3.1、只要内部类中存在静态方法那么内部类必须是静态的
3.2、内部类是静态的并不意味着内部类中的所有方法都是静态的
局部内部类
1、定义:
定义在类中方法中的内部类叫做局部内部类
2、使用
2.1、局部内部类的作用范围仅限于本方法中
2.2、局部内部类在访问他所在的方法中的局部变量必须用final关键字进行修饰
2.2.1、因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用
2.2.2、jdk 1.8 取消的这个定义 , 其实不是取消了, 是设置为了隐式的
匿名内部类
1、定义
就是内部类的简写形式,用于定义接口或者类的子类
2、使用
2.1、前提是必须存在一个类,或者接口
2.2、这里的类可以是具体的类,也可以是抽象的类
2.3、相当于一个子类继承或者实现一个类或接口,然后重写里面的方法,本质是一个继承或者实现了该接口的匿名子类对象
2.4、多用于规则简单,子类使用很少的接口应用中
3、格式
new 类名或者接口名(){
重写的方法;
}
总结:
成员内部类
对类中的成员再次分组
分组完成之后,内部类中的成员没有办法直接调用了, 必须先创建外部类对象
外部类对象.内部类对象
内外部类成员之间相互调用的问题?
内部类成员可以直接使用外部类的成员 , 外部类成员不能直接使用内部类的成员, 如果要使用,必须先创建对象
如果内部类中出现了和外部类相同的名称的成员, 内部类必须要调用外部类的同名成员, 外部类名.this.成员
静态内部类
成员内部类的写法造成了内部类的静态成员无法使用
将内部类也变成静态的
其他的成员之间的调用遵循的是 静态的特性
局部内部类
当一个类只在当前方法内使用的时候
局部内部类使用局部变量的时候, 变量要加上final关键
1.8 版本之后, 编译器如果发现局部内部类中使用到了局部变量,会自动添加final关键字, 否则不添加, 为了提高内存利用率和简化书写
匿名内部类
当一个类只使用一次的时候(省的起名字了)
局部内部类有的特性 匿名内部类都有
简写的一定有局限性