内部类
内部类:成员内部类(全局)、局部内部类、匿名内部类
1.成员内部类:在内部类中直接存取所在类的私有成员变量。
内部类的实例一定要绑定在外部类的实例上,如果从外部类中初始化一个内部类对象,那么内部类对象会绑定在外部类对象上。内部类初始化方式与其他类初始化方式相同,都是使用new关键字。
package test;
public class outClass {
innerClass in = new innerClass(); //外部类实例化内部类对象引用
public void ouf() {
in.inf(); //在外部类方法中调用内部类方法
}
class innerClass{
innerClass() { //内部类构造方法
}
public void inf() { //内部类成员方法
}
int y = 0; //定义内部类成员变量
}
public innerClass doit() {
//y = 4; //外部类不可直接访问内部类成员变量
in.y = 4; //外部类不可直接访问内部类成员变量
return new innerClass(); //返回内部类引用
}
public static void main(String[] args) {
outClass out = new outClass(); //内部类对象实例化操作必须在外部类或外部类的非静态方法中的实现
outClass.innerClass in = out.doit();
outClass.innerClass in1 = out.new innerClass();
}
}
如果在外部类和非静态方法之外实例化内部类对象,需要使用外部类。内部类的形式指定该对象的类型。
内部类的对象会依赖外部类对象,除非已经存在一个外部类对象,否则类中不会出现内部类对象。
非内部类不能不能声明为private和protected。
使用this关键字获取内部类与外部类的引用
如果在外部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字。
public class outClass {
private int x;
private class inner{
private int x = 9;
public void doit(int x){
x++; //调用的是形参x
this.x++; //调用内部类的变量x
outClass.this.x++; //调用外部类的变量X
}
}
}
2.局部内部类
在方法体内使用局部变量,该局部变量需要被设置为final类型,在方法体内的内部类只能访问方法中final类型的局部变量,该局部变量相当于一个常量,它的生命周期超出方法运行的生命周期,由于该局部变量被设置为final,所以不能再内部类中改变该局部变量的值。
interface outinterface2{
}
class outClass3{
public outinterface2 doit(final String x) {
class innerClass2 implements outinterface2{
innerClass2(String s) {
s = x;
System.out.println(s);
}
}
return new innerClass2("doit");
}
}
一个静态内部类中可以声明static成员,但是在非静态内部类中不可声明静态成员。
3.匿名内部类
匿名内部类,没有名称,使用默认的构造方法生成对象在匿名内部类定义结束时需要分号标识,这个分号并不是结束标志,而是代表创建接口引用表达式的标识。
return new A(){
...//内部类体
};