java中的包
2016-01-02 10:42
489 查看
在实际开发中,往往需要开发很多不同的类,能否方便高效地组织这些类对项目的开发与使用具有很重要的意义。Java中提供包(Packege)将不同类组织起来进行管理,借助于包可以方便组织自己的类代码与别人提供的代码库分开管理。
使用包的目的之一就是在同一个项目中使用名称相同的类,假如两个开发人员不约而同地建立了两个相同名字的类,只要将其放置不同的包中,就不会产生冲突。
1.包的定义
要想将类放入指定的包中,就必须使用package语句,
package语句必须放在源文件的最前面,其之前不可以有任何其他语句。每个源文件中最多有一句package语句,因为一个类不可能属于两个包,就如同不能把一件衣服同时放进两个箱子一样。包名可以是用点“.”分隔的一个序列,如java.lang,这就表示此源文件中的类在java包下的lang子包中。
包的定义示例
//包定义的示例
package chapter03.sample3_21;
public class Sample3_21{
public static void main(String[] args)
{
System.out.println("我在chapter03.sample3_21!!!");
}
} 包实际上代表的是文件夹(目录路径)。有了包以后,将类文件放在不同的包中,方便管理,避免冲宊。如果不将编译后的class文件放到相应的文件夹中,则无法运行。
![](https://img-blog.csdn.net/20160102191022212?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
运行具体包中的类时要使用类名全称,就是包名与类名顺次用“.”隔开,如果没有使用全称类名,则系统报“java.lang.NoClassDefFoundError”异常
![](https://img-blog.csdn.net/20160102191103350?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
在运行程序时,要将当前目录设置为最外层的包文件夹所在的目录,而不是类文件所在目录,否则在有些情况运行可能报错,这取决于操作系统和机器的情况。另外,在开发中要注意不要把类文件随意复制到别的目录中,否则将可能引起程序不能正常运行。
![](https://img-blog.csdn.net/20160102191618878?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
如果没有在源文件中使用package语句,那么这个源文件中的类就被放置在一个匿名包中。匿名包是一个没有名字的包,代码编译后类文件与源文件在同一个目录即可。
2.类的导入
当一个类要使用与自己处在同一个包中的类时,直接访问即可。若要使用其他包中的类就必须使用import语句,基本语法如下
import<包名>.*;
import< 包名>.类名;
包名可以是一个由“.”分隔的序列,如“java.lang”、“java.util”等。
第一种语法表示要使用指定包中所有的类,但不包括子包中的类,也称为通配引入,“ * ”为通配符。
第二种语法表示要使用指定包中一个特定的类。
一个源文件中根据需要可以有多句import语句。import语句要放在package语句之后,类声明之前。
例子:
import java.util.*;
import java.io.InputStream;
多个import语句并不影响程序的运行性能。因为import语句只在编译的时候有作用。另外,java.lang包中的类,系统是自动引入的,相当于每个源文件中系统都会在编译时自动加入“import java.lang.* ”语句。
另外,需要特别注意的是,不能使用星号(*)代替包,例如下面使用的导入语句是非法的。
import java. * . *;
有“ * ”号代替所有包中的类就可以了,指定具体的类名岂不是很不方便?是的,如果只使用一个包中的类或多个包中不同名称的类确实如此,但若要使用多个包中的同名类就不行了,本小节分如下两个方面对这个问题进行介绍:两个包中有同名类,但只用到其中一个及其他不同名的类;两个名中且都要使用。
两个包中有同名类,但只用到其中一个及其他不同名的类
例如,java.util和java.sql包中都有名称为Data的类,在程序要同时使用这两个包中的其他很多类,但只有到java.util包中的Date类,代码如下
![](https://img-blog.csdn.net/20160102232758753?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
从上图可以看出,系统报Date类匹配失败,因为在源代码中用import语句引入了两个包中的所有类,两个包中都有Date类,系统不知道应该匹配哪一个。如果只用到java.util包中的Date类,可以将代码中的import部分修改成如下代码
import java.util.*
import java.util.Date;
import java.sql.*;
这时再编译,就不会报错了,因为编译时系统优先匹配import语句中明确给出类名的类。
两个包中有同名类,且都要使用
如果要使用两个不同包中的同名类,只靠import就无法解决了。例如
import java.util.*;
import java.util.Date;
import java.sql.*;
import java.sal.Date;
这样是打错特错的,系统会报具体指定名称的同名类只能引入一次的错误
正在解决问题的办法是在使用同名类的地方使用全称类名
<span style="font-size:14px;">package chapter03.sample3_24;
import java.util.*;
import java.sql.*;
class Sample7_2
{
public static void main(String[] args)
{
//使用java.util中的Date类
java.util.Date d1 = new java.util.Date();
//使用java.sql中的Date类
java.sql.Date d2 = new java.sql.Date(123);
}
}</span>
3.静态导入
从Java SE 5.0开始,导入语句不但可以导入类,还具有导入静态方法和静态成员变量的功能,不过需要在关键字“import”和包含之间添加关键字“static”,语法如下
import static <包名>.<类名>.*;
import static<包名>.<类名>.<具体方法/成员变量名> ;
“ * ”还是代表通配符,不过这里表示的是指定类下面的所有静态的方法和成员变量。如果要明确指明的方法或成员变量,用第二种语法。碰到不同类下同名静态方法或成员变量时,解决冲突的方法类似上一小节。
package chapter03.sample3_25;
//引入System类下面所有的静态成员,包括方法和成员变量
import static java.lang.System.*;
//引入Math类下的sqrt方法
import static java.lang.Math.sqrt;
public class Sample3_25{
public static void main(String[] args)
{
//调用println与sqrt方法时不需要像以前一样列出方法所在类的类名了
out.println("简单的打印功能");
out.println("25.25的平方根为:" + sqrt(25.25));
}
}
![](https://img-blog.csdn.net/20160103001935240?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
实际上,并没有很多开发人员采用静态引入,因为这种代码编写形式非常容易降低代码的可读性,造成维护困难。因此,在使用此项功能时一定要注意不影响代码的可读性,否则有害无益
使用包的目的之一就是在同一个项目中使用名称相同的类,假如两个开发人员不约而同地建立了两个相同名字的类,只要将其放置不同的包中,就不会产生冲突。
1.包的定义
要想将类放入指定的包中,就必须使用package语句,
package语句必须放在源文件的最前面,其之前不可以有任何其他语句。每个源文件中最多有一句package语句,因为一个类不可能属于两个包,就如同不能把一件衣服同时放进两个箱子一样。包名可以是用点“.”分隔的一个序列,如java.lang,这就表示此源文件中的类在java包下的lang子包中。
包的定义示例
//包定义的示例
package chapter03.sample3_21;
public class Sample3_21{
public static void main(String[] args)
{
System.out.println("我在chapter03.sample3_21!!!");
}
} 包实际上代表的是文件夹(目录路径)。有了包以后,将类文件放在不同的包中,方便管理,避免冲宊。如果不将编译后的class文件放到相应的文件夹中,则无法运行。
运行具体包中的类时要使用类名全称,就是包名与类名顺次用“.”隔开,如果没有使用全称类名,则系统报“java.lang.NoClassDefFoundError”异常
在运行程序时,要将当前目录设置为最外层的包文件夹所在的目录,而不是类文件所在目录,否则在有些情况运行可能报错,这取决于操作系统和机器的情况。另外,在开发中要注意不要把类文件随意复制到别的目录中,否则将可能引起程序不能正常运行。
如果没有在源文件中使用package语句,那么这个源文件中的类就被放置在一个匿名包中。匿名包是一个没有名字的包,代码编译后类文件与源文件在同一个目录即可。
2.类的导入
当一个类要使用与自己处在同一个包中的类时,直接访问即可。若要使用其他包中的类就必须使用import语句,基本语法如下
import<包名>.*;
import< 包名>.类名;
包名可以是一个由“.”分隔的序列,如“java.lang”、“java.util”等。
第一种语法表示要使用指定包中所有的类,但不包括子包中的类,也称为通配引入,“ * ”为通配符。
第二种语法表示要使用指定包中一个特定的类。
一个源文件中根据需要可以有多句import语句。import语句要放在package语句之后,类声明之前。
例子:
import java.util.*;
import java.io.InputStream;
多个import语句并不影响程序的运行性能。因为import语句只在编译的时候有作用。另外,java.lang包中的类,系统是自动引入的,相当于每个源文件中系统都会在编译时自动加入“import java.lang.* ”语句。
另外,需要特别注意的是,不能使用星号(*)代替包,例如下面使用的导入语句是非法的。
import java. * . *;
有“ * ”号代替所有包中的类就可以了,指定具体的类名岂不是很不方便?是的,如果只使用一个包中的类或多个包中不同名称的类确实如此,但若要使用多个包中的同名类就不行了,本小节分如下两个方面对这个问题进行介绍:两个包中有同名类,但只用到其中一个及其他不同名的类;两个名中且都要使用。
两个包中有同名类,但只用到其中一个及其他不同名的类
例如,java.util和java.sql包中都有名称为Data的类,在程序要同时使用这两个包中的其他很多类,但只有到java.util包中的Date类,代码如下
从上图可以看出,系统报Date类匹配失败,因为在源代码中用import语句引入了两个包中的所有类,两个包中都有Date类,系统不知道应该匹配哪一个。如果只用到java.util包中的Date类,可以将代码中的import部分修改成如下代码
import java.util.*
import java.util.Date;
import java.sql.*;
这时再编译,就不会报错了,因为编译时系统优先匹配import语句中明确给出类名的类。
两个包中有同名类,且都要使用
如果要使用两个不同包中的同名类,只靠import就无法解决了。例如
import java.util.*;
import java.util.Date;
import java.sql.*;
import java.sal.Date;
这样是打错特错的,系统会报具体指定名称的同名类只能引入一次的错误
正在解决问题的办法是在使用同名类的地方使用全称类名
<span style="font-size:14px;">package chapter03.sample3_24;
import java.util.*;
import java.sql.*;
class Sample7_2
{
public static void main(String[] args)
{
//使用java.util中的Date类
java.util.Date d1 = new java.util.Date();
//使用java.sql中的Date类
java.sql.Date d2 = new java.sql.Date(123);
}
}</span>
3.静态导入
从Java SE 5.0开始,导入语句不但可以导入类,还具有导入静态方法和静态成员变量的功能,不过需要在关键字“import”和包含之间添加关键字“static”,语法如下
import static <包名>.<类名>.*;
import static<包名>.<类名>.<具体方法/成员变量名> ;
“ * ”还是代表通配符,不过这里表示的是指定类下面的所有静态的方法和成员变量。如果要明确指明的方法或成员变量,用第二种语法。碰到不同类下同名静态方法或成员变量时,解决冲突的方法类似上一小节。
package chapter03.sample3_25;
//引入System类下面所有的静态成员,包括方法和成员变量
import static java.lang.System.*;
//引入Math类下的sqrt方法
import static java.lang.Math.sqrt;
public class Sample3_25{
public static void main(String[] args)
{
//调用println与sqrt方法时不需要像以前一样列出方法所在类的类名了
out.println("简单的打印功能");
out.println("25.25的平方根为:" + sqrt(25.25));
}
}
实际上,并没有很多开发人员采用静态引入,因为这种代码编写形式非常容易降低代码的可读性,造成维护困难。因此,在使用此项功能时一定要注意不影响代码的可读性,否则有害无益
相关文章推荐
- spring04 数据库操作 spring+jdbc/hibernate 及其声明式事务处理
- (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
- spring03 AOP、各种通知、一/多个切面例子
- spring02 注解方式实现MVC、spring的继承、代理模式(静/动) :jdk动态代理,cglib动态代理
- spring01 环境搭建、控制反转、依赖注入、springIOC和DI实现MVC模式
- eclipse(ini)
- Eclipse下设置github开发环境
- JAVA坏境变量中的JAVA_HOME path classpath 的设置与作用
- java语言jdk下载、安装,环境变量的搭载
- 使用Java开发自动化检测域名是否可注册工具 推荐
- JSTL标签,EL表达式,OGNL表达式,struts2标签 汇总
- 三杯水问题 算法分析、设计与实现(Java)
- Flexigrid的使用(整合Struts2)
- JAVA访问控制变量、类变量、类方法
- 每天一点儿JAVA-向量的操作
- 总结eclipse中安装maven插件
- java学习—day_1
- Java语言基础知识
- 《Java虚拟机原理图解》1.3、class文件里的訪问标志、类索引、父类索引、接口索引集合
- java封装