内部类

Posted 孙晓凯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内部类相关的知识,希望对你有一定的参考价值。

最近使用内部类,发现对其中的一些细节把握的并不准确,对一些规则理解的也不全面,现写下这篇文章,以作记录!

内部类作用

  1. 提供更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。
  2. 内部类成员可以直接访问外部类私有数据,内部类相当于外部类的一个属性,但是,外部类不能访问内部类的细节,如内部类的属性。
  3. 匿名内部类一般使用在仅需一次使用的地方。

非静态内部类

内部类可以定义在一个类中的任何位置,如果定义在一个方法的内部,就称为局部内部类,如果和外部类的方法平级,就成为成员内部类。

成员内部类分为两种:
- 静态内部类(使用static修饰的类)
- 非静态内部类

内部类是作为外部类的成员存在的,所以可以使用任意的访问控制符,如:private,protected,public。
而我们通常使用的外部类一般有两个访问控制符,因为它的上一层是包,所以一个类的默认控制符表示只能被同一个包中的类访问,public表示能被其他包中的类访问:

  1. 默认
  2. public

非静态内部类会保存一个它寄存的外部类对象的引用。

非静态内部类中的一个方法用到一个属性的时候,会先在本方法中查找该属性,如果没有找到,会到该内部类中去找,如果还没有找到,会到外部类中去找,还没有找到,就会报错。

因为静态成员不能访问非静态成员,所以外部类的静态方法,静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量,创建实例等。

java不允许在非静态内部类中定义静态成员。

静态内部类

使用static来修饰一个内部类,这个类属于整个外部类,而不是单独属于外部类的某个对象。

静态内部类的对象不是寄存在外部类对象中,而是寄存在外部类的类本身中,它只有外部类的类引用,没有外部类的对象引用。

静态内部类可以包含静态成员,也可以包含非静态成员,根据静态成员不能访问非静态成员的规则,静态内部类不能访问外部类的实例成员。

静态内部类的实例方法也不能访问外部类的实例属性。

外部类还是不能直接访问静态内部类的成员,但可以使用那个静态内部类的类名作为调用者来访问静态内部类的类成员,也可以使用静态内部类的对象作为调用者来访问静态内部类的实例成员。

在接口中定义的内部类,只能是静态内部类。

使用内部类

在外部类内部使用内部类

和平常使用普通类差不多,先new出类的实例,然后进行操作。

在外部类以外使用非静态内部类

内部类不能使用private访问控制权限,private修饰的内部类只能在外部类内部使用。
1. 默认访问控制符:只能被与外部类处于同一包中的其他类所访问。
2. protected:可被与外部类处于同一个包中其他了和外部类的子类所访问。
3. public:任何地方可访问。

在外部类以外使用非静态内部类内部类:’Out.In in = new Out().new In();’

在外部类以外定义非静态内部类的子类:

public class SubClass extends Out.In
    public SubClass(Out out)
    out.super();//通过传入out对象显示调用In的构造器

在外部类以外使用静态内部类

在外部类以外创建静态内部类的实例:’StaticOut.StaticIn in = new StaticOut.StaticIn();’

局部内部类

局部内部类只能在局部使用,所以不能在外部类以外的地方使用,也不能使用访问控制符和static修饰符修饰。
一切操作应该在局部进行。

以上是关于内部类的主要内容,如果未能解决你的问题,请参考以下文章

java内部类之成员内部类之局部内部类

java 如何调用局部内部类和匿名类

四种内部类

Java面向对象(OOP)--内部类(局部内部类)

静态非静态内部类匿名内部类局部内部类

内部类(成员内部类局部内部类(包括匿名内部类))