对于Java中声明导包的理解

9 阅读2分钟

Java中Collection coll = new ArrayList() 你是不是疑惑:明明只实例化了ArrayListCollection只是用来声明变量类型,为啥两个都要导入?我用大白话给你讲明白这件事。

一、先给核心结论

Java 编译器认 “完整的类名” (比如java.util.Collectionjava.util.ArrayList),不认简单的 “简称”(CollectionArrayList)。不管你是声明变量类型,还是创建对象实例,只要代码里写了这个类的 “简称”,就必须通过import告诉编译器:这个简称对应的完整类名在哪,否则编译器就会 “一脸懵”,报错说不认识这个类。

二、拆解开给你讲,更易懂

1. 先看你的代码:两个 “简称” 都出现了

// 这里出现了 2 个类的简称:Collection(声明变量类型)、ArrayList(创建实例)
Collection coll = new ArrayList();

编译器看到这行代码,会有两个疑问:

  • 疑问 1:Collection 是谁?它的完整类路径是什么?
  • 疑问 2:ArrayList 是谁?它的完整类路径是什么?

这两个疑问都需要你用import来解答,少一个都不行。

2. 为啥 “只声明类型没实际用” 也要导入?

你觉得 “Collection只是定义类型,没实际用”,这是对 Java 的误解:Java 中变量声明的类型(这里的Collection)是编译期必须校验的核心信息,不是 “摆设”。编译器在编译这行代码时,必须先确认:

  • Collection 是一个合法的类 / 接口(这里是接口)
  • ArrayList 是不是Collection的实现类(能不能赋值给Collection类型的变量,也就是 “多态” 的校验)

而要做这两步校验,编译器必须先通过import找到Collection的完整定义,否则连 “Collection是不是合法类型” 都不知道,更没法校验后续的赋值是否合法了。

简单说:编译器要先 “认识”Collection,才能判断 “ArrayList能不能赋值给coll”,而 “认识”Collection的唯一方式(除了写完整类名)就是import

3. 不导入的话,还有一种 “笨办法”:写完整类名

如果你不想写import,也可以直接在代码里写类的完整路径,这样编译器也能识别,比如:

// 不写 import,直接用完整类名,编译器就能识别,不会报错
java.util.Collection coll = new java.util.ArrayList();

这种方式不用导入任何包,但写起来麻烦,所以大家平时都用import+ 简称的方式。