• 内部类


    内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类

    1.成员内部类

     成员内部类也称常规内部类,是指内部类直接嵌套在外部类的类体里
     这时内部类就相当于外部类的一个成员变量或成员方法,是外部类的一个成员。

    在成员内部类中,可以拥有自己的成员变量和方法,也可以是一个独立的类,内部类和外部类

    的实例变量是可以共存的。


    创建的时候先要创建外部类然后再创建内部类。

     1 /*
     2  * 成员内部类
     3  */
     4 public class OuterClass {
     5     // 外部类名
     6     private String outerClassName = "outerClass";
     7     // 内部外部标志 与内部类的对象命名相同
     8     private String inOutFlg = "outer";
     9     
    10     public OuterClass(){
    11         System.out.println("外部类OuterClass创建完成!");
    12     }
    13 
    14     /*
    15      * 成员内部类
    16      */
    17     public class InnerClass {
    18         // 内部类名
    19         String innerClassName = "InnerClass";
    20         // 内部外部标志   与外部类的对象命名相同
    21         String inOutFlg = "inner";
    22 
    23         /*
    24          * 内部类构造方法
    25          */
    26         public InnerClass(){
    27             System.out.println("内部类InnerClass创建完成!");
    28         }
    29 
    30         /*
    31          * 打印外部类名
    32          */
    33         public void printOuterClassValue() {
    34             // 在成员内部类中可以访问外部类的所有成员
    35             System.out.println(outerClassName);
    36             // 当内部类中存在与外部成员变量相同的变量时,外部成员的调用
    37             System.out.println(OuterClass.this.inOutFlg);
    38         }
    39         /*
    40          * 打印内部类名
    41          */
    42         public void printInnerClassValue(){
    43             System.out.println(innerClassName);
    44             // 当内部类中存在与外部成员变量相同的变量时,内部成员的调用
    45             System.out.println(InnerClass.this.inOutFlg);
    46         }
    47     }
    48     
    49     /*
    50      * 外部类内部对内部类的访问
    51      */
    52     void getClassName (){
    53         InnerClass innerClass = new InnerClass();
    54         innerClass.printOuterClassValue();
    55     }
    56 
    57 }

    测试:

     1     public static void main(String[] args) {
     2         // 外部类的创建
     3         OuterClass out = new OuterClass();
     4         // 从外部类访问内部类的成员函数
     5         out.getClassName();
     6         // 内部类的创建
     7         OuterClass.InnerClass innerClass = out.new InnerClass();
     8         // 访问内部类的成员函数
     9         innerClass.printInnerClassValue();
    10     }
    11 
    12 }

    2.局部内部类

    局部内部类也称方法内部类,它对外面的所有类来说都是隐藏的,即使是它所属的外部类,仅有它所在的方法知道它;

    它不仅可以访问它所属外部类中的数据,还可以访问该方法中定义的局部变量,不过局部变量必须声明为final类型。

    接口声明:

    1 public interface InnerClassIF {
    2     // 打印内部类名
    3     void printInnerClassValue();
    4     // 打印外部类名
    5     void printOuterClassValue();
    6     // 打印方法内定义的变量
    7     void printOuterMethodValue();
    8 }
     1 /*
     2  * 方法内部类
     3  */
     4 public class OuterClass {
     5     // 外部类名
     6     private String outerClassName = "outerClass";
     7     // 内部外部标志 与内部类的对象命名相同
     8     private String inOutFlg = "outer";
     9     
    10     public OuterClass(){
    11         System.out.println("外部类OuterClass创建完成!");
    12     }
    13     
    14     /*
    15      * 方法内部定义的类,只能在该方法范围内访问
    16      */
    17     InnerClassIF getClassName (){
    18         String path = "D盘";
    19         final String classPath = "C盘";
    20 
    21         /*
    22          * 方法内部类
    23          */
    24         class InnerClass implements InnerClassIF {
    25             // 内部类名
    26             String innerClassName = "InnerClass";
    27             // 内部外部标志   与外部类的对象命名相同
    28             String inOutFlg = "inner";
    29 
    30             /*
    31              * 内部类构造方法
    32              */
    33             public InnerClass(){
    34                 System.out.println("内部类InnerClass创建完成!");
    35             }
    36 
    37             /*
    38              * 打印外部类名
    39              */
    40             public void printOuterClassValue() {
    41                 // 在方法内部类中可以访问外部类的所有成员
    42                 System.out.println(outerClassName);
    43                 // 当内部类中存在与外部成员变量相同的变量时,外部成员的调用
    44                 System.out.println(OuterClass.this.inOutFlg);
    45             }
    46             /*
    47              * 打印内部类名
    48              */
    49             public void printInnerClassValue(){
    50                 System.out.println(innerClassName);
    51                 // 当内部类中存在与外部成员变量相同的变量时,内部成员的调用
    52                 System.out.println(InnerClass.this.inOutFlg);
    53             }
    54             /*
    55              * 打印方法内定义的变量
    56              */
    57             public void printOuterMethodValue(){
    58                 // 在方法内部类中只能访问该方法中用final定义的成员
    59                 System.out.println(classPath);
    60             }
    61         };
    62         return new InnerClass();
    63     }
    64 
    65 }

    测试:

     1     public static void main(String[] args) {
     2         // 外部类的创建
     3         OuterClass out = new OuterClass();
     4         // 访问成员方法,返回内部类对象的引用
     5         InnerClassIF innerClassIF = out.getClassName();
     6         innerClassIF.printInnerClassValue();
     7         innerClassIF.printOuterClassValue();
     8         innerClassIF.printOuterMethodValue();
     9         
    10     }

    3.静态内部类

    在一个内部类前添加修饰符static,这个内部类就变为静态内部类。在一个静态内部类中可以声明静态成员和非静态成员,但是在非静态内部类中

    不可以声明静态成员。同样,在静态内部类中不能访问外部类的非静态成员。

    静态内部类的对象可以直接生成,不需要外部类的对象来生成,可以把静态内部类看作是一个顶级类。

    静态内部类不可以用private来修饰。

     1 /*
     2  * 静态内部类
     3  */
     4 public class OuterClass {
     5     // 外部类名
     6     private static String outerClassName = "outerClass";
     7     // 内部外部标志 与内部类的对象命名相同
     8     private static String inOutFlg = "outer";
     9     
    10     public OuterClass(){
    11         System.out.println("外部类OuterClass创建完成!");
    12     }
    13 
    14     /*
    15      * 静态内部类
    16      */
    17     public static class InnerClass {
    18         // 内部类名
    19         static String innerClassName = "InnerClass";
    20         // 内部外部标志   与外部类的对象命名相同
    21         String inOutFlg = "inner";
    22 
    23         /*
    24          * 内部类构造方法
    25          */
    26         public InnerClass(){
    27             System.out.println("内部类InnerClass创建完成!");
    28         }
    29 
    30         /*
    31          * 打印外部类名
    32          */
    33         public static void printOuterClassValue() {
    34             // 在静态内部类中可以访问外部类的所有静态成员
    35             System.out.println(outerClassName);
    36             // 当内部类中存在与外部成员变量相同的变量时,外部成员的调用
    37             System.out.println(OuterClass.inOutFlg);
    38         }
    39         /*
    40          * 打印内部类名
    41          */
    42         public void printInnerClassValue(){
    43             System.out.println(innerClassName);
    44             // 当内部类中存在与外部成员变量相同的变量时,内部成员的调用
    45             System.out.println(InnerClass.this.inOutFlg);
    46         }
    47     }
    48 }

    测试:

    1     public static void main(String[] args) {
    2         // 外部类直接访问静态内部类的静态方法
    3         OuterClass.InnerClass.printOuterClassValue();
    4         // 访问静态内部类的非静态方法
    5         OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
    6         innerClass.printInnerClassValue();
    7     }

    4.匿名内部类

    匿名内部类是唯一一种没有构造方法的类。大部分匿名内部类用于接口的回调。

     1 public class InnerClassTest {
     2     public static void main(String[] args) {
     3         ArrayList<Integer> valueList = new ArrayList<>();
     4 
     5         valueList.add(26);
     6         valueList.add(2);
     7         valueList.add(5);
     8         valueList.add(4);
     9         valueList.add(19);
    10         valueList.add(15);
    11         valueList.add(1);
    12         valueList.add(3);
    13         valueList.add(6);
    14         valueList.add(30);
    15         
    16         // 匿名内部类用于继承其他类或实现接口,只是对继承方法的实现与重写,不需要添加额外的方法
    17         Collections.sort(valueList, new Comparator<Integer>() {
    18 
    19             @Override
    20             public int compare(Integer o1, Integer o2) {
    21                 // 升序
    22                 if (o1.intValue() < o2.intValue()) {
    23                     return -1;
    24                 }
    25                 return 0;
    26             }
    27         });
    28         
    29         for (int i = 0; i < valueList.size(); i++) {
    30             System.out.println(valueList.get(i));
    31         }
    32     }
    33 }
  • 相关阅读:
    堆排序
    conda 安装pytorch
    Dev GridControl GridView常用属性
    java 同步调用和异步调用
    spring Boot 整合 Memcached (含 windows 安装)
    spring Boot 整合 Elasticsearch
    windows 下安装 elasticsearch
    代理模式---Cglib动态代理
    代理模式---JDK动态代理
    代理模式---静态代理
  • 原文地址:https://www.cnblogs.com/keyiei/p/3601481.html
Copyright © 2020-2023  润新知