为什么要用内部类(多重继承、闭包)
- 一个内部类的对象能够访问创建它的对象的实现,包括私有数据。
- 对于同一个包中的其他类来说,内部类能够隐藏起来。
- 匿名内部类可以很方便的定义回调。
- 使用内部类可以非常方便的编写事件驱动程序
内部类基础
- 成员内部类
public class MemberInnerClass {
private int num ;
private int num1 = 2;
public MemberInnerClass(int num) {
this.num = num;
}
public void access(){
new Test().print();
}
class Test{
private int num1 = 3;
public void print(){
System.out.println("成员内部类");
System.out.println(num);
System.out.println(num1);
System.out.println(MemberInnerClass.this.num1);
}
}
//成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)
//在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问
//如果要访问外部类的同名成员,默认情况下访问的是成员内部类的成员
//外部类.this.成员变量
//外部类.this.成员方法
public static void main(String[] args) {
MemberInnerClass.Test test= new MemberInnerClass(1).new Test();
test.print();
System.out.println("外部类访问内部类成员");
new MemberInnerClass(1).access();
}
}
- 局部静态类
public class PartialInnerClass {
public PartialInnerClass() {
class PInnerClass{
int num = 1;
public PInnerClass getInstance(){
return new PInnerClass();
}
}
System.out.println(new PInnerClass().num);
}
//它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内
//局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
public static void main(String[] args) {
new PartialInnerClass();
}
}
- 匿名内部类
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
abstract class Person {
public abstract void eat();
}
public class NoNameInnerClass {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
//若没有匿名内部类:
//1. 继承实现一个抽象类
//2. 创建该对象
//3. 调用方法
- 静态内部类
public class StaticInnerClass {
static int a = 1;
public StaticInnerClass() {
}
static class Inner {
public Inner() {
System.out.println(a);
}
}
public static void main(String[] args) {
StaticInnerClass.Inner test = new Inner();//可以直接创建对象
}
}