包的定义
共识:同一个目录下不允许存在同名文件。但是在实际的开发之中又不可能出现不重名的情况,为此,在项目里往往会引入包的定义,包就是一个文件夹,也就是说不同的目录中可以存放相同的文件。
Java中使用package关键字定义包。
范例:定义包
一旦声明了包,就必须将*.class文件保存在包里面,包不是手工定义的,Java专门提供了打包编译操作;
范例:打包编译
此时如果程序有包了,那么解释程序的时候必须加上包名称,也就是说此时的Hello类要执行就必须输入:
所有的Java项目开发过程之中,程序类必须要有包的定义才可以使用,没有包的类不存在。而类的完整名称“包.类”。
包的导入
利用程序包可以将一个很多的*.class类归类保存起来,但是这样一来有可能出现包与包之间进行类的互相调用问题,所以此时就可以利用import语句来解决。
范例:定义一个cn.mldn.util.Message的类
package cn.mldn.util;
class Message {
public String getInfo(){
return "www.mldn.cn";
}
}
范例:定义一个cd.mldn.test.TestMessage类
package cd.mldn.test;
import cn.mldn.util.Message;
public class TestMessage {
public static void main(String args[]){
Message msg = new Message();
System.out.println(msg.getInfo());
}
}
之所以造成此问题,是因为此时的Message类的定义中使用的是默认的访问控制权限,这个访问控制权限的特点是,同一包中的类可以互相访问,但是不能被外部包所访问,所以在学习完包之后,对代码有如下规范化要求:以后的类都要求写在包中,而且包中的*.ava文件里面只会有一个public class声明。
总结:关于public class与class声明的区别
-
publicclass定义要求文件名称与类名保持一致,而在*.java文件中只允许有一个public class定义,如果该类要被不同的包使用,则必须使用public class声明;
-
class定义的类文件名称可以与类名称不一致,但是在编译之后每一个class声明的类都会产生一个*.class文件,此类只能够在一个包中使用。
范例:修改Message类的定义package cn.mldn.util;
public class Message {
public String getInfo(){
return “www.mldn.cn”;
}
}
多个程序编译的时候要考虑编译顺序,可以进行自动顺序编译:
现在代码出现了两个问题: -
问题一:每次都是导入特定的类,在进行导入的时候都要写上完整的类名称,要导入一个包中的多个类可以使用通配符“”完成。
使用“import 包.”的情况并不会将一个包中的所有类都导入进来,包括所谓的类加载实际上只会加载所需要的类。 -
问题二:有可能在同一个程序中导入不同的包,但是这不同的包有相同的类。
为了避免使用冲突,建议在操作类的时候直接写上类的完整名称。
范例:使用完整名称避免错误
这种情况在开发之中一定会出现许多次,所以用的时候就写上完整名称。
编写顺序:package、import、publicclass。
系统常见包
Java开发类库非常的庞大,而且开发包也非常的多,比较常见的几个包如下:
- java.lang:像Object、String、Integer、Number都是定义在这个包中定义的,从JDK1.1开始自动导入;
- java.lang.reflect:反射开发包,直接与框架开发有关系;
- java.util:Java的工具包;
- java.util.regex:正则表达式的开发包;
- java.text:国际化程序支持包;
- java.io:数据流的开发包(Input、Output),前提:抽象类;
- java.net:网络编程包;
- java.sql:数据库的编程包;
- java.awl、javax.swing:图形界面开发;
- 在JDK1.0的时候只提供有java.awt的开发包,这个开发包可以实现图形界面的开发,但最初的设计有点仓促,要大量的使用windows的系统函数;
- 在JDK1.2(Java2)推出了轻量级的组件有了swing开发组件;
- java.applet.*:是在网页上嵌入的java程序,是Java发展的标记;
jar命令
项目完成之后,不同功能的类要保存在不同的包里,此时会有一个问题:往往有可能是若干个*.class文件完成某一特定的功能组合,那么如果更新也只会更新这几个文件,所以在实际的项目中为了方便管理,往往会利用jar文件负责处理。
范例:假设有一个Message.java类
package cn.mldn.util;
public class Message {
public String getInfo(){
return "www.mldn.cn";
}
}
- 进行打包编译:javac -d . Message.java;
- 将开发包打成my.jar文件:jar -cvf my.jar cn;
打成的my.jar文件可以通过rar压缩文件打开,而后在这个文件里面会存在有一个文件夹:META-INF/MANIFEST.MF。(记录了jar文件的相关说明) - 当程序打包完成之后肯定需要进行代码的执行,肯定需要编写测试类;
实际上每一个jar文件都是一个独立的路径,所以要想让jar文件起作用,必须配置CLASSPATH,但是CLASSPATH文件中有一个“.”,所以如果要配置多个CLASSPATH使用“;”分割。
以上的配置只能够在当前命令行中使用,如果要想让其成为全局的配置,则需要修改环境属性
如果现在只使用记事本开发程序,那么所有需要的第三方的*.jar文件都必须在此处配置。