共道人间惆怅事,不知今夕是何年。 – 《周秦行纪》

关卡说明

关卡描述:不知你是否还记得上一篇中的代码,前面的两行,这是在Java中特定的格式,想要知道它们是什么含义吗?通过本关你就能获得答案。

过关条件:理解Java中package与import的作用以及如何使用它们

关卡难度:⭐️

什么是package

现在再来回顾一下我们上一篇中的代码,首先我们创建了一个类,叫做SimpleCalculator,文件名叫做SimpleCalculator.java。

在最开头有这么一行:

1
package hello;

第一行会声明这个类所在的包名,因为这个类文件是在hello包下的,所以第一行的含义就是表明这个类的位置。

为什么要使用package

聪明的你也许会想到,同一个包下面应该不允许存在两个相同的文件名,也就是不允许存在相同的类名。确实如此,这也是package的一个很重要的作用,为类提供一个类似命名空间的管理,避免同名的类产生冲突。

试想一下,如果没有package,所有类都在同一个地方,那就要争先恐后的使用类名了。

package的另一个作用便是用来将Java文件进行分类管理,比如有同一种用处的类放到同一个包下,方便查找和管理。

package命名规范

虽然理论上来说,你可以随心所欲、为所欲为的命名你项目中的包,但还是建议你遵循一定的规范,因为如果大家都遵循规范来设计的话,会减少很多交流成本。

package的命名一般分为几个部分,身份标识.开发者名/团队名/公司名.项目名.模块名,对于身份标识,主要是用来标识是个人开发还是团队开发,个人开发主要使用的标识有:indi(个体项目)、onem(单人项目)、pers(个人项目)、priv(私有项目),团队开发主要使用的标识有:team(团队项目)、com(公司项目)。

但其实没有特殊要求的话,使用域名倒写是最常见的,因为域名是不会重复的。

所以比较常见的命名类似于:com.frank.hello.controller,frank是我的英文名,(假装)frank.com是我的域名,hello是项目名,controller则代表这个包下面我会放控制器。(先不用纠结控制器是什么)

所以,如果还没有英文名的话,赶紧给自己找一个吧。你也许会问,如果有人用了跟自己一样的英文名怎么办?

没有关系,反正极大概率上来说,你又不会使用他的包,即使真遇上了,还是有解决办法的,改改项目名,改改包名,不就ok了。

使用package的注意事项

  1. package必须是程序中可执行的第一行代码
  2. package语句只能有一句,且语句后面有分号
  3. package命名要求包含的所有字符均为小写,同时不能有特殊字符
  4. package可以有多层,每一层有.隔开,例如:package com.frank.hello;(com是一个文件夹,frank是com下的一个文件夹,hello是frank文件夹下的一个文件夹)
  5. 包的路径符合所开发的系统模块的定义
  6. 如果定义类的时候没有使用package,那么java就认为我们所定义的类位于默认包里面(java.lang)。

import的作用

在之前的SimpleCalculator类中,我们还看到了这么一句代码:

1
import java.util.Scanner;

那么import又是做什么用的呢?

import是在java文件开头的地方,先说明会用到那些类所在的全路径名,这样我们就能在代码中使用对应的类名,而不是使用全路径。

开发中需要引用到其他包下的类,比如JDK中一些常用的类,那么就需要先使用import告诉编译器我们要引用的类的位置,比如说这里的Scanner。那么你也许会注意到,代码中不是有System吗,是怎么回事呢?为什么不用引入System所在的包呢?

这是一个很好的问题。原因是java.lang这个包实在是太常用了,所以默认可以不用写,编译器会自动引入,编译器只要看到没有使用import引入包名的类,就会去java.lang中找。

那如果要引入一个包下所有类该怎么办呢?

有时候需要用到的类刚好有有多在同一个包下面,一个一个引入,显然太费事,别着急,还有更好的解决办法,可以使用*来匹配所有,比如说:

1
import java.util.*

那么就会引入java.util包下的所有类。

也许你会觉得,那都使用*的方式不就好了。如果这样想,那就大错特错了,包的存在就是为了减少类名冲突,这样每次都使用*将大量类引入的话,会更容易产生类名冲突,那就适得其反了。

本篇讲解了package和import的用途,希望通过本篇,你能知道代码中前面的那些代码有什么作用,也能在之后的代码编写中知道如何去正确使用它们。