共道人间惆怅事,不知今夕是何年。 – 《周秦行纪》
关卡说明
关卡描述:不知你是否还记得上一篇中的代码,前面的两行,这是在 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 的用途,希望通过本篇,你能知道代码中前面的那些代码有什么作用,也能在之后的代码编写中知道如何去正确使用它们。