Java内部类的本质:

本质:

1、内部类与包含它的外部类有比较紧密的关系,而与其他类关系不大,定义在类的内部,可以实现对外部的完全隐藏,可以有更好的封装性,代码实现上也更简洁。

2、内部类只是一个Java编译器的概念,对于Java虚拟机而言,它不知道有内部类存在,Java编译器在编译的时候,每个内部类最后都会编译为一个独立的类(外部类$内部类名.class)

3、内部类可以方便地访问外部类的私有变量,可以声明为private从而对外完全隐藏,相关代码写在一起,写法也更为简洁。


Java中主要分为四种内部类:

1、静态内部类

  使用:通过 ”new 外部类.静态内部类“ 实例化即可

  使用场景:与外部关系密切,且不依赖与外部类实例,可以考虑使用静态内部类。 

  具体案例:Integer类里面有私有的静态内部类IntegerCache,用于支持整数的自动装箱

2、成员内部类(与静态内部类类似)

  使用:必须通过外部类的实例来实例化:“Outer.Innet inner = new Outter().new Inner()"

  使用场景:内部类与外部类关系密切,需要访问外部类的实例变量和方法。(其他类不会使用该内部类)

  具体案例:LinkedList中的有成员内部类ListItr和DescendingIterator

  实现原理:编译后,编译器给外部类内新增访问内部类私有变量的静态非私有方法,从而实现私有内部类变量和外部类的交互 

3、方法内部类

  使用:只能在定义的方法使用,方法不是静态方法,则可以访问外部的静态,非静态变量和方法,如果是静态方法,则只能访问外部类的静态变量和方法;若内部类想访问方法的参数,局部变量,这些变量必须为final,因为获取的实际是自己的实例变量。

  使用场景:功能是可以用成员内部类代替的,但是如果只需要在某个方法里面使用,这样封装性更好。

  实现原理:编译器会给外部类额外添加一个静态方法供内部类访问外部类的成员变量; 内部类自身会把一个外部类作为自己的一个成员变量,因此内部类访问外部类的方法变量,实际上是访问自己的成员变量。

4、匿名内部类(与方法内部类类似)

  使用:new 父类(参数表) {内部类实现}

  使用场景:匿名内部类能做的方法内部类也能做,但是如果不需要构造方法,只创建一次,可以使用匿名内部类,书写更简洁

  实现原理:跟方法内部类类似

你可能感兴趣的:(java)