欢迎光临
我们一直在努力

java-package,为什么使用带有Java import语句的通配符(星号)不好?

为了解决上述问题,Java 引入了包(package)机制,提供了类的多层命名空间。
用于解决类的命名冲突、类文件管理等问题。

包的 3 个作用如下:

区分相同名称的类。 能够较好地管理大量的类。 控制访问范围。

Java 中使用 package 语句定义包,package 语句应该放在源文件的第一行。
在每个源文件中只能有一个包定义语句,并且 package 语句适用于所有类型(类、接口、枚举和注释)的文件。
定义包语法格式如下:

package 包名;

Java 包的命名规则如下:

  1. 包名全部由小写字母(多个单词也全部小写)。
  2. 如果包名包含多个层次,每个层次用“.”分割。
  3. 包名一般由倒置的域名开头,比如 com.baidu,不要有 www。
  4. 自定义包不能 java 开头。

包导入

如果使用不同包中的其它类,需要使用该类的全名(包名+类名)。代码如下:

example.Test test = new example.Test();

其中,example 是包名,Test 是包中的类名,test 是类的对象。

为了简化编程,Java 引入了 import 关键字,import 可以向某个 Java 文件中导入指定包层次下的某个类或全部类。import 语句位于 package 语句之后,类定义之前。一个 Java 源文件只能包含一个 package 语句,但可以包含多个 import 语句。

使用 import 导入单个类的语法格式如下:

import 包名+类名;

上面语句用于直接导入指定类,例如导入前面的 example.Test 类,代码如下:

import example.Test;

使用 import 语句导入指定包下全部类的用法按如下:

import example.*;

上面 import 语句中的星号(*)只能代表类,不能代表包,表明导入 example 包下的所有类。

提示:使用星号(*)可能会增加编译时间,特别是引入多个大包时,所以明确的导入你想要用到的类是一个好方法,需要注意的是使用星号对运行时间和类的大小没有影响。

通过使用 import 语句可以简化编程,但 import 语句并不是必需的,如果在类里使用其它类的全名,可以不使用 import 语句。

Java 默认为所有源文件导入 java.lang 包下的所有类,因此前面在 Java 程序中使用 String、System 类时都无须使用 import 语句来导入这些类。但对于前面介绍数组时提到的 Arrays 类,其位于 java.util 包下,则必须使用 import 语句来导入该类。

在一些极端的情况下,import 语句也帮不了我们,此时只能在源文件中使用类全名。例如,需要在程序中使用 java.sql 包下的类,也需要使用 java.util 包下的类,则可以使用如下两行 import 语句:

import java.util.*;
import java.sql.*;

如果接下来在程序中需要使用 Date 类,则会引起如下编译错误:

Test.java:25:对Date的引用不明确,
java.sql中的类java.sql.Date和java.util中的类java.util.Date都匹配

上面错误提示:在 Test.java 文件的第 25 行使用了 Date 类,而 import 语句导入的 java.sql 和 java.util 包下都包含了 Date 类,系统不知道使用哪个包下的 Date 类。在这种情况下,如果需要指定包下的 Date 类,则只能使用该类的全名,代码如下:

// 为了让引用更加明确,即使使用了 import 语句,也还是需要使用类的全名
java.sql.Date d = new java.sql.Date();

优缺点:

使用单个语句更方便,更清晰

import java.awt.*;

而不是导入一堆个别类

import java.awt.Panel;
import java.awt.Graphics;
import java.awt.Canvas;
...

在import语句中使用通配符(星号)有什么问题?

唯一的问题是它使你的本地命名空间变得混乱。

例如,假设您正在编写Swing应用程序,因此需要java.awt.Event,并且还要与公司的日历系统连接,该系统具有com.mycompany.calendar.Event。

如果使用通配符方法导入两者,则会发生以下三种情况之一:您在java.awt.Event和com.mycompany.calendar.Event之间存在完全的命名冲突,因此您甚至无法编译。

你实际上只管理导入一个(两个导入中只有一个导入.*),但这是错误的,你很难找出你的代码声称类型错误的原因。编译代码时没有com.mycompany.calendar.Event,但是当它们稍后添加一个时,您之前有效的代码会突然停止编译。

显式列出所有导入的优点是,我可以一目了然地告诉您要使用哪个类,这使得阅读代码变得更加容易。如果你只是做一个快速的一次性事情,没有明显的错误,但未来的维护者将感谢你的清晰度。

赞(0)
版权归原作者所有,如有侵权请告知。达维营-前端网 » java-package,为什么使用带有Java import语句的通配符(星号)不好?

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址