内部类可分为:实例内部类、静态内部类、局部内部类、匿名内部类。下面逐一介绍他们的使用方法及注意事项。
一、.实例内部类(没有被static修饰的类)
1.创建实例内部类,首先要声明一个外部类实例。
2.内部类可以直接访问外部类的成员变量/方法。
3.外部类与内部类的关系是一对多的关系。
4.实例内部类中只能定义非静态成员,否则会出错
5.当内部类与外部类存在同名成员时,在内部类中,用this.成员,来访问内部类成员。用外部类名.this.成员来访问外部类的成员。
二、静态内部类(用static修饰的)
1.静态内部类实例的创建不需要创建外部类实例。
2.静态内部类可以直接访问外部类的静态成员,要访问外部类的实例成员就需要通过外部类的实例来创建啦,这条要注意!
3.静态内部类中可以定义静态成员,也可定义非静态成员,也就是实例成员。
4.客户类可以直接访问静态内部类的静态成员(即实例成员不可以)
三、局部内部类(在方法中定义的类)
1.局部内部类只能在方法中使用。
2.和实例内部类一样,局部内部类中不能有静态成员。
3.不能被public、protected、private这些修饰符修饰。
4.局部内部类和实例内部类一样,可以访问外部类的所有成员。
四、匿名内部类(木有名字的类)
1.没有构造方法,可以调用父类的构造方法,new A(){};
2.虽然没有构造方法,但可以通过在类内用{}括起来进行初始化。
3.在方法内/外都可以定义匿名内部类,一个局部变量,一个成员变量。
4.匿名内部类除了可以继承类,还可以实现接口。
5.匿名内部类在方法中是,要是访问方法内部的变量,该变量要声明成final类型的。可以访问外部类的所有成员。
6.同局部内部类一样,对外部是不可见的,具有较好的封装性。
匿名内部类代码较短,没有重载构造方法,只能创建一次实例。局部内部类可以创建多个实力,有多个重载构造方法。
内部类的继承,当具有相同的内部类时,不存在内部类的覆盖,因为内部类位于不同的命名空间,不会发成冲突。
内部类的用途:封装类型、直接访问外部类的成员、回调。
回调实质上是指一个类尽管实际上实现了某种功能,但是没有直接提供相应的接口,客户类可以通过这个类的内部类的接口来获得这种功能。这个内部类本身兵没有提供真正的实现,而是调用外部类的实现。回调充分发挥了内部类所具有的访问外部类的实现细节的优势。
这些条条框框的,没必要死机,平时自己编程时,就会遇到,熟能生巧,慢慢就很清楚啦,哈哈,我是这么认为滴~