在java中可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。分为四种:成员内部类、局部内部类、匿名内部类和静态内部类。内部类封装性更好,隐藏在一个类之中,同一个包中的其他类也不能访问,但内部类可以访问外围类的私有数据。
1. 成员内部类
成员内部类是最普通的内部类,定义在另一个类的内部。
使用格式:外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
成员内部类中不能定义静态方法。
2. 局部内部类
局部内部类定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问权限仅限于方法内或者该作用域内。
注意: 局部内部类就像是方法里面的一个局部变量一样,是不能有 public、protected、private 以及 static 修饰符的,只能访问方法中定义的final类型的局部变量(初始化之后不能更改)。
3. 匿名内部类
没有名字,定义在其他类方法中的类。正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写。
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
匿名内部类是唯一没有构造方法的类。
4. 静态内部类
静态内部类也是定义在另一个类里面的类,只不过在类前面加了关键字static。静态内部类不需要依赖于外部类,只能访问外部类的静态成员。
使用格式:外部类名.内部类名 变量名 = new 外部类名.内部类名();
看这样的一道题目,要求:使用已知的变量,在控制台输出66, 8,10。
public class Outer {
int num = 10;
class Inner{
int num = 8;
public void show() {
int num = 66;
System.out.println(?);
System.out.println(?);
System.out.println(?);
}
}
}
答案:
内部类之所以能获取外部类的成员,因为它能获取到外部类的引用,即外部类名.this.