内部类的定义:在一个类的内部定义的类称为内部类。并且内部类不能与外部类重名。
外部类的定义:把内部类所在的类称为外部类。
内部类包括:成员内部类和局部内部类。
成员内部类包括:实例内部类和静态内部类。
1.实例内部类:
1)在创建实例内部类的实例时,外部类的实例必须已经存在。
2)实例内部类的实例自动持有外部类实例的引用。在内部类中,可以直接访问外部类的所有成员(成员方法和成员变量)。
在多重嵌套中,内部类可以访问所有外部类的成员。- class A{
- private void methodA() {}
- class B {
- private void methodB() {}
- class C {
- private void method() {
- methodA();
- methodB();
- }
- }
- }
- }
复制代码 3)外部类实例与内部类实例之间是一对多的关系。在外部类中不能直接访问内部类的成员,必须通过内部类的实例去访问。通过实例的访问,即使是处于private外部类也能够访问。
4)在实例内部类中不能定义静态成员,只能定义实例成员。
5)如果实例内部类B和外部类A包含同名的成员(如变量v),则在类B中,this.v表示B的成员,A.this.v表示A的成员。
2.静态内部类
1)静态内部类的实例不会自动持有外部类的特定实例的引用,在创建内部类的实例时,不必创建外部类的实例。
2)静态内部类可以直接访问外部类的静态成员,如果访问外部类的实例成员,就必须通过外部类的实例去访问。- class A{
- private int a1;
- private static int a2;
-
- public static class B{
- int b1 = new A().a1;
- int b2 = a2
- }
- }
复制代码 3)在静态内部类中可以定义静态成员和实例成员。而实例内部类中只能定义实例成员。
4)客户类可以通过完整的类名直接访问静态内部类的静态成员。
3.局部内部类
局部内部类是在一个方法中定义的内部类,它的可见范围是当前方法。
1)局部内部类只能在当前方法中使用。
2)局部内部类也不能含有静态成员。
3)局部内部类中定义的内部类只能用默认的修饰,不能被public protected和private修饰。
4)局部内部类和实例内部类一样,可以访问所有外部类的所有成员。此外,局部内部类还可以访问所在方法中的final类型的参数和变量。- class A{
- int a
- public void method(final int p1,int p2)
- {
- int localV1=1;
- final int localV2=2;
- class B{
- int b1=a;
- int b2=p1;
- int b3=localV2;
- }
- }
- }
复制代码 4.子类与父类中内部类的同名
内部类并不存在覆盖的概念,假如子类与父类中存在同名的内部类,那么这两个类也会分别在不同的命名空间中,因此不会发生冲突。
5.匿名类
匿名类是一种特殊的内部类,这种类没有名字。
1)匿名类本身没有构造方法,但是会调用父类的构造方法。- public class A{
- A() {System.out.println(“default constructor”);}
- void method () {System.out.println(“from A”);}
- public static void main(String args[])
- {
- new A().method();
- A a=new A(){ //匿名类
- void method() {
- System.out.println(“from anonymous”);}
- };
- a.method();
- }
- }
复制代码 2)匿名类可以提供一段实例初始化代码,Java虚拟机会在调用父类的构造方法后,执行这段代码。但只能创建一次实例。
3)除了可以在外部类的方法内定义匿名类,还可以在申明一个成员变量时定义匿名类。
4)匿名类可以继承类,也可以实现接口
5)匿名类和局部内部类一样,可以访问外部类所有的成员,如果匿名类位于一个方法中,还能访问所在方法的final类型的变量和参数。
|