内部类是定义在另一个类中的类,使用它的原因有:
- 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据
- 内部类可以对同一个包中的其他类隐藏起来
- 当想要定义一个回调函数而不像编写大量代码时,使用匿名内部类比较便捷
只有内部类可以是私有类,而常规类只可以具有包可见性或公有可见性
内部类是个编译时的概念,一旦编译成功后,它就与外围类属于两个完全不同的类(当然他们之间还是有联系的)。对于一个名为OuterClass的外围类和一个名为InnerClass的内部类,在编译成功后,会出现这样两个class文件:OuterClass.class和OuterClass$InnerClass.class。
内部类分为:成员内部类,局部内部类,匿名内部类,静态内部类
一 成员内部类(最普通的内部类)
成员内部类是外围类的一个成员,所以它可以无限制地访问外围类的所有成员属性和方法(尽管成员属性是private的),但是外围类要访问内部类的成员属性和方法需要内部类实例来访问
注意两点:
- 成员内部类中不存在任何static的成员变量和方法
- 成员内部类依附于外围类,只有先创建了外围类才能够创建内部类
推荐使用getxxx来获取成员内部类,尤其是该内部类的构造函数无参数时
二 局部内部类
局部类不能用public或private访问说明符进行声明(一般用默认),它的作用域被限定在声明这份局部类的块中
局部类有一个优势:对外部世界可以完全地隐藏起来
局部类的方法只可以引定义为final的局部变量
三 匿名内部类
在做Swing编程中,我们经常使用这种方式来绑定事件
注意这几点:
- 匿名内部类是没有访问修饰符的
- new出的匿名内部类一定要是存在的
- 当匿名内部类所在方法的形参被匿名内部类使用时,这个形参必须为final
- 匿名内部类是没有构造方法的
四 静态内部类
关键字static不仅可以修饰成员变量,方法,代码块之外,还可以修饰内部类,使用static修饰的内部类称为局部内部类
静态内部类与非静态内部类的一个重要的区别在于:非静态内部类在编译完成后会保存一个引用来指向创建它的外围类,而静态内部类没有,没有这个引用意味着:它的创建不需要依赖外部类,它不能使用外围类的任何非static成员变量和方法
package innerClass;
import innerClass.OuterClass.InnerClass;
public class OuterClassDemo2 {
private String sex;
public static String name = "tiffany";
// 定义静态内部类
static class InnerClass1{
public static String string_name1 = "tiffany_static";
public void display() {
System.out.println("outClass name:"+name);
}
}
// 定义非静态内部类
class InnerClass2{
public String string_name2 = "tiffany_nonstatic";
public void display() {
System.out.println("outClass name:"+name);
}
}
public void display() {
// 访问静态内部类的成员变量
System.out.println(InnerClass1.string_name1);
// 调用静态内部类的方法
new InnerClass1().display();
// 通过外围类来访问非静态内部类
OuterClassDemo2.InnerClass2 inner = new OuterClassDemo2().new InnerClass2();
System.out.println(inner.string_name2);
inner.display();
}
public static void main(String[] args) {
OuterClassDemo2 outer = new OuterClassDemo2();
outer.display();
}
}
非静态内部类需要通过调用外围类才能调用到内部类的成员变量以及方法