java中package是什么,怎么使用呢?不知道的小伙伴来看看小编今天的分享吧!
1、package简介:
Java中package是包,为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。
2、作用:
把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
3、补充说明:
package也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。Java使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。
4、语法格式:
package pkg1[.pkg2[.pkg3…]];
例如,一个Something.java 文件它的内容
package net.java.util;public class Something{ ...}
那么它的路径应该是net/java/util/Something.java这样保存的。 package(包) 的作用是把不同的 java 程序分类保存,更方便的被其他 java 程序调用。
5、使用:
一个包(package)可以定义为一组相互联系的类型(类、接口、枚举和注释),为这些类型提供访问保护和命名空间管理的功能。
以下是一些Java 中的包:
java.lang-打包基础的类
java.io-包含输入输出功能的函数
开发者可以自己把一组类和接口等打包,并定义自己的包。而且在实际开发中这样做是值得提倡的,当你自己完成类的实现之后,将相关的类分组,可以让其他的编程者更容易地确定哪些类、接口、枚举和注释等是相关的。
由于包创建了新的命名空间(namespace),所以不会跟其他包中的任何名字产生命名冲突。使用包这种机制,更容易实现访问控制,并且让定位相关类更加简单。
创建包
创建包的时候,你需要为这个包取一个合适的名字。之后,如果其他的一个源文件包含了这个包提供的类、接口、枚举或者注释类型的时候,都必须将这个包的声明放在这个源文件的开头。
包声明应该在源文件的第一行,每个源文件只能有一个包声明,这个文件中的每个类型都应用于它。
如果一个源文件中没有使用包声明,那么其中的类,函数,枚举,注释等将被放在一个无名的包(unnamed package)中。
例子
让我们来看一个例子,这个例子创建了一个叫做animals的包。通常使用小写的字母来命名避免与类、接口名字的冲突。
在 animals 包中加入一个接口(interface):
Animal.java 文件代码:
/* 文件名: Animal.java */package animals; interface Animal { public void eat(); public void travel();}
接下来,在同一个包中加入该接口的实现:
MammalInt.java 文件代码:
package animals; /* 文件名 : MammalInt.java */public class MammalInt implements Animal{ public void eat(){ System.out.println("Mammal eats"); } public void travel(){ System.out.println("Mammal travels"); } public int noOfLegs(){ return 0; } public static void main(String args[]){ MammalInt m = new MammalInt(); m.eat(); m.travel(); }}
然后,编译这两个文件,并把他们放在一个叫做animals的子目录中。 用下面的命令来运行:
$ mkdir animals
$ cp Animal.class MammalInt.class animals
$ java animals/MammalIntMammal eatsMammal travel
以上就是小编今天的分享了,希望可以帮助到大家。
Java 17 package 包的使用
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。 感谢你的阅读。
每篇一句:健身和读书,是世界上成本最低的升值方式;而懒,是你通往牛逼的路上最大的敌人。