在Java中内部类主要分为成员内部类(非静态内部类、静态内部类)、匿名内部类、局部内部类。
成员内部类
1)、非静态内部类
- 非静态内部类必须存在一个外部类对象里。因此,如果有一个非静态内部类,那么一定存在对应的外部类对象。非静态内部对象单独属于外部类的某个对象。
- 非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员。
- 非静态内部类不能有静态方法、静态属性和静态初始化块。
- 外部类的静态方法、静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量、创建实例。
成员变量访问要点:
1、访问内部类里方法的局部变量:变量名
2、内部类属性:this.变量名
3、外部类属性:外部类名.this.变量名
public class Outer {
private int age=10;
class Inner{
private int age=20;
public void show() {
int age=30;
System.out.println(age);
System.out.println(this.age);
System.out.println(Outer.this.age);
}
}
}
创建内部类对象
Outer.Inner inner=new Outer().new Inner();
inner.show();
2)、静态内部类
定义方式
static class ClassName{
//类体
}
使用要点:
1、当一个静态内部类对象存在,并不一定存在对应的外部类对象。因此,静态内部类的实例方法不能直接访问外部类的实例方法。
2、静态内部类看做外部类的一个静态成员。因此外部类的方法中可以通过:”静态内部类.m=名字“的方式访问静态内部类的静态成员,通过"new 静态内部类()"访问静态内部类的实例。
静态内部类的访问
public class Outer {
//相当于外部类的一个静态成员
static class Inner{
}
}
//通过 new 外部类名.内部类名() 来创建内部类对象
Outer.Inner inner=new Outer.Inner();
匿名内部类
适合那些只需使用一次的类。比如:键盘监听操作。
匿名内部类的使用
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
注意
1、匿名内部类没有访问修饰符。
2、匿名内部类没有构造方法。
局部内部类
局部内部类,它是定义在方法内部的,作用域只限于本方法,称为局部内部类。
局部内部类的使用主要是用来解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类。局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法中被使用,出了该方法就会失效。局部内部类在实际开发中应用较少。
public class Test{
public void show() {
class Inner{
public void fun() {
System.out.println("Hello World");
}
}
new Inner().fun();
}
public static void main(String[] args) {
new Outer().show();
}
}