• Java知识点:内部类


    内部类class文件命名规则

    • 普通内部类、静态内部类:<Outer>$<Inner>.class,其中<Outer>为外部类类名,<Inner>为内部类类名。
    • 方法内部类:<Outer>$<number><Inner>.class,其中<Outer>为外部类类名,<Inner>为内部类类名,<number>为在外部类中定义的第number个Inner内部类。因为每个外部类(比如Outer)方法都能够定义一个名字相同的内部类(比如Inner),则命名这些名字相同的内部类的方法为:Outer$1Inner.class、Outer$2Inner.class。
    • 匿名内部类:<Outer>$<number>.class,其中<Outer>为外部类类名,<number>为第number个匿名内部类,因为匿名内部类没有类名,因此只能用编号代替。

    普通内部类

    语法注意点:

    • 在普通内部类中不允许定义任何的静态成员,否则Compile Error。
     1 public class InnerClass01
     2 {
     3     public static void main(String[] args) {
     4         Outer out = new Outer();        
     5         Outer.Inner inn = out.new Inner();    //创建内部类实例之前,必须创建外部类实例
     6         inn.print();
     7     }
     8 }
     9 class Outer
    10 {
    11     private int a = 1;
    12     class Inner
    13     {
    14         public void print()
    15         {
    16             System.out.println("Inner " + a);    //内部类能够访问外部类的私有实例变量
    17         }
    18     }
    19 }

    上面的代码中:

    • 第12~18行:定义了内部类,声明方法和定义普通类类似。
    • 第16行:内部类能够访问外部类的私有实例变量。
    • 第4~6行:实例化内部类之前必须要有一个外部类的对象,内部类的类型是:<Outer>.<Inner>。

    静态内部类

     1 public class InnerClass04
     2 {
     3     public static void main(String[] args) {
     4         Outer.Inner inn = new Outer.Inner();
     5         inn.fun();
     6     }
     7 }
     8 class Outer
     9 {
    10     static class Inner
    11     {
    12         public void fun()
    13         {
    14             System.out.println("hello");
    15         }
    16     }
    17 }

    注意点:

    • 第4行:创建静态内部类的对象的方法:<Outer>.<Inner> in = new <Outer>.<Inner>();
    • 静态内部类其实不像内部类,因为不需要创建外部类实例就能创建内部类实例。

    匿名内部类

     1 public class InnerClass03
     2 {
     3     public static void main(String[] args) {
     4         Outer out = new Outer();        
     5         out.addListener(new ClickListener(){        //匿名内部类,命名为:InnerClass03$1.class
     6             public void onClick()
     7             {
     8 
     9             }
    10         });
    11     }
    12 }
    13 class Outer
    14 {
    15     public void addListener(ClickListener listener)
    16     {
    17 
    18     }
    19 }
    20 interface ClickListener
    21 {
    22     public void onClick();
    23 }

    在监听器、触发器的使用中经常用到,上面是一个典型的匿名内部类的使用方法,这个匿名内部类是实现ClickListener接口的子类。

    方法内部类

    在方法内部定义内部类,一般不太用到。

    注意点:

    • 方法内部类不能使用方法的局部变量,因为内部类实例的生命周期可能比方法的局部变量长。
    • 方法内部类可以和普通内部类一样,方法外部类的实例变量。
    • 如果要创建方法内部类的实例,则必须在方法内部类声明后才能定义

    内部类的优先级

    下面代码输出:内部类。

     1 class Inner     //第一个Inner类
     2 {
     3     public void print()
     4     {
     5         System.out.println("外部类");
     6     }
     7 }
     8 public class InnerClass05
     9 {
    10     class Inner              //第二个Inner类
    11     {
    12         public void print()
    13         {
    14             System.out.println("内部类");
    15         }
    16     }
    17     public void fun()
    18     {
    19         Inner in = new Inner();
    20         in.print();        //输出 “内部类”
    21         class Inner     //第三个Inner类
    22         {
    23             public void print()
    24             {
    25                 System.out.println("方法内部类");
    26             }
    27         }
    28     }
    29     public static void main(String[] args) {
    30         InnerClass05 inclass = new InnerClass05();
    31         inclass.fun();
    32     }
    33 }

     注意点:

    • 优先级:方法内部类 > 普通内部类/静态内部类 > 外部类。
  • 相关阅读:
    MySql索引
    HashMap 底层解析
    https超文本安全传输协议
    多线程
    过滤器和拦截器
    计算机操作系统
    计算机网络
    java线程内存模型JMM
    jvm
    数据库
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3215060.html
Copyright © 2020-2023  润新知