Java为什么要设计封装类的一些深度思考(面试必看)

303 阅读2分钟

Integer 是基本数据类型int的封装类,java中的八种数据类型都有一一对应的封装类型。 使用int时 我们直接定义一个变量名并赋值,而使用Integer类型时我们需要new
int a = 1;
Integer b = new Integer(1);
可以看出 封装类型其实是对象,那为什么我们需要封装类型呢?
Java本身是一门面向对象语言,ArrayList,HashMap这些集合只能存储对象类型,因此封装类型存在的意义就很大。此外,封装类型还有很多好处,比如安全性较好,可以避免外部操作随意修改成员变量的值;隐藏了实现细节,对使用者更加友好,只需要调用对象提供的方法就可以完成对应的操作。
那为什么ArrayList,HashMap这些集合只能存储对象类型
当我们创建一个集合类时,例如ArrayList或HashMap,我们通常需要指定集合中元素的类型。泛型类是一种在定义类、接口或方法时使用类型参数的特性。通过使用泛型类,我们可以在使用这些类、接口或方法时指定具体的类型。

泛型类的语法形式是在类名后面使用尖括号(<>)来声明一个或多个类型参数。这些类型参数可以在类的字段、方法的参数列表、方法的返回值类型以及局部变量中使用。

下面是一个使用泛型类的示例:

Copypublic class ArrayList<E> {
    private E[] elements;
    private int size;

    // 构造方法
    public ArrayList() {
        elements = (E[]) new Object[10];
        size = 0;
    }

    // 添加元素
    public void add(E element) {
        if (size >= elements.length) {
            resize();
        }
        elements[size++] = element;
    }

    // 获取元素
    public E get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        return elements[index];
    }

    // 调整数组大小
    private void resize() {
        E[] newElements = (E[]) new Object[elements.length * 2];
        System.arraycopy(elements, 0, newElements, 0, size);
        elements = newElements;
    }
}

在上面的示例中,我们定义了一个泛型类ArrayList,其中表示类型参数。在类的字段和方法中,我们可以使用类型参数E来代表集合中的元素类型。在构造方法中,我们使用类型参数E来创建一个数组,并进行类型转换。在add方法中,我们使用类型参数E来接受传入的元素,并将其添加到数组中。在get方法中,我们使用类型参数E来指定返回值类型。在resize方法中,我们同样使用类型参数E来创建新的数组并进行类型转换。

使用泛型类的好处是可以提高代码的类型安全性和可读性。通过指定具体的类型参数,我们可以在编译时检查类型的正确性,并避免了在运行时进行类型转换的麻烦。此外,泛型类还可以减少代码的重复,使代码更加通用和灵活。

需要注意的是,虽然泛型类允许使用任意的引用类型作为类型参数,但不允许使用基本类型(如int、char等)。如果需要存储基本类型,可以使用它们的包装类(如Integer、Character等)作为类型参数。