分类
1.成员内部类
定义在一个类的内部
2.局部内部类
定义在一个方法的内部
成员内部类定义格式
成员内部类:
class 修饰符 外部类名称{
class 修饰符 内部类名称{
}
}
注意:内用外:随意访问
外用内:需要内部类对象
生成的class文件:外部类名称$内部类名称
使用方法
1.间接方式:
在外部类的方法中使用内部类
2.直接方式:
外部类名称.内部类名称 对象 = new 外部类名().内部类名称();
当变量出现重名时:
class Out{
int num = 10;//外部类成员变量
public void methodOut(){
}
class in{
int num = 20;//内部类成员变量
public void mthodIn(){
int num = 30;//内部类方法局部变量
System.out.println(num);//30
System.out.println(this.num);//20
System.out.println(Out.this.num);//10
}
}
}
局部内部类定义格式
修饰符 class 外部类名称{
修饰符 返回值类型 外部类方法名称(参数列表){
class 局部内部类名称{
}
}
}
权限修饰符
外部类:public
成员内部类:public、procected、private
局部内部类:不能加权限修饰符
局部内部类访问
如果局部内部类希望访问所在方法的局部变量,那么这个变量必须是有效final的
原因:new出来的对象是在堆内存中,但是局部变量跟随方法在栈中,当方法运行结束后,局部变量就会立刻消失,而对象在堆中持续存在,直到垃圾回收。所以会进行一个值拷贝过程,即不能改变局部变量的值
匿名内部类
如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况就可以省略掉该类的定义,而改用使用匿名内部类
定义格式:
接口名称 对象名= new 接口名称(){
覆盖重写所有抽象方法
};