jvm java中的每个层次结构意味着什么?

kgsdhlau  于 2022-11-07  发布在  Java
关注(0)|答案(3)|浏览(133)

Oracle's documentation,Java中有3个层次结构
1.类层次结构
1.接口层次结构
1.枚举层次结构
有人能解释一下每个层次代表什么,它们的意义是什么吗?

一个小问题-

据记载
HashMap是Map接口的基于哈希表的实现
Oracle website中所述,HashTable & HashMap福尔斯 * 类层次结构 *,而Map属于 * 接口层次结构 *,那么为什么HashMap、Hashtable和Map不在同一层次结构下表示?

vm0i2vca

vm0i2vca1#

原则上,您可以在一个层次结构中显示所有Java类型。但是接口支持多重继承,因此一个树不足以显示层次结构。Javadoc通过多次显示受影响的条目(如果它们有多个不相关的祖先)来解决此问题。
但是分离接口和普通类可以大大减少对多个条目的需求。现在,最多在“Interfaces”部分需要它。在java.util包的情况下,根本不需要它,但是如果我们合并这些部分,就需要它,因为那样的话,ArrayListVector就需要显示为AbstractListRandomAccess的子类型。例如。
然而,它们不需要显示为List的子类型,因为它们的超类型AbstractList已经是List的子类型。同样,HashMap不需要显示为Map的子类型,因为它的超类型AbstractMap已经实现了Map。另一方面,如果合并了类型树,它的条目将需要被复制以显示在SerializableCloneable下,这显示了这样一个庞大的类型树是多么的分散注意力。
enum和注解类型可能被放置到不同的部分中,以与classinterface的分离一致,因为它们也是用不同的语法声明的,即enum@interface。或者因为它们实际上并不像其他类型那样创建层次结构。它们总是具有相同的父类型,而没有API文档中会出现的子类型。另一方面,您可以对record类型说同样的话,但从JDK 17开始,它们不会出现在一个不同的部分。但这可能只是一个疏忽,因为record是一个新特性。

ijnw1ujt

ijnw1ujt2#

你提到的每一件事都是不同的。一个classinterfaceenum相互作用,但又是不同的。被引用的层次结构是这些东西如何从父对象继承的。
在Java中,interface定义了一组可以有多个实现的API。在case引用中,Map是一组应该在所有实现上可用的方法。HashTableHashMap对该接口有不同的实现-每一种都有其优缺点。
最佳做法是使用界面宣告变数,而且当您将在执行严修化对象时指定特定实作时,使用程式码应该会注意该实作是什麽。

busg9geu

busg9geu3#

接口层次意味着有一个基类(一个接口),你可以实现你自己的类。那些实现的类必须有与基类相同的方法覆盖。
类层次结构意味着还有一个基类,你可以扩展你自己的类。这些类将产生与基类相同的行为。
它们之间的区别是你必须用给定的参数实现一个接口的方法,但是你的子类中已经有了基类的方法。这对于你必须用复杂的继承等方式编码的更大的项目很有用。
举个例子:

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 
    }
}

相关问题