3. 作用
3.1 封装性
内部类的成员通过外部类才能访问,对成员信息有更好的隐藏,因此内部类实现了更好的封装。
3.2 实现多继承
我们知道 Java 不支持多继承,而接口可以实现多继承的效果,但实现接口就必须实现里面所有的方法,有时候我们的需求只是实现其中某个方法,内部类就可以解决这些问题。
下面示例中的 SonClass,通过两个成员内部类分别继承 FatherClass1 和 FatherClass2,并重写了方法,实现了多继承:
// FatherClass1.java public class FatherClass1 { public void method1() { System.out.println("The FatherClass1.method1"); } } // FatherClass2.java public class FatherClass2 { public void method2() { System.out.println("The FatherClass2.method2"); } } // SonClass.java public class SonClass { // 定义内部类1 class InClass1 extends FatherClass1 { // 重写父类1方法 @Override public void method1() { super.method1(); } } // 定义内部类2 class InClass2 extends FatherClass2 { // 重写父类2方法 @Override public void method2() { super.method2(); } } public static void main(String[] args) { // 实例化内部类1 InClass1 InClass1 = new SonClass().new InClass1(); // 实例化内部类2 InClass2 InClass2 = new SonClass().new InClass2(); // 分别调用内部类1、内部类2的方法 InClass1.method1(); InClass2.method2(); } }
编译执行 SonClass.java,屏幕将会打印:
$ javac SubClass.java $ java SonrClass The SuperClass1.method1 The SuperClass1.method2
3.3 解决继承或实现接口时的方法同名问题
请阅读如下代码:
// First.java public class First { public void test() { } } // Second.java public interface Second { void test(); } // Demo.java public class Demo1 extends First implements Second { public void test() { } }
此时,我们无法确定 Demo1 类中的 test() 方法是父类 First 中的 test 还是接口 Second 中的 test。这时我们可以使用内部类解决这个问题:
public class Demo2 extends First { // 重写父类方法 @Override public void test() { System.out.println("在外部类实现了父类的test()方法"); } // 定义内部类 class InClass implements Second { // 重写接口方法 @Override public void test() { System.out.println("在内部类实现了接口的test()方法"); } } public static void main(String[] args) { // 实例化子类Demo2 Demo2 demo2 = new Demo2(); // 调用子类方法 demo2.test(); // 实例化子类Demo2的内部类 InClass InClass = demo2.new InClass(); // 调用内部类方法 InClass.test(); } }
运行结果:
在外部类实现了父类的test()方法 在内部类实现了接口的test()方法