【问题标题】:What does each hierarchy in java mean?java中的每个层次结构是什么意思?
【发布时间】:2022-01-03 17:57:41
【问题描述】:

查看Oracle's documentation,Java 中有 3 个层次结构

  1. 类层次结构
  2. 接口层次结构
  3. 枚举层次结构

谁能解释一下每个层次结构代表什么以及它们的意义是什么?


子问题-

据记载

HashMap 是 Map 接口的基于哈希表的实现

Oracle website HashTable & HashMap 中记载的 Class Hierarchy 和 Map 属于 Interface Hierarchy 中所述,那么为什么 HashMap、Hashtable 和 Map 不代表相同层次结构?

【问题讨论】:

  • 森林里的每棵树是什么意思?看着林业指南,我看到了榆树、落叶松和橡树。每棵树的意义是什么?
  • MapinterfaceHashMap 是一个实现该接口的类。接口和类是 Java 中的两种类型。枚举是另一种类型的东西。枚举类型。它们也是一类。还有原始类型。它们不是类、接口或枚举。所以这是第四种事情。抽象并不完全具体。它们是抽象的。

标签: java hashmap jvm hashtable hierarchy


【解决方案1】:

原则上,您可以在一个层次结构中显示所有 Java 类型。但是接口支持多重继承,因此树不足以显示层次结构。如果受影响的条目有多个不相关的祖先,Javadoc 通过多次显示受影响的条目来解决这个问题。

但是分离接口和普通类可以显着减少对多个条目的需求。现在,“接口”部分最多需要它。在 java.util 包的情况下,根本不需要它,但如果我们合并这些部分,则需要它,因为那时,ArrayListVector 将需要显示为 AbstractList 和 @ 的子类型例如 987654325@。

但是,它们不需要显示为 List 的子类型,因为它们的超类型 AbstractList 已经是 List 的子类型。同样,HashMap 不需要显示为Map 的子类型,因为它的超类型AbstractMap 确实实现了Map。另一方面,如果类型树被合并,则需要复制其条目以显示在SerializableCloneable 下,这表明这样一个巨大的类型树会让人分心。

enum 和注释类型可能被放置在不同的部分中,以与 classinterface 的分隔保持一致,因为它们也使用不同的语法声明,即 enum@interface。或者因为他们并没有像其他类型那样真正创建层次结构。它们始终具有相同的超类型,并且没有 API 文档中出现的子类型。另一方面,您可以对 record 类型说同样的话,但从 JDK 17 开始,它们不会出现在不同的部分中。但这可能只是一个疏忽,因为record 是一项新功能。

【讨论】:

    【解决方案2】:

    你提到的每一件事都是不同的。 classinterfaceenum 相互交互但又不同。所引用的层次结构是这些事物中的每一个从父对象继承的方式。

    在 Java 中,interface 定义了一组可以有多个实现的 API。在案例参考中,Map 是所有实现都应该可用的方法集。 HashTableHashMap 对该接口有不同的实现 - 各有优缺点。

    最佳实践是使用接口声明变量,并且在实例化对象时指定具体的实现,使用代码应该准确地关心该实现是什么。

    【讨论】:

      【解决方案3】:

      接口层次结构意味着有一个基类(一个接口),您可以在其中实现自己的类。那些实现的方法必须与基础方法相同。

      类层次结构意味着还有一个基类,您可以扩展自己的类。这些将产生与基类相同的行为。

      它们之间的区别在于您必须使用与给定参数相同的参数来实现接口的方法,但您的子类中已经有了基类的方法。它对于需要编写复杂继承等代码的大型项目非常有用。

      举个例子:

      public interface IPerson{
          void setPerson(int age, String name);
          int getAge();
          String getName();
      }
      
      public class Person implements IPerson{
          private int age;
          private String name;
          
          //you have to override every implemented method
          @Override
          public void setPerson(int age, String name){
              this.age = age;
              this.name = name;
          }
          @Override
          public int getAge(){return this.age;}
          @Override
          public String getName(){return this.name;}
      
          //does the same as setPerson, just for demonstrational purposes
          public Person(int age, String name){
              this.age = age;
              this.name = name;
          }
      }
      
      public class Student extends Person{
          private String school;
          //you don't need to implement the same methods as in the Person class
          public String getSchool(){return this.school;}
          public Student(int age, String name, String school){
              super(age,name); // calls Person's constructor, mandatory step
              this.school = school;
          }
      }
      
      public class Main{
          public static void main(String[] args){
              Student student = new Student(15,"Billy","good school"); 
              // will possess the same attributes of both Person and Student
              System.out.println(student.getSchool()); // "good school"
              System.out.println(student.getAge()); // 15 -- you can also do this because the Student class automatically has the getAge() method because of Person
      
              student.setPerson(16,"Billy");
              System.out.println(student.getAge()); // 16
      
              Person person = new Person(30, "Anna");
              System.out.println(person.getName()); // "Anna"
              System.out.println(person.getSchool()); // DOES NOT WORK
              person.setPerson(29, "Annabelle");
              System.out.println(person.getName()); // "Annabelle"
      
              IPerson iperson = new IPerson(); // DOES NOT WORK 
          }
      }
      
      

      【讨论】:

      • 第二个关于HashMap的问题你能不能也回答一下?
      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      • Map 是一个必须实现的“基类”,HashMap 和 HashTable(以及其他)实现它 - 接口层次结构。然后,您可以扩展这些类 - 类层次结构。
      • 关于接口层次意味着有一个基类(一个接口)并且Map是一个“基类” - Map是一个接口,而不是一个班级。在写这两个术语(“类”和“接口”)时,你不应该以这种方式混合它们。另见Is an interface a class?
      猜你喜欢
      • 2019-02-20
      • 1970-01-01
      • 2011-06-25
      • 2021-02-15
      • 1970-01-01
      • 2020-07-17
      • 2015-10-13
      • 2011-12-02
      • 1970-01-01
      相关资源
      最近更新 更多