一 内部类: 在类A中定义类B,那么类B就是内部类,而相当于内部类就是外部类;如果有嵌套,那么最外层就是顶层类或者顶级类
二 内部类分为四类:实例内部类,静态内部类,成员内部类,局部内部类;(1) 实例内部类:没有static修饰的内部类,也叫非静态内部类; 1. 在外部类的静态方法和外部类以外的其他类中,必须通过外部类的实例创建内部类的实例。 在外部类以外的其他类中则需要通过内部类的完整类名访问内部类。 OuterClass1.InnerClass1 innerClass1 = new OuterClass1().new InnerClass1(); 2. 在实例内部类中,可以访问外部类的所有成员。调用外部类的实例变量和类变量。 System.out.println(“内部类 InnerClass1.print()” + “intA=”+intA+“str_name=”+str_name); outPrint();//调用外部类的实例方法 outStaticMethod();//调用外部类的静态方法/(类方法) 3. 在外部类中不能直接访问内部类的成员,而必须通过内部类的实例去访问。 System.out.println(“InnerClass1.in_str_name=”+InnerClass1.in_str_name); InnerClass1 ic = new InnerClass1(); 4. 外部类实例与内部类实例是一对多的关系,也就是说一个内部类实例只对应一个外部类实例,而一个外部类实例则可以对应多个内部类实例。 5. 在实例内部类中不能定义 static 成员,除非同时使用 final 和 static 修饰。 public static final String in_str_name =“InnerClass1”;(2) 静态内部类: 1. 在创建静态内部类的实例时,不需要创建外部类的实例 OutClass2.testStaticMethod(); 2. 静态内部类中可以定义静态成员和实例成员。外部类以外的其他类需要通过完整的类名访问静态内部类中的静态成员,如果要访问静态内部类中的实例成员,则需要通过静态内部类的实例 System.out.println(OutClass2.InnerClass2.in_str_name); OutClass2.InnerClass2 ic = new OutClass2.InnerClass2(); System.out.println(ic.in_a); ic.inInstanceMethod(); 3. 静态内部类可以直接访问外部类的静态成员,如果要访问外部类的实例成员, 则需要通过外部类的实例去访问。在静态内部类访问外部类的实例成员 new 一个内部类的实例 OutClass2 oc = new OutClass2(); System.out.println(oc.out_a); 四:外部类可以通过静态内部类的类名直接访问静态内部类的静态成员, 如果要访问静态内部类的实例成 员,则需要通过静态内部类的实例去访问。
(3) 匿名内部类:没有类名的内部类,必须在创建时使用 new 语句来声明类。 new () { // 类的主体 }; 1. 匿名类和局部内部类一样,可以访问外部类的所有成员。如果匿名类位于一个方法中, 则匿名类只能访问方法中 final 类型的局部变量和参数。 2. 匿名类中允许使用非静态代码块进行成员初始化操作。 3. 匿名类的非静态代码块会在父类的构造方法之后被执行。 (4) 局部内部类: 1. 局部内部类与局部变量一样,不能使用访问控制修饰符(public、private 和 protected) 和 static 修饰符修饰。 2.局部内部类只在当前方法中有效。 3.局部内部类中不能定义 static 成员。 4.局部内部类中还可以包含内部类,但是这些内部类也不能使用访问控制修饰符 (public、private 和 protected)和 static 修饰符修饰。 5. 在局部内部类中可以访问外部类的所有成员。 6. 在局部内部类中只可以访问当前方法中
2021-04-28
最新推荐文章于 2021-05-18 09:56:09 发布
本文详细介绍了Java中的内部类,包括实例内部类、静态内部类、匿名内部类和局部内部类的特点与用法。实例内部类需要依赖外部类实例,可以直接访问外部类所有成员;静态内部类不依赖外部类实例,可直接访问外部类静态成员。匿名内部类和局部内部类有特定的使用场景,如快速实现接口或在方法中定义临时类。各种内部类的使用加深了对Java类结构的理解。
4367

被折叠的 条评论
为什么被折叠?



