• 第7章 面向对象基础-下(内部类)


    7.6 内部类(了解)

    7.6.1 概述

    1、什么是内部类?

    将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类

    2、为什么要声明内部类呢?

    总的来说,遵循高内聚低耦合的面向对象开发总原则。便于代码维护和扩展。

    具体来说,当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,不在其他地方单独使用,那么整个内部的完整结构最好使用内部类。而且内部类因为在外部类的里面,因此可以直接访问外部类的私有成员。

    3、内部类都有哪些形式?

    根据内部类声明的位置(如同变量的分类),我们可以分为:

    (1)成员内部类:

    • 静态成员内部类

    • 非静态成员内部类

    (2)局部内部类

    • 有名字的局部内部类

    • 匿名的内部类

    7.6.2 成员内部类

    如果成员内部类中不使用外部类的非静态成员,那么通常将内部类声明为静态内部类,否则声明为非静态内部类。

    语法格式:

    【修饰符】 class 外部类{
        【其他修饰符】 【static】 class 内部类{
        }
    }

    1、静态内部类

    有static修饰的成员内部类叫做静态内部类。它的特点:

    • 和其他类一样,它只是定义在外部类中的另一个完整的类结构

      • 可以继承自己的想要继承的父类,实现自己想要实现的父接口们,和外部类的父类和父接口无关

      • 可以在静态内部类中声明属性、方法、构造器等结构,包括静态成员

      • 可以使用abstract修饰,因此它也可以被其他类继承

      • 可以使用final修饰,表示不能被继承

      • 编译后有自己的独立的字节码文件,只不过在内部类名前面冠以外部类名和$符号。

    • 和外部类不同的是,它可以允许四种权限修饰符:public,protected,缺省,private

      • 外部类只允许public或缺省的

    • 可以在静态内部类中使用外部类的静态成员

      • 在静态内部类中不能使用外部类的非静态成员哦

      • 如果在内部类中有变量与外部类的静态成员变量同名,可以使用“外部类名."进行区别

    • 在外部类的外面不需要通过外部类的对象就可以创建静态内部类的对象(通常应该避免这样使用)

    2、非静态成员内部类

    没有static修饰的成员内部类叫做非静态内部类。非静态内部类的特点:

    • 和其他类一样,它只是定义在外部类中的另一个完整的类结构

      • 可以继承自己的想要继承的父类,实现自己想要实现的父接口们,和外部类的父类和父接口无关

      • 可以在非静态内部类中声明属性、方法、构造器等结构,但是不允许声明静态成员,但是可以继承父类的静态成员,而且可以声明静态常量

      • 可以使用abstract修饰,因此它也可以被其他类继承

      • 可以使用final修饰,表示不能被继承

      • 编译后有自己的独立的字节码文件,只不过在内部类名前面冠以外部类名和$符号。

    • 和外部类不同的是,它可以允许四种权限修饰符:public,protected,缺省,private

      • 外部类只允许public或缺省的

    • 还可以在非静态内部类中使用外部类的所有成员,哪怕是私有的

    • 在外部类的静态成员中不可以使用非静态内部类哦

      • 就如同静态方法中不能访问本类的非静态成员变量和非静态方法一样

    • 在外部类的外面必须通过外部类的对象才能创建非静态内部类的对象(通常应该避免这样使用)

      • 如果要在外部类的外面使用非静态内部类的对象,通常在外部类中提供一个方法来返回这个非静态内部类的对象比较合适

      • 因此在非静态内部类的方法中有两个this对象,一个是外部类的this对象,一个是内部类的this对象

    1. public class TestMemberInnerClass {
    2. public static void main(String[] args) {
    3. Outer.outMethod();
    4. System.out.println("-----------------------");
    5. Outer out = new Outer();
    6. out.outFun();
    7. System.out.println("-----------------------------");
    8. Outer.Inner.inMethod();
    9. System.out.println("------------------------");
    10. Outer.Inner inner = new Outer.Inner();
    11. inner.inFun();
    12. System.out.println("-----------------------------");
    13. Outer outer = new Outer();
    14. // Outer.Nei nei = outer.new Nei();
    15. Outer.Nei nei = out.getNei();
    16. nei.inFun();
    17. }
    18. }
    19. class Outer{
    20. private static String a = "外部类的静态a";
    21. private static String b = "外部类的静态b";
    22. private String c = "外部类对象的非静态c";
    23. private String d = "外部类对象的非静态d";
    24. static class Inner{
    25. private static String a ="静态内部类的静态a";
    26. private String c = "静态内部类对象的非静态c";
    27. public static void inMethod(){
    28. System.out.println("Inner.inMethod");
    29. System.out.println("Outer.a = " + Outer.a);
    30. System.out.println("Inner.a = " + a);
    31. System.out.println("b = " + b);
    32. // System.out.println("c = " + c);//不能访问外部类和自己的非静态成员
    33. // System.out.println("d = " + d);//不能访问外部类的非静态成员
    34. }
    35. public void inFun(){
    36. System.out.println("Inner.inFun");
    37. System.out.println("Outer.a = " + Outer.a);
    38. System.out.println("Inner.a = " + a);
    39. System.out.println("b = " + b);
    40. System.out.println("c = " + c);
    41. // System.out.println("d = " + d);//不能访问外部类的非静态成员
    42. }
    43. }
    44. class Nei{
    45. private String a = "非静态内部类对象的非静态a";
    46. private String c = "非静态内部类对象的非静态c";
    47. public void inFun(){
    48. System.out.println("Nei.inFun");
    49. System.out.println("Outer.a = " + Outer.a);
    50. System.out.println("a = " + a);
    51. System.out.println("b = " + b);
    52. System.out.println("Outer.c = " + Outer.this.c);
    53. System.out.println("c = " + c);
    54. System.out.println("d = " + d);
    55. }
    56. }
    57. public static void outMethod(){
    58. System.out.println("Outer.outMethod");
    59. System.out.println("a = " + a);
    60. System.out.println("Inner.a = " + Inner.a);
    61. System.out.println("b = " + b);
    62. // System.out.println("c = " + c);
    63. // System.out.println("d = " + d);
    64. Inner in = new Inner();
    65. System.out.println("in.c = " + in.c);
    66. }
    67. public void outFun(){
    68. System.out.println("Outer.outFun");
    69. System.out.println("a = " + a);
    70. System.out.println("Inner.a = " + Inner.a);
    71. System.out.println("b = " + b);
    72. System.out.println("c = " + c);
    73. System.out.println("d = " + d);
    74. Inner in = new Inner();
    75. System.out.println("in.c = " + in.c);
    76. }
    77. public Nei getNei(){
    78. return new Nei();
    79. }
    80. }
    静态内部类非静态内部类
    类角色字节码文件外部类名$内部类名相同
    修饰符public,缺省,abstract,final相同
    父类或父接口可以相同
    可以包含的成员所有成员不允许有静态成员
    成员角色修饰符public、protected、缺省、private,final,static没有static
    依赖于外部类依赖相同
    依赖于外部类的对象不依赖依赖
    使用在外部类中使用内部类没有限制在外部类的静态方法等中不能使用非静态内部类
    在内部类中使用外部类静态内部类中不能使用外部类的非静态成员没有限制
    在外部类的外面使用内部类的静态成员外部类名.静态内部类名.静态成员没有
    在外部类的外面使用内部类的非静态成员见下面的框1见下面的框2
    重名外部类名.重名的成员名外部类名.this.重名的成员

     外部类名.静态内部类名 变量 = 外部类名.静态内部类名();
    变量.非静态成员();

     外部类名 变量1 = new 外部类();
    外部类名.非静态内部类名 变量 = 变量1.new 非静态内部类名();
    变量.非静态成员();

    .....后续创作中 

  • 相关阅读:
    NC7 买卖股票的最好时机(一)
    谷歌54亿收购Mandiant:提高自身谷歌云竞争性
    16位简单ASM题的记录——[HGAME 2022 week1]easyasm
    java异常类如何定义
    基础算法(六):回溯算法
    代码重构:面向单元测试
    IDC:阿里云获2021中国数据治理平台市场份额第一
    第十九章总结
    【GCN】《Adaptive Propagation Graph Convolutional Network》(TNNLS 2020)
    【问题处理小知识】jupyter notebook报错:500 internal server error的几种解决办法整理
  • 原文地址:https://blog.csdn.net/qq_68079963/article/details/138197071