返回列表 发帖

[笔记]Java内部类学习笔记

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

返回列表 回复 发帖