本文将会对内部类进行总结,主要包括:
- 成员内部类
- 匿名内部类
- 局部内部类
- 静态内部类
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。
例如假设有一个描述动物的类,现在要对动物的各个器管做一个描述,这时候比起使用继承,更号的方法是用一个内部类。
成员内部类可以分为:成员内部类、局部内部类、匿名内部类和静态内部类。
成员内部类
成员内部类是最普通的内部类也是最常用的一个内部类,其形式如下
1 | class Animals{ |
这里的organ类就是Animals类的一个内部类,观察上面的代码,我们可以发现:
- 一个内部类可以无条件的使用外部类的属性和方法,即使是private或者是static修饰的属性和方法
- 但是当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果需要使用外部类的属性或者方法时,需要使用以下的形式进行调用,例如程序中的调用了外部类的kind
1 | 外部类.this.成员变量 |
由于内部类时属于外部类的一个部分,所以在实例化内部类时必须借助外部类的实例才行,下面代码创建了organ类的实例:
1 | Animals animal = new Animals(); |
下面一行代码调用了organ类的方法:
1 | brind.display(); |
但是下面两行代码会报错
1 | animal.display();//The method display() is undefined for the type Animals |
这说明对于外部类和内部类的实例来说,他们两个时严格分割开的,内部实例对象不能直接调用外部的属性和方法,外部实例对象也不能直接调用内部类的属性和方法。
此外,内部类可以拥有 private 访问权限、protected 访问权限、public 访问权限及包访问权限。比如上面的例子,如果成员内部类 organ 用 private 修饰,则只能在外部类的内部访问,如果用 public 修饰,则任何地方都能访问;如果用 protected 修饰,则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。而外部类只能被 public 和包访问两种权限修饰。
1 | private class organ{} |
局部内部类
局部内部类可以定义在一个方法体、构造器、代码块等作用域内,它和成员内部类的区别在于局部内部类只能再某一个作用域内被访问。且不能用public、protected、private 以及 static 修饰符。
1 | class Man{ |
匿名内部类
假如只想创建某一个类的一个对象,但是不需要为类指定名字。这样的一个类被称为匿名内部类。下面代码实现了一匿名内部类:
1 | public void creat() { |
1 | animal.creat(); |
匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为 Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。
这意味着匿名内部类不能进行直接实例化,必须依存于外部类,且匿名内部类可以继承外部类的属性和方法,如果是一个接口,则需要重写接口里的所有方法。
静态内部类
静态内部类就使用static修饰得成员内部类。静态内部类不需要依赖外部类,可以直接实例化,这一点跟类得静态成员有点类似,静态内部类也不能使用非静态得成员变量或者方法。
1 | static class organ{ |
此时可以直接使用如下语句创建一个organ类的实例:
1 | Animals.organ dog = new Animals.organ(); |
本文链接: https://quandongli.github.io/post/17788ff.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
