【问题标题】:Understanding inner classes (Why inner classes exist) [closed]了解内部类(为什么存在内部类)[关闭]
【发布时间】:2016-02-29 11:58:18
【问题描述】:

我正在阅读 Thinking in Java,了解内部类存在的原因以及它们帮助解决的问题。

本书试图给出的最令人信服的理由是:

每个内部类都可以独立地从一个实现继承。 因此,内部类不受外部类是否为 已经从实现继承。

请帮助检查我的理解:

存在内部类是因为 Java 不支持多重继承。这(多重继承)可以在一个内部类中完成,即Outer class 可以有多个内部类,每个内部类都可以从不同的类继承。所以通过这种方式,可以实现多重继承。我能想到的另一个原因是内部类解决了 OOP 设计原则composition better than inheritance

更新

我找到的大部分解释都和下面的答案一样。例如,在 GUI 框架中使用的 Inner 类来处理事件处理程序。没有提到书中引用的原因。我并不是说下面的答案不好。实际上。我真的很感激他们(+1)。我只想知道这本书有问题吗?

【问题讨论】:

  • 这只是限制类范围的一种方式。 (局部变量解决了哪些字段无法解决的问题?)
  • #ClassEncapsulation :P
  • 已更新。谢谢。 (原谅我的英语不好。我试图尽可能地编辑它。没那么快。)
  • 也是拥有“朋友”课程的一种方式。内部类可以访问父类的私有字段/方法。请参阅this 了解朋友在 C++ 中的含义
  • 不就是java实现闭包的方式吗?

标签: java oop inner-classes


【解决方案1】:

在阅读了你从书中引用的最令人信服的理由之后,你为什么想到了多重继承的想法,这有点令人费解。当一个类(内部或非内部)想要从多个具体实现继承行为时,多重继承就会受到质疑。因此,与其他一些语言不同,在 Java 中,您不能定义如下类:

class Child extends Father, Mother {
   // Child wants to inherit some behavior from Father and some from Mother
}

如您所见,only 内部类所做的任何事情都无法以直接的方式纠正或解决这个 Java 决定(不支持多重继承)。

那么它们为什么存在,你可能想知道!好吧,在 Java 中,每个类要么是顶级的,要么是内部的(也称为嵌套的)。任何在另一个类中定义的类都是内部类,任何不是这样的类都是顶级类。

自然,人们可能想知道为什么要在其他类中定义类(即行为)。顶级课程还不够吗?

答案是肯定的。 Java 总是可以有only 顶级类。但是这个想法(也许)是没有充分的理由限制类成为其他类的成员!就像任何预定义的类型(例如IntegerString 等)都可以是类的成员:

class Person {
  private String name; // a field the models a Person's name
}

程序员应该能够在类中定义自己感兴趣的行为

class Person {
  private String name; // a field the models a Person's name
  private Address address; // address is a type defined here
  static class Address {
    String street; 
    String city;
  }
}

这里发生了很多事情,尤其是像privatestatic 等被称为修饰符的东西。关于它们有很多技术细节,但让我们稍后再讨论它们。基本思想是能够将行为定义为另一个类的一部分。 Address 类是否可以 Person 类之外定义为顶级类?当然。但是拥有这个设施就派上用场了。

现在,自从引入了这个工具,它开始服务于另一个目的,这个目的被称为提供代码作为数据。这就是设计模式出现的方式,直到大约 10 年前,人们一直认为内部类可以用于以代码的形式提供数据。也许这让你有些困惑。考虑以下代码我从 JDK 类中几乎逐字记录:java.lang.String.java

public static final Comparator<String> CASE_INSENSITIVE_ORDER
                                     = new CaseInsensitiveComparator();
private static class CaseInsensitiveComparator
        implements Comparator<String> {

    public int compare(String s1, String s2) {
        int n1 = s1.length();
        int n2 = s2.length();
        // details excluded for brevity
        // return -1, 0, 1 appropriately
    }
}

这里发生了什么?

我们需要一种方法来比较一个字符串和另一个字符串,并且我们需要能够进行不区分大小写的比较。因此,我们在外部类中创建了Comparator 接口的实现String!这不是很方便吗?如果内部类不存在,则必须是:

public class String {
  // ... the whole String class implementation

}
class CaseInsensitiveComparator
            implements Comparator<String> {
   // implements the comparator method
}

这本身并不“坏”,但这意味着很多类污染了名称空间。内部类将行为的范围限制在外部类。正如您可能看到的那样,这很方便。本例中的数据是Comparator接口的实现,代码也一样,因为我们正在_new_ing我们定义的内部类。

在 Java 7 之前,此功能被进一步利用匿名内部类(尤其是在您希望代码用作数据的情况下),并且在 Java 8 中它们被有效地替换为 Lambda 表达式。如今,您可能看不到任何使用匿名内部类的新代码(换句话说,语言在进化)。

【讨论】:

    【解决方案2】:

    为什么要使用嵌套类?

    使用嵌套类的令人信服的原因包括:

    • 这是一种逻辑分组类的方法,仅在一个中使用 place:如果一个类只对另一个类有用,那么它是 将其嵌入该类并将两者保持在一起是合乎逻辑的。嵌套 这样的“帮助类”使它们的包更加精简。
    • 它增加了封装:考虑两个顶级类,A 和 B, 其中 B 需要访问 A 的成员,否则这些成员将被声明 私人的。通过将类 B 隐藏在类 A 中,可以声明 A 的成员 私人和 B 可以访问它们。另外,B本身可以隐藏 来自外部世界。
    • 它可以使代码更具可读性和可维护性:嵌套小 顶级类中的类使代码更靠近它所在的位置 用过。

    Oracle 文档:Understanding inner classes

    您可能会对以下 SO 问题感兴趣 -

    What is the reason for making a nested class static in HashMap or LinkedList?

    更新

    没有提到书中引用的原因。 ... 我只是想知道 这本书有问题吗?

    我认为您突出显示的声明没有任何问题。

    Each inner class can independently inherit from an implementation: 没错。就像外部类一样,它可以独立地从实现中继承。只需将它们视为单独的类即可。

    Thus, the inner class is not limited by whether the outer class is already inheriting from an implementation: 由于两者都是独立的类,外部类是否已经从实现继承并不重要。内部类也可以从实现继承。毕竟也是一堂课。

    【讨论】:

      【解决方案3】:

      如果您正在寻找用例,我只能告诉您我经常使用它们的用途,基本上是这两件事:

      1. 我用来帮助实现一些内部逻辑的静态内部类。这些通常是某种形式的元组,或者一些简单的容器。例如:地图中有“条目”,基本上只是成对的。

      2. 表示运行时父子关系。这些是非静态内部类。例如:我有一个Job 类,它可能会实例化多个Task 内部类,这些内部类需要查看作业中的数据以进行处理。

      当然可能还有更多用例...

      【讨论】:

        猜你喜欢
        • 2013-12-27
        • 1970-01-01
        • 1970-01-01
        • 2020-11-22
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-02
        相关资源
        最近更新 更多