包的概念及使用
一. 包的基本概念
可以试想这样一个场景,现在如果有多个人开发一个共同项目,则肯定会出现类名称相同的情况,这样一来就会比较麻烦,所以利用package关键字来解决此问题。
包实际上是一个文件夹,在需要定义多个类或者接口时,为了避免名称重复而采用的一种措施,如果使用直接在程序中加入package关键字即可。
下面使用package关键字进行一个程序的打包
【代码】
package org.zhao.demo08;//定义一个包
class Demo
{
public String getInfo(){
return "Hello World";
}
}
public class PackageDemo01
{
public static void main(String args[]){
System.out.println(new Demo().getInfo());
}
}
以上程序功能为输出一个语句,但是因为程序在包里,所以编译时必须如下:
javac -d . PackageDemo01.java
在上面的编译命令中加入了下面的参数:
*-d:表示生成目录,生成的目录以package的定义标准。
.:表示在当前所在的文件夹中生成*
编译完成后可以再相应的目录下找到,执行时:
必须输入完整的“包.类名称”
java org.zhao.demo08.PackageDemo01
运行结果:
Hello World
程序的运行结果与之前并没有什么不同,所以加入包不过是为了让类的管理更加方便。
二. import语句
上例中的两个类是在同一包中的,因此代码之前没有什么根本的不同,但是如果几个类放在不同的包中,则在使用不同包的类时必须通过import语句导入,import格式:
***import 包名称.子包名称.类名称;—-》手动导入所需要的类
import 包名称.子包名称.; —》由JVM自动加载所需要的类**
以上两种格式本身没有多大区别,只是一般都比较习惯于使用后者。
实例:
定义org.zhao.demo08.a.Demo类
package org.zhao.demo08.a;
class Demo
{
public String getInfo(){
return "Hello World";
}
}
定义另外一个引用的类:
package org.zhao.demo08.b;
import org.zhao.demo08.a.Demo;
public class PackageDemo01
{
public static void main(String args[]){
System.out.println(new Demo().getInfo());
}
}
以上程序中要先使用Demo类,因此先进行编译Demo类,然后编译引用类:
但是在编译引用类的时候会出现错误:
ImportDemo01.java:3: 错误: 类PackageDemo01是公共的, 应在名为 PackageDemo01.java 的文件中声明
public class PackageDemo01
^
ImportDemo01.java:2: 错误: Demo在org.zhao.demo08.a中不是公共的; 无法从外部程序包中对其进行访问
import org.zhao.demo08.a.Demo;
^
ImportDemo01.java:6: 错误: 找不到符号
System.out.println(new Demo().getInfo());
^
符号: 类 Demo
位置: 类 PackageDemo01
3 个错误
从提示可以发现Demo类不是public定义的,所以在ImportDemo01是无法进行访问。
修改Demo类:
package org.zhao.demo08.a;
public class Demo
{
public String getInfo(){
return "Hello World";
}
}
再次编译运行结果:
Hello World
如果要在一个类中导入一个包中多个类,可以使用导入方式的第二种。
需要注意的是,当要导入两个包中相同名称的类时,最好的做法就是在声明类的对象时写上完整的“包.类名称”,一面发生歧义而编译错误。
三. Java新特性—静态导入
在jdk1.5之后提供了静态导入功能。如果一个类中的方法全部是使用static声明的静态方法,则在导入时就可以直接使用import static 的方式导入,导入的格式如下:
【静态导入】
import static 包.类.*;
下面介绍静态导入:
定义一个类,全部由静态方法组成:
package org.zhao.demo08.e;
public class Operate
{
public static int add(int i,int j){
return i+j;
};
public static int sub(int i,int j){
return i-j;
};
public static int mul(int i,int j){
return i*j;
};
public static int div(int i,int j){
return i/j;
};
}
以上代码的类中的全部方法为static类型,所以在导入时就可以使用静态导入的方式。
【静态导入】
package org.zhao.demo08.f;
import static org.zhao.demo08.e.Operate.*;
public class StaticImportDemo
{
public static void main(String args[]){
System.out.println("3+3="+add(3,3));
System.out.println("3-3="+sub(3,3));
System.out.println("3*3="+mul(3,3));
System.out.println("3/3="+div(3,3));
}
}
运行结果:
3+3=6
3-3=0
3*3=9
3/3=1
以上程序中使用了静态导入,所以Operate类中的所有静态方法可以直接在StaticImportDemo类中使用,而不再需要使用“类.静态方法()”的形式调用。