持续更新中😬 加个关注,后续上新不错过~
一. 包
包是Java语言有效管理类的一个机制。不同Java源文件中可能出现名字相同的类,如果想区分这些类,就需要使用包名。包名的目的是有效地区分名字相同的类。不同Java源文件中的两个类名字相同时,它们可以通过隶属于不同的包来相互区分。
1. 包语句
通过关键字package声明包语句。package语句作为Java源文件的第一条语句,指明该源文件定义的类所在的包,即为该源文件中声明的类指定包名。package语句的一般格式为:
package 包名:
如果原程序中省略了package语句,源文件中所定义命名的类被隐含地认为是无名包的一部分,只要这些类的字节码被存放在相同的目录中,那么他们就属于同一个包,但是没有包名。
包名可以是一个合法的标识符,也可以是若干个标识符加 “.”分隔而成。例如:
package sunrise;
package sun.com.cn;
2. 有包名的类的存储目录
如果一个类有包名就不能在任意位置存放它,否则虚拟机将无法加载这样的类。
程序如果使用了包语句,例如:
package tom.jiafei;
那么存储文件的目录结构中必须包含如下的结构:…\tom\jiafei,例如 C:\1000\tom\jiafei,并且要将源文件编译得到的类的字节码文件保存在目录 C:\1000\tom\jiafei中(源文件可以任意存放)。
当然可以将源文件保存在 C:\1000\tom\jiafei中,然后进入 tom\jiafei的上一层目录1000中编译源文件;
C:\1000>javac tom\jiafei\源文件
那么得到的字节码文件默认地保存在当前目录C:\1000\tom\jiafei中。
3. 运行有包名的主类
如果主类的包名是 tom.jiafei,那么主类的字节码一定存放在…\tom\jiafei目录中,那么必须到tom\jiafei的上一层(即tom的父目录)目录中去运行主类。假设tom\jiafei的上一层目录是1000,那么,必须用如下格式来运行:
C:\1000>java tom.jiafei.主类名
即运行时,必须写主类的全名。因为使用了包名,主类全名是“包名.主类名”(就好像大连的全名是“中国.辽宁.大连”)。
注意:Java语言不允许用户程序使用Java作为包名的第一部分,例如 java.bird 是非法的包名(发生运行异常)
二. import包
一个类可能需要另一个类声明的对象作为自己的成员或方法中的局部变量,如果这两个类在同一个包中,当然没有问题。
但是,如果一个类想要使用的类和它不在一个包中,它怎样才能使用这样的类呢?这正是import语句要帮助完成的使命。
1. 引入类库中的类
在编写源文件时,除了自己编写类外,经常需要使用Java提供的许多类,这些类可能在不同的包中。在学习Java语言时,使用已经存在的类,避免一切从头做起,这是面向对象编程的一个重要方面。
为了能使用Java提供的类,可以使用import语句引入包中的类和接口。在一个Java源程序中可以有多个import语句,他们必须写在package语句和源文件中类的定义之间。Java提供了大约130多个包。
java.lang:包含所有的基本语言
java.io:包含所有的输入/输出类
java.util:包含实用类
java.sql:包含操作数据库的类
java.net:包含所有实现网络功能的类
import java.util.*;
表示引入java.util包中所有的类
import java.util.Date;
只是引入java.util包中的Date类
注意以下几点:
- java.lang包是Java语言的核心类库,它包含了运行Java程序必不可少的系统类,系统自动为程序引入java.lang包中的类(例如System类、Math类等),因此不需要再使用import语句引入该包中的类。
- 如果使用import语句引入了整个包中的类,那么可能会增加编译时间,但绝不会影响程序的性能。因为当程序执行时,只是将程序真正使用的类的字节码文件加载到内存。
- 如果没用import语句引入包中的类,那么也可以直接带着包名使用该类,例如:
java.util.Date date= new java.util.Date();
2. 引入自定义包中的类
用户程序也可以使用import语句导入非类库中由包名的类,例如:
import tom.jiafei.*;
都是无包名而且在同一个文件夹下的类就可以互相使用,无包名类也可以使用import语句来使用有包名的类。
但是有包名的类如论如何也无法使用无包名的类。
若有帮助的话,请点个赞吧!😊