【JavaSE专栏65】内部类的使用,定义在其他类内部的类

简介: 【JavaSE专栏65】内部类的使用,定义在其他类内部的类

本文讲解了 Java 中内部类概念及语法,并给出了样例代码。内部类是定义在其他类内部的类,内部类可以访问外部类的成员,并且可以起到隐藏和封装的作用。

一、什么是内部类

Java 中的内部类是定义在其他类内部的类

内部类可以访问外部类的成员(包括私有成员),并且可以起到隐藏和封装的作用。

下面是一个简单的 Java 内部类的示例代码,请同学们复制到本地执行。

public class OuterClass {
    private int outerVariable = 10;
    public void outerMethod() {
        InnerClass innerObj = new InnerClass();
        innerObj.innerMethod();
    }
    public class InnerClass {
        private int innerVariable = 5;
        public void innerMethod() {
            System.out.println("Inner Variable: " + innerVariable);
            System.out.println("Outer Variable: " + outerVariable);
        }
    }
    public static void main(String[] args) {
        OuterClass outerObj = new OuterClass();
        outerObj.outerMethod();
    }
}

在这个例子中,OuterClass 包含了一个内部类 InnerClass

InnerClass 可以直接访问外部类 OuterClass 的成员变量 outerVariable,并且 OuterClass 可以通过创建 InnerClass 的实例来调用 innerMethod() 方法。

main() 方法中,我们创建了一个 OuterClass 对象并调用了 outerMethod() 方法,它又创建了一个 InnerClass 对象并调用了 innerMethod() 方法。在 innerMethod() 方法中,我们打印出了内部类的成员变量 innerVariable 和外部类的成员变量 outerVariable

这个示例展示了内部类可以访问外部类的成员,以及如何创建和使用内部类的实例。

内部类分为以下 4 44 种类型,请同学们认真学习。

  1. 成员内部类:定义在类的内部,并且与外部类的成员级别相同。成员内部类可以访问外部类的所有成员,包括私有成员。创建成员内部类的实例时,必须先创建外部类的实例。
  2. 静态内部类:使用 static 关键字修饰的内部类,它与外部类的实例无关,可以直接通过外部类进行访问。静态内部类不能访问外部类的非静态成员,只能访问外部类的静态成员。
  3. 方法内部类:定义在方法内部的类,只能在该方法的作用域内使用。方法内部类可以访问外部类的成员(包括方法的参数和局部变量),但是只能访问 final 修饰的局部变量。
  4. 匿名内部类:没有名字的内部类,用于创建只需要使用一次的类。匿名内部类通常是在创建接口对象或者继承父类的时候使用。

内部类的特点包括以下 4 44 点,请同学们认真学习。

  • 内部类可以访问外部类的成员,包括私有成员。
  • 内部类可以隐藏在外部类中,对外部类的其他类不可见。
  • 内部类可以实现多重继承,一个类可以同时继承多个内部类。
  • 内部类可以访问外部类的实例,包括实例变量和实例方法。

内部类的使用场景包括以下 3 33 点,请同学们认真学习。

  • 封装:将内部类设为私有,只供外部类使用。
  • 代码组织:将相关的类组织在一起,提高代码的可读性和可维护性。
  • 回调机制:内部类可以实现接口或继承抽象类,用于回调方法的实现。

总之,内部类是一种特殊的类,它可以访问外部类的成员,并且用于实现封装、代码组织和回调等功能。


二、内部类和普通类有什么区别

Java 中的内部类和普通类有以下 6 66 点区别,请同学们认真学习。

  1. 访问权限:内部类可以访问外部类的私有成员,而普通类不能直接访问外部类的私有成员。这是因为内部类是外部类的成员,可以享有外部类成员的所有访问权限。
  2. 关联性:内部类与外部类之间存在一种关联性,内部类可以访问外部类的成员,包括实例变量和方法。而普通类之间没有这种特殊的关联性。
  3. 创建方式:内部类的实例必须依赖于外部类的实例,需要先创建外部类的实例,然后再创建内部类的实例。而普通类可以直接通过new关键字创建实例。
  4. 类型:内部类可以分为成员内部类、静态内部类、方法内部类和匿名内部类。而普通类只有一种类型。
  5. 隐藏性:内部类可以被隐藏在外部类中,对外部类的其他类不可见。而普通类不具备这种隐藏性,对于外部类的其他类是可见的。
  6. 使用场景:内部类通常用于封装、组织代码、实现回调机制等特殊的需求场景。普通类更适合用于一般的面向对象编程。

总之,内部类与普通类之间的区别主要体现在访问权限、关联性、创建方式、类型、隐藏性和使用场景等方面,同学们可以根据具体的需求,可以选择合适的类类型来实现功能。


三、内部类的应用场景

内部类在 Java 中有很多应用场景,以下是一些常见的 6 66 种应用场景。

  1. 实现回调机制:内部类可以实现接口或继承抽象类,用于回调方法的实现。通过内部类实现回调机制可以简化代码的编写,使代码更加清晰和可维护。
  2. 封装和隐藏:内部类可以被私有修饰,将其隐藏在外部类中,只供外部类内部进行访问。这样可以实现封装性,防止外部类以外的其他类直接访问内部类。
  3. 优化代码结构:内部类可以将相关的类组织在一起,提高代码的可读性和可维护性。通过将内部类定义在需要使用的地方,可以减少类的数量,简化代码结构。
  4. 实现多重继承:内部类可以实现多重继承,一个类可以同时继承多个内部类。这样可以避免 Java 不支持多继承的限制,实现更灵活的类的关系。
  5. 访问外部类私有成员:内部类可以访问外部类的私有成员,包括私有变量和私有方法。这样可以实现对外部类私有成员的访问和操作,增强了内部类的功能。
  6. 匿名内部类:内部类可以用于创建只需要使用一次的类,即匿名内部类。通过匿名内部类,可以在创建接口对象或继承父类的时候,快速定义相关的实现逻辑,简化代码。


四、内部类面试题

  1. Java 中的内部类有哪几种类型?分别描述它们之间的区别和使用场景。
  2. 内部类可以访问外部类的私有成员吗?为什么?
  3. 如何在外部类以外的地方创建内部类的实例?
  4. 静态内部类和非静态内部类有什么区别?
  5. 为什么匿名内部类可以访问外部类的局部变量,而不需要声明为 final?
  6. 如何访问静态内部类和非静态内部类的成员变量和方法?
  7. 内部类是否可以拥有自己的内部类?
  8. 什么是内部类的作用域?
  9. 如何在外部类中创建内部类的实例?
  10. 内部类和继承关系有什么异同之处?

五、总结

本文讲解了 Java 中内部类的概念及语法,并给出了样例代码,在下一篇博客中,将讲解 Java instanceof 关键字和数据类型转换的知识点。


相关文章
|
7月前
|
Java
【JavaSE专栏64】抽象类和接口,不能被实例化的类有什么用?
【JavaSE专栏64】抽象类和接口,不能被实例化的类有什么用?
127 0
|
18天前
|
安全 Java 编译器
接口之美,内部之妙:深入解析Java的接口与内部类
接口之美,内部之妙:深入解析Java的接口与内部类
37 0
接口之美,内部之妙:深入解析Java的接口与内部类
|
4月前
|
Java
JavaSE学习之--抽象类,接口,内部类(一)
JavaSE学习之--抽象类,接口,内部类(一)
55 0
|
4月前
|
存储 Java 机器人
JavaSE学习之--抽象类,接口,内部类(二)
JavaSE学习之--抽象类,接口,内部类(二)
36 0
|
4月前
|
存储 Java 编译器
JavaSE学习之--抽象类,接口,内部类(三)
JavaSE学习之--抽象类,接口,内部类(三)
28 0
|
7月前
|
druid Java 编译器
Java的第七篇文章——面向对象接口(包含了接口、static修饰符、final修饰符、main方法、内部类等知识点)
Java的第七篇文章——面向对象接口(包含了接口、static修饰符、final修饰符、main方法、内部类等知识点)
|
7月前
|
存储 Java
【JavaSE专栏56】Java 类、对象、属性、方法的概念
【JavaSE专栏56】Java 类、对象、属性、方法的概念
|
Java
java学习第十三天笔记-面向对象246-继承中成员方法和成员变量的特点-成员变量的访问特点小练习
java学习第十三天笔记-面向对象246-继承中成员方法和成员变量的特点-成员变量的访问特点小练习
48 0
java学习第十三天笔记-面向对象246-继承中成员方法和成员变量的特点-成员变量的访问特点小练习
|
Java
java学习第十三天笔记-面向对象245-继承中成员方法和成员变量的特点-成员变量的访问特点
java学习第十三天笔记-面向对象245-继承中成员方法和成员变量的特点-成员变量的访问特点
67 0
java学习第十三天笔记-面向对象245-继承中成员方法和成员变量的特点-成员变量的访问特点
|
Java
java学习第十三天笔记-面向对象248-继承中成员方法和成员变量的特点-成员方法的访问特点验证
java学习第十三天笔记-面向对象248-继承中成员方法和成员变量的特点-成员方法的访问特点验证
44 0
java学习第十三天笔记-面向对象248-继承中成员方法和成员变量的特点-成员方法的访问特点验证