Java 17 package 包
思维导图
package 在 Java 中就是包的意思, 为什么会出现这个知识点, 主要的原因是因为避免类的重复。
任何真实的项目都会有对应的项目名以及开发过程中需要用到的类文件(对于 Java 来说),这些一个一个业务功能的封装成了一个又一个的项目基石。 但是对于类来说, 操作文件可能都叫做 FileUtils.java 也可能所有的主函数都叫做 Application.java。但又怎么能区分这个类是谁写的, 而不会因为类名一样调用的时候不知道应该是使用谁呢?
成百万的开发人员都写 Hello World 程序, 类名都叫做 Hello.java 怎么区分?
既然张三写 Hello.java, 李四也写 Hello.java,那我让你们前面加上你们的标识, 张三.Hello.java 和 李四.Hello.java。这样就可以区分是张三还是李四写的了。 但是张三和李四也有可能重复, 怎么保证这个不重复呢, 在定义 package 的时候一般使用域名的反向编写。 比方说, 你有一个域名 xymiao.com。你的包就可以使用 com.xymiao 进行填写。 可以看现在以后的开源程序大多都是用这个方式进行命名的。这个在其他的语言中也有叫做命名空间的,比方说 .net 体系。 这就是包的机制的由来。
基本上现有的语言都是从一代又一代的迭代而来的,跟得上时代的语言都在一代有一代的版本中加入了新的特性。 那些没有跟上步伐的, 也都被企业开发所放弃, 注意这里是企业放弃, 并不是说那些已经被淘汰的语言就不能学习和使用了。 每个语言都有其特点和思想。 主要的学习语法的同时也要学习思想。
package 格式
package 包名;
package 只能定义在最上层。也就是 calss 之前。
在编译的时候, 会生成 package 的目录 xymiao ,并且把 .class 的文件放到 xymiao 目录中。
在上面的 javac 命令前面详细的讲解了使用方法。 这里直接使用 -d .其中的“.” 代表了当前目录。
从这可以看出来, 对于 package 就是和文件系统中有相同层次的目录结构。
对于执行来说, 有了 package 之后, 就需要理解 classpath 这个知识点。 因为所有的第三方的 jar ,以及自己后续开发中使用的目录结构, 以及当前的开发工具,在进行编译 Java 的时候都是依靠 package 和 classpath 来结合使用。从这个教程之后, 就不需要再使用富文本编辑器, 使用 javac 和 java 进行编译源代码, 可以考虑使用新的更加智能的 IDE 了。
当前章还最好使用手动编译的过程。 这样更容易理解这个构建的过程。易于后续的知识点学习。
如何使用
既然上面生成了 .class 文件, 对于其他的类文件如何使用这个类呢? 这个时候就需要用到 import 关键字了。导入的概念。 import 的让你可以不写代码, 也能生成任何想开发的程序, 只要面向 github 就好了。
import 格式:
import 包名.类名;import 包名.*;
如果对于只想使用一个类文件引用,可以直接指定类名, 如果想引入该包下的所有类, 就可以使用 .* 的方法。
忽略上面的红色波浪, 因为对于 package 有一个语法检测, package 和 目录不一致会有一个错误提醒, 忽略即可。
一般情况下, 一个项目的目录架构基础就是 项目目录下, 包含一个 src 和 对应的 classes。
对于目录有一个目录结构。 这个是学习过程中不使用构建工具的目录结构。 如果是构建工具有一个固定的目录结构。 这个后续用到构建工具的时候, 再详细分析。我们根据上面的目录结构怎么进行编译运行和代码整理。
定义项目名:mzpdemo
目录结构如下:
在 src/xymiao/ 的目录下新建文件: Demo18Package.java 代码如下:
package xymiao;public class Demo18Package { private String hello= "xymiao"; public String getHello(){ return this.hello; } public static void main(String[] args) { Demo18Package demo18Package = new Demo18Package(); System.out.println(demo18Package.getHello()); }}
然后编译, 这里编译就需要注意了。 因为我们新定义了项目的目录结构。 所以要根据定义的目录结构进行处理。
首先要把 class 文件编译到 classes 中,打开 powershell 并指定编译的目录。
javac -d ./classes src/xymiao/Demo18Package.java
编译之后, 在 mzpdemo/classes/xymiao/Demo18Package.class 就存在编译的字节码文件了。
运行的时候, 就需要指定 class 的路径, 使用 java -cp 指定一个 classpath:
java -cp ./classes xymiao/Demo18Package
效果如下:
对于这个结构要多做尝试和链接, 出现问题也没有关系。 多尝试才能理解里面圈圈绕绕。
除了在 package 下方使用 import 的引用的方式, 还可以显式的指定package,例如:
xymiao.Demo18Package d = new xymiao.Demo18Package();//xymiao 是 package 。
静态引入 package
从 Java 1.5 之后引入了静态引入的概念。主要是用于导入指定类的某个静态成员变量、方法或者是所有的静态成员变量、方法。
对于静态引入。 格式如下:
import static packageName.className.*;import static packageName.className.[静态成员变量 | 静态方法]
实例如下:
上面演示的代码, 其中全部引用的方式:
import static xymiao.Demo19ImportStatic.*;
可以替换成:
import static xymiao.Demo19ImportStatic.sayHi;
现在可以考虑一个问题,就是在集成开发环境(IDE)中,是如何进行编译的呢。 不管是 Eclipse 和 Idea,都会有配置 JDK 的 Home 问题, 要让 IDE 知道 JDK 在那, 用的那个版本。 然后需要知道编译的文件是什么字符集。 对于 Eclipse 还是默认 GBK, Idea 已经是使用 UTF-8 作为默认值。 并且会有编译目录。 编译目录, 一般是由“项目目录” + "输出目录" + 编译的 class 类, 组合而成。 自己写个简单的编译器? 先关注我吧。 后续到窗口知识点的时候, 可以来做个简单的编译工具。
Java17 的 package 目录结构
因为从 Java 9 开始就进行了模块化。 所以针对 package 目录之上又多了一层模块化分层。
模块 java.base 的 package 包含。
这只是演示让你看到 Java JDK 的 package 的目录结构,多理解他们这样定义的原因和优缺点。
还有一个知识点就是对于 java.lang 包的内容不需要显式的 import。运行期会自动加载该包下的所有类。
package 知识先到这了, 还有什么有遗漏的吗? 评论让我继续学习完善一下该文档吧。
点赞 + 关注 + 收藏, 我是苗子说全栈之 Java。 感谢你的阅读。
每篇一句:健身和读书,是世界上成本最低的升值方式;而懒,是你通往牛逼的路上最大的敌人。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/132918.html