共道人间惆怅事,不知今夕是何年。 – 《周秦行纪》
关卡说明
关卡描述:不知你是否还记得上一篇中的代码,前面的两行,这是在 Java
中特定的格式,想要知道它们是什么含义吗?通过本关你就能获得答案。
过关条件:理解 Java
中 package
与 import
的作用以及如何使用它们
关卡难度:⭐️
什么是 package
现在再来回顾一下我们上一篇中的代码,首先我们创建了一个类,叫做 SimpleCalculator
,文件名叫做 SimpleCalculator.java
。
在最开头有这么一行:
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的注意事项
package
必须是程序中可执行的第一行代码package
语句只能有一句,且语句后面有分号package
命名要求包含的所有字符均为小写,同时不能有特殊字符package
可以有多层,每一层有.
隔开,例如:package com.frank.hello;
(com是一个文件夹,frank 是 com 下的一个文件夹,hello 是 frank 文件夹下的一个文件夹)- 包的路径符合所开发的系统模块的定义
- 如果定义类的时候没有使用 package*,那么 *java 就认为我们所定义的类位于默认包里面(java.lang)。
import的作用
在之前的 SimpleCalculator
类中,我们还看到了这么一句代码:
import java.util.Scanner;
那么 import
又是做什么用的呢?
import
是在 java 文件开头的地方,先说明会用到那些类所在的全路径名,这样我们就能在代码中使用对应的类名,而不是使用全路径。
开发中需要引用到其他包下的类,比如 JDK 中一些常用的类,那么就需要先使用 import 告诉编译器我们要引用的类的位置,比如说这里的 Scanner 。那么你也许会注意到,代码中不是有 System
吗,是怎么回事呢?为什么不用引入 System
所在的包呢?
这是一个很好的问题。原因是 java.lang 这个包实在是太常用了,所以默认可以不用写,编译器会自动引入,编译器只要看到没有使用 import
引入包名的类,就会去 java.lang 中找。
那如果要引入一个包下所有类该怎么办呢?
有时候需要用到的类刚好有有多在同一个包下面,一个一个引入,显然太费事,别着急,还有更好的解决办法,可以使用*
来匹配所有,比如说:
import java.util.*
那么就会引入java.util
包下的所有类。
也许你会觉得,那都使用*
的方式不就好了。如果这样想,那就大错特错了,包的存在就是为了减少类名冲突,这样每次都使用*
将大量类引入的话,会更容易产生类名冲突,那就适得其反了。
小结
本篇讲解了 package
和 import
的用途,希望通过本篇,你能知道代码中前面的那些代码有什么作用,也能在之后的代码编写中知道如何去正确使用它们。