1、成员内部类
修饰符 class Outer {
修饰符 class INner {
//
}
}
注意:内部类使用外部类随意访问,外部类使用内部类要借助内部类对象
使用成员内部类:
a、间接方式:在外部类的方法中使用内部类,main只是调用外部类的方法
b、直接方式:
外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称()
public class OuterClass {
private String name = "outer";
public void methodOuter() {
int num = 10; // 局部变量
System.out.println("Outer method");
System.out.println();
System.out.println(name);
class Inner {
private String name = "inner";// 内外重名
public void methodInner() {
System.out.println("INNer method");
System.out.println(name);// 可以访问外部类的成员变量
System.out.println(this.name);// 访问内部类成员变量
System.out.println(OuterClass.this.name);// 访问外部类成员变量
//内部类如果要访问所在方法的局部变量,那么这个变量必须是final的,或者是事实上是[final]的,也就是不改变的
System.out.println(num);
}
}
}
}
2、局部内部类:方法里的内部类
上面的class Inner是在方法MethodOuter里的
3、匿名内部类:局部内部类的一种
如果接口的实现类(或者父类的子类)只需要使用一次,那么在这种情况下就可以省略该类的定义,而改为使用【匿名内部类】
匿名内部类的格式:
//接口本来不可以直接new,用于不必为了接口写一个接口的实现类
接口名称 对象名 = new 接口名称 {
这里是匿名内部类的内容
在这里面覆盖重写所有的接口抽象方法
@Override
public void method1() {
body
}
}
注意事项:
a、new 代表创建对象的动作
b、接口名称就是匿名内部类要实现哪个接口
c、匿名内部类在创建对象时只能唯一使用一次,如果希望多次创建对象,并且类的内容是一样的,最好还是写一个该接口的实现类
d、匿名对象在调用方法的时候只能调用一次,如果希望调用多次方法,那就应该为匿名对象起个名字
e、匿名内部类是省略了实现类(子类),匿名对象是省略了对象的名称