首页 > 代码库 > 内部类

内部类

什么是内部类?

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


代码:

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、内部类可以访问外部类私有变量和方法。

详见匿名内部类详解

内部类