包的定义及使用
实际开发中,肯定一直存在包的概念,利用包可以实现类的包装,在以后实际开发中,所有的类必须放在包中。
包的定义
对于项目而言,不是一个人开发完成的,往往一个团队中会有2-3人进行项目业务的实现,此时必须面对问题:类的重名定义。
操作系统中,明确定义同一目录不允许存放相同的程序类文件,但开发中难以避免重名,则此时可以将程序文件放在不用目录下,而这个额目录称为包,目录==包
package cn.mldn.demo; //定义包,其中.表示分割子目录(子包)
一旦程序开发中有包,此时程序编译后的结果就必须将“x.class”文件保存在指定的目录中,但是手工简历非常麻烦,此时可进行打包编译处理。
java -d . Hello.java
- -d:表示生成目录
- “.”:表示在当前所在目录中生成程序类文件
程序执行时一定要带着包执行程序类java cn.mldn.demo.Hello
,从此之后完整的类名称是“包.类”。
包的导入
利用包的定义实际上可以将不同的功能的类保存在不用的包中,但是这些类彼此之间存在互相调用的关系,这时候需要使用import语句导入;
需要注意:public class 与class定义的区别?
- public class:类名称必须与文件名称保持一致,一个*.java文件中只允许有一个public class,如果要被其他包所使用的,那么这个类一定要定义为public;
- class:类名称可以与文件名称不一致,一个*.java文件中可以提供多个class定义,编译后形成不同的*.class文件,但是这些类只能够被本包访问,外包无法访问;
- 实际开发中往往在一个*.java源代码文件只会提供一个class程序类,而这个程序类一般使用public class定义;
- 程序类中的包名称必须采用小写字母形式定义,例如cn.mldn.utils
新的问题,有一个时候会使用某一个包中的很多类,这样分开进行导入很麻烦,因此可以使用“*”来处理。
import cn.mldn.demo.*;
即使使用包.*也不表示全部加载,会根据自己的需要加载所需要的程序类,而不不需要的程序类不会被加载。
但使用包.*进行导入是,那么会有一点麻烦:有可能两个不同的包中有相同的类名称,可能导致“对类的引用不明确”,此时使用时应写清完整名称(new cn.mldn.utils.Message())进行操作。
静态导入
假设一个类中全部方法都是static方法,那么按照原始方法要导入程序所在的"包.类"。而后通过类名称调用这些静态方法。
从JDK1.5开始对于类中全部由静态方法提供的特殊类是可以采用静态导入处理形式;
import static cn.mldn.utils.Mymath.*;
当使用了静态导入处理之后就好比该方法是直接定义在主类中的,可以由主方法直接调用。
生成jar文件(jar命令)
当项目完成后会存在大量*.class文件,那么对于这些文件的管理往往可以利用一种压缩结构的形式进行处理,这样的结果在Java中称为jar文件,使用jar命令完成;
- 定义一个程序类
- 对程序编译和打包:
- 对程序打包编译:javac -d . Message.java
- 此时形成cn包,包里有相应的子包与*.class文件,将其打包为mldn.jar: jar -cvf mldn.jar cn
- -c:创建一个新的jar文件;
- -v:得到详细输出;
- -f:设置生成的jar文件名称;
- 每一个*.jar文件都是一个独立的程序路径,如果要想在Java程序中使用此路径,必须通过CLASSPATH进行配置;
若程序编译通过后,但由于CLASSPATH发生了改变,类无法加载到了,则执行是会出现如下错误提示"Exception in thread “main” java.lang.NoClassDefFoundErroe:某类",出现这种错误只有一种情况,*.jar包没有配置正确。
系统常用包
Java发展至今提供有大量的支持类库,一般由两方面组成:
- Java自身提供的(除了JDK提供的类库之外还会有一些标准)
- 由第三方厂商提供的Java支持类库,完成各种所需的功能;
而在JDK中也会提供有大量的类库,封装在不用的开发包中
- java.lang:String、Number等类
- java.lang.reflect:反射机制处理包,所有的设计从此开始;
- java.util:实现工具类的定义,包括数据结构的定义;
- java.io:输入与输出流操作包;
- java.net:网络程序开发的程序包;
- java.sql:数据库编程开发包;
- java.applet:Java的最原始的使用形式,直接嵌套在网页上执行的程序类;
- java.awt,javax.swing:Java的图形界面开发包(GUI),其中awt属于重量级的组件,而swing属于轻量级的组件;
访问控制权限
面向对象的开发过程之中有三大主要特点:封装、继承、多态。那么对于封装性而言主要的实现依靠的就是访问的控制权限:private、default、protected、public
No | 访问范围 | private | default | protected | public |
---|---|---|---|---|---|
1 | 同一包中的同一类 | 可以 | 可以 | 可以 | 可以 |
2 | 同一包中的不同类 | 可以 | 可以 | 可以 | |
3 | 不同包的子类 | 可以 | 可以 | ||
4 | 不同包的所有类 | 可以 |
在整个访问控制权限的处理中,只有protected权限是比较新的概念,下面进行说明:
在程序中的封装一共有三个对应的访问权限:private、default、protected,但如果每次使用进行区分比较麻烦,参考:
- 只要进行属性的定义,全部使用private
- 只要进行方法的定义,全部使用public