zoukankan      html  css  js  c++  java
  • 内部类

    什么是内部类?

    一个类的定义放在另一个类的定义内部,这个类这就是内部类。类名不需要和文件夹相同。


    代码:

    public class Outer {
        public class Inner {
        }
    }

    编译后:

    生成两个.class文件:Outer.class和Outer$Inner.class;因为是两个不同的类,所以内部类的成员变量和方法名可以和外部类相同。

    Outer反编译代码1:

    public class jichu.Outer {
      public jichu.Outer();
    }

    Outer反编译代码2:

    public class Outer
    {
      public class Inner
      {
        public Inner() {}
      }
    }

    Outer$Inner反编译代码1:

    public class jichu.Outer$Inner {
      final jichu.Outer this$0;
      public jichu.Outer$Inner(jichu.Outer);
    }

    Outer$Inner反编译代码2:

    public class Outer$Inner
    {
      public Outer$Inner(Outer paramOuter) {}
    }

    Outer$Inner反编译代码1中:

    final jichu.Outer this$0;

    this$0为外部类的引用。

    public jichu.Outer$Inner(jichu.Outer);

    这是编译器自动生成的构造器,参数为外部类对象,来建立外部类与内部类的联系。 


    内部类的分类

    1、类级内部类(static修饰)、对象级内部类(没有static修饰)。

    2、成员内部类(类中定义),静态内部类(类中定义)、局部内部类(方法中定义),匿名内部类(方法中定义)。


    成员内部类(作为外部类的一个成员存在的类称为成员内部类)

    1、内部类可直接使用外部类的私有成员变量或方法,外部类对内部类是可见的;

    2、外部类中可以创建私有内部类对象。

    3、外部类可通过内部类的对象调用内部类的私有成员变量或方法;

    4、当内部类与外部类有同名成员变量和方法时,内部类可通过Outer.this方式来引用外部类成员。

    5、必须先创建外部类才能创建内部类。

    6、成员内部类不能含有static的变量和方法。因为成员内部类需要先创建外部类,才能创建它自己的。 

    详见成员内部类详解


    局部内部类(定义在方法中的内部类)

    1、内部类不能被public、private、static修饰;

    2、在外部类中不能创建内部类的实例;

    3、创建内部类的实例只能在包含他的方法中;

    4、内部类访问包含他的方法中的变量必须有final修饰;

    5、外部类不能访问局部内部类,只能在方法体中访问局部内部类,且访问必须在内部类定义之后。

    6、可知局部内部类可随意访问外部类的成员变量和方法,即使是私有的。

    7、内部类和外部类有同名变量和方法时,需要通过Outer.this方式来访问外部类成员变量或方法。

    详见局部内部类详解


    静态内部类(有static关键字修饰的内部类)

    1、创建静态内部类方式:Outer.Inner inner = new Outer.Inner();静态内部类不依赖于外部类。

    2、外部类可通过内部类的对象调用内部类的私有成员变量或方法。

    3、静态内部类访问外部类的静态成员变量或方法必须是静态的。

    4、静态内部类中可定义静态的成员变量和方法。

    5、外部类可以创建静态内部类的实例,即使是私有的;并可通过内部类的实例访问内部类的成员变量和方法,即使是私有的。

    详见静态内部类详解


    匿名内部类(没有名字的内部类)

    1、匿名内部类不能定义任何静态成员、方法。

    2、匿名内部类中的方法不能是抽象的;

    3、匿名内部类必须实现接口或抽象父类的所有抽象方法。

    4、匿名内部类不能定义构造器;

    5、匿名内部类访问的外部类成员变量或成员方法必须用static修饰;

    6、内部类可以访问外部类私有变量和方法。

    详见匿名内部类详解

  • 相关阅读:
    Python web 框架:web.py 【函数】
    python >>> sql >>> conn >>> pyodbc
    python中使用mRMR
    2019 湖南省赛 I题 2019 (树形DP???)
    CF-1092 F. Tree with Maximum Cost(换根DP)
    CF-1187 E. Tree Painting (换根DP)
    CF1200D White Lines
    [网络流24题] 骑士共存问题 (二分图匹配 最大流)
    [网络流24题] 分配问题 (二分图的最佳匹配)
    P3831 [SHOI2012]回家的路 (分层图最短路)
  • 原文地址:https://www.cnblogs.com/SQP51312/p/6086493.html
Copyright © 2011-2022 走看看