1、私有内部类 —— 在方法之间定义的内部类,非静态
我们首先看看类中内部类的两个特点:
(1) 在外部类的作用范围内可以任意创建内部类对象,即使内部类是私有的(私有内部类)。即内部类对包围它的外部类可见。
例如 (实际上,内部类是可以设置为public公开的,但一般我是当做成员变量设置为private)
- //代码1:内部类对外部类可见
- class Outer{
- //创建私有内部类对象
- public Inner in=new Inner();
- //私有内部类
- private class Inner{
- ...
- }
- }
(2) 在内部类中可以访问其外部类的所有域,即使是私有域。即外部类对内部类可见。
例如
- //代码2:外部类对内部类可见
- //(内部类可以访问外部类的所有成员变量和方法)
- class Outer{
- //外部类私有数据域
- private int data=0;
- //内部类
- class Inner{
- void print(){
- //内部类访问外部私有数据域
- System.out.println(data);
- }
- }
- }
问题来了:上面两个特点到底如何办到的呢?内部类的"内部"到底发生了什么?
其实,内部类是Java编译器一手操办的。虚拟机并不知道内部类与常规类有什么不同。 编译器是如何瞒住虚拟机的呢?
对内部类进行编译后发现有两个class文件:Outer.class 和Outer$Inner.class 。这说明内部类Inner仍然被编译成一个独立的类(Outer$Inner.class),而不是Outer类的某一个域。 虚拟机运行的时候,也是把Inner作为一种常规类来处理的。
class InnerVistOuterPrivate
{
public static void main(String[] args)
{
System.out.println("Hello World!");
new Outer().new Inner().print();
}
}
//代码2:外部类对内部类可见
//(内部类可以访问外部类的所有成员变量和方法)
class Outer{
//外部类私有数据域
private int data=100;
//内部类
class Inner{
void print(){
//内部类访问外部私有数据域
System.out.println(data);
}
}
}
/*
Hello World!
100
请按任意键继续. . .
*/