强哥说Java--Java内部类(三)

简介: 强哥说Java--Java内部类(三)

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()方法


相关文章
|
2月前
|
Java 编译器
【Java】内部类
【Java】内部类
23 0
|
4月前
|
Java
【Java基础面试二】、个Java文件里可以有多个类吗(不含内部类)?
这篇文章讨论了Java文件中类的定义规则,指出一个Java文件可以包含多个类(不包含内部类),但其中最多只能有一个public类,且如果有public类,它的名称必须与文件名一致。
|
4月前
|
算法 Java
12 Java常用类(一)(内部类+object类+包装类)
12 Java常用类(一)(内部类+object类+包装类)
43 5
|
5月前
|
Java
Java进阶之内部类
【7月更文挑战第13天】Java内部类增进代码组织与封装,允许直接访问外部类成员,包括私有成员。主要有四种类型:成员、静态、局部和匿名内部类。匿名内部类常用于一次性实现接口或扩展类。内部类可隐藏实现细节,减少命名冲突,并在特定上下文中定义辅助类。示例展示了静态和非静态内部类如何在Shape类中封装Circle和Rectangle。使用内部类能提升代码可读性,但可能增加复杂性。
48 6
|
4月前
|
Java
【Java】内部类、枚举、泛型
【Java】内部类、枚举、泛型
|
6月前
|
Java
一篇文章讲明白Java中内部类详解—匿名内部类
一篇文章讲明白Java中内部类详解—匿名内部类
102 2
|
6月前
|
设计模式 Java 编译器
Java中的内部类(如果想知道Java中有关内部类的知识点,那么只看这一篇就足够了!)
Java中的内部类(如果想知道Java中有关内部类的知识点,那么只看这一篇就足够了!)
|
6月前
|
Java 编译器
24. 【Java教程】内部类
24. 【Java教程】内部类
34 2
|
7月前
|
Java 程序员
Java的内部类与匿名类的技术性文章
Java的内部类与匿名类的技术性文章
50 1
|
7月前
|
Java
Java内部类(成员内部类、静态内部类、局部内部类、局部内部类)
Java内部类(成员内部类、静态内部类、局部内部类、局部内部类)
90 3
下一篇
DataWorks