五 内部类
1 格式定义
(1) 成员内部类
(2) 局部内部类(匿名内部类)
修饰符 class 外部类 {
修饰符 class 内部类{
//...
}
}
注意: 内用外,随便访问;外用内,需要内部类对象
2 内部类使用
(1) 间接:通过外部类的方法访问内部类
(2) 直接:外部类.内部类 对象名 = new 外部类().new 内部类();
public class Outer{
public class Inner{
public void methodInner(){
System.out.println("内部类")
}
}
//在main函数中通过
//外部类方法间接方法内部类方法
//也可用直接方式访问
public void methodOuter{
Inner inner = new Inner();
inner.method();
//new Inner().methodInner();
}
}
3 内部类成员变量的使用
public class Outer{
int num = 10;
public class Inner{
int num = 20;
public void method(){
int num = 30;
//内部类方法局部变量
System.out.println(num);
//内部类成员变量
System.out.println(this.num);
//访问外部类成员变量
System.out.println(Outer.this.num);
}
}
}
4 局部内部类
1 局部内部类格式定义
局部内部类为定义在方法内部的类,只能在方法内部使用。
修饰符 class 外部类{
修饰符 返回值类型 方法名(){
class 局部内部类{
//...
}
}
}
注意:定义一个类时的权限修饰符规则:
(1) 外部类:public/(default)
(2) 成员内部类: public/protected/(default)/private
(3) 局部内部类:不能有权限修饰符
2 局部内部类的final
局部内部类如果希望访问所在方法的局部变量,那么这个局部变量必须是有效final的
原因:
- new出来的对象在堆内存中,直到垃圾回收才消失。
- 局部变量和方法一起在栈内存中,方法结束后,局部变量就会消失。
- 为了保证new出来的对象,继续使用局部变量,故需要该局部变量是有效不变的。
public class Outer{
public void methodOuter{
int num = 10;//此处必须保证是实际不变的
//int final num = 10;
class Inner{
public void methodInner(){
System.out.println(num);
}
}
}
}
5 匿名内部类
使用匿名内部类,不必再额外单独定义一个外部实现类
用于:接口的实现类或父类的子类只需使用一次,那么即可省去该实现类或子类的定义。
接口名 对象名 = new 接口名(){
//覆盖重写所有抽象方法
}
匿名内部类省去对象名称即为匿名对象:
new 接口名(){
//覆盖重写所有抽象方法
}.method();
6 提要
类或接口作为成员变量类型
接口作为方法的参数或返回值