所有的类必须放在包里
在Java程序中,包的主要作用是将不同功能的文件进行分割。
在之前的代码开发中,所有编译后的.*class文件都保存在同一个目录中,这样以来会带来一个问题:如果出现了同名文件,就会发生文件覆盖问题,因为同一个目录中不允许有同名文件。
而想解决同名文件冲突的问题,就必须设置不同的目录。
所谓的包实际上指的就是文件夹。
在Java中实用package来定义包,此语句必须写在文件的首行。
例如当一个Hello程序定义在了一个com.hello.world的包中,“.”表示子目录
当程序中出现了包的定义后,如果再编译程序,就必须使生成的Hello.class文件保存在指定的目录下(此时应该保存在com\hello\world目录下,与包名称结构相同)
打包编译:javac -d .Hello.java;
“-d” :生成目录,根据package的定义生成
“.” :设置保存的路径,如果为“.” 表示在当前所在路径生成
在解释程序的时候不要进入包里面,应该在包外输入类 的完整名称(包.类)
输入: java com.hello.world.Hello
包的导入
不同包之间进行访问,此时就需要包的导入,使用 import
在使用导入包之后,程序在逐个编译的时候有一个编译顺序的问题
即被导入的包要先进行编译
但是在大型开发中,一般会使用开发工具进行代码编写,这个顺序不用考虑
而且java提供了通配符“ * ”操作:javac -d . *.java 这样就会自动根据代码的调用顺序进行程序编译
进行外包访问的时候,只能访问public class
如果一个类没有使用public class声明,那么这个类只能在一个包中访问,而外包无法访问。
public class :文件名称必须与类名称保持一致,在一个*.class文件里面只能有一个public class 声明,如果一个类需要被外包访问,那么一定要定义为public class
class:文件名称可以与类名称不同,并且一个.java文件里面可以有多个class定义,编译后会形成多个 .class文件,如果一个类使用的是class定义,那么表示这个类只能被本包访问。
在实际的开发中,绝大多数情况只会在一个 *.java文件里面定义一个类,并且类的声明绝大多数使用的都是public class完成的
导入包中的多个类,使用 import com.hello.world.* 简化导入操作
在这个操作中不用考虑性能的问题,和普通导入是一样的
不同包里面的同名类问题
既然有导入包的操作,那么不同的包里面很有可能有同名类
在发生类名称冲突时一定要写生类的完整名称,即 包名.类名
jar命令
任何一个项目里一定会存在大量的 .class 文件,如果将这些 .class 文件直接交给用户使用,就会造成文件过多,并且会导致程序没有结构。所以在交付用户使用之前,会使用jar命令针对 *.class 文件进行压缩,最终交付用户使用的往往是Java归档(JavaArchive,jar)文件。
jar操作往往使用3个参数
-c :创建一个新的文件
-v :生成标准的压缩信息
-f :由用户自己指定一个 *.jar文件名称
定义完程序类后,打包编译此文件。此后会形成“包.类” 的形式,随后假设这里边有很多的 *.class 文件,并且要交付用户使用,那么将这个包的代码压缩,输入:
“ jar -cvf my.jar com ”,这样就会将生成的com目录(包的根名称)打包成一个压缩的jar文件。生成的my.jar文件不能直接使用,必须配置CLASSPATH才可以被其他程序类加载
SET CLASSPATH = .;E:\mydemo.jar (这个是在命令行中配置,也可以在环境变量中配置)