Skip to content
On this page

5.10.1内部类的概念

内部类介绍

一般情况,我们把类定义成独立的单元。有些情况下,我们把一个类放在另一个类的内部定义,称为内部类(innerclasses)

内部类可以使用public、default、protected 、private以及static修饰。而外部顶级类(我们以前接触的类)只能使用public和default修饰。

注意

内部类只是一个编译时概念,一旦我们编译成功,就会成为完全不同的两个类。对于一个名为Outer的外部类和其内部定义的名为Inner的内部类。编译完成后会出现Outer.class和Outer$Inner.class两个类的字节码文件。所以内部类是相对独立的一种存在,其成员变量/方法名可以和外部类的相同

【示例5-19】内部类介绍

java
/* 外部类Outer */
class Outer {
	private int age = 10;
	public void show(){
		System.out.println(age); // 10
	}
	/* 内部类Inner */
	public class Inner {
		// 内部类中可以声明与外部类同名的属性与方法
		private int age = 20;
		public void show(){
			System.out.println(age); // 20
		}
	}
}

示例5-19编译后会产生两个不同的字节码文件,如图5-24所示:

图5-24 内部类编译结果图.png

图5-24 内部类编译结果图

内部类的作用

  1. 内部类提供了更好的封装只能让外部类直接访问,不允许同一个包中的其他类直接访问。

  2. 内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。 但外部类不能访问内部类的内部属性。

  3. 接口只是解决了多重继承的部分问题,而内部类使得多重继承的解决方案变得更加完整

内部类的使用场合

  1. 由于内部类提供了更好的封装特性,并且可以很方便的访问外部类的属性。所以,在只为外部类提供服务的情况下可以优先考虑使用内部类。

  2. 使用内部类间接实现多继承:每个内部类都能独立地继承一个类或者实现某些接口,所以无论外部类是否已经继承了某个类或者实现了某些接口,对于内部类没有任何影响。