JavaSE_5th_package和import语句

来源:互联网 发布:archlinux网络配置 编辑:程序博客网 时间:2024/05/16 06:49
package和import语句
为方便管理大型软件系统中数目众多的类,解决类的命名冲突问题,Java引入
包(package)机制,提供类的多重命名空间。

一、package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。
(若缺省该语句,则指定为无名包)。
它的格式为:
package pkg1[.pkg2[.pkg3...]];

Java编译器把包对应于文件系统的目录管理,package语句中,用‘.’来指明包(目录)的层次,例如使用语句package com.hpe
则该文件中所有的类位于.\com\hpe目录下
如Cat.java这个例子:
package com.hpepublic class Cat {}
就把Cat这个类打包到了com.hpe这个包中。

其中package com.hpe这一行是Eclipse自动为我生成的,这是因为我在工程
下建包的时候,是这样做的:
在Eclipse中,新建package,包名可为:xxx(如:com)
这样Eclipse会在工程目录下自动建立xxx文件夹。
如果有多级目录,可命名为:xxx.yyy.zzz. ...(如:com.hpe.mine)
这样Eclipse会在工程目录下自动建立\xxx\yyy\zzz\...目录树

在该包下新建Cat.java,Cat.java文件将被置于该包的底层目录,
Cat.java文件中所有的类都被打包到该包中。

如果是直接在磁盘上新建Cat.java,采用记事本等简单编辑器来编写Cat.java,那么需要手动构建com\hpe\目录树,并在hpe目录下新建Cat.java

这里采用Eclipse来写Cat.java
package com.hpepublic class Cat {}
然后在包的父目录下建Dog.java
public class Dog {public static void main(String[] args) {Cat c = new Cat();}}
编译会出错,因为无法解析Cat这个符号,其实就是找不到Cat这个类,
但我们同样在包的父目录下建Bird.java
public class Bird {}
再将Dog.java修改如下:
public class Dog {public static void main(String[] args) {Bird b = new Bird();}}
编译却通过了,说明Bird这个类编译器是找得到的,而找不到Cat类是因为
Cat这个类被打包在了com.hpe这个包中,我们需要通过这个包来找到Cat类,
将Dog.java修改如下:
public class Dog {public static void main(String[] args) {com.hpe.Cat c = new com.hpe.Cat();}}
总结:
1. 如果要把一个类放在包里面,在这个类源文件第一句话写package,后面跟上包名。
2. 对于用记事本写java文件、命令行编译java文件的情况,编译出来的class文件必须位
    于正确的目录下面(即和包的层次完全一致)。
3. 如果要在另一个类中使用包里面的这个类,必须把包名和类名写全。

4. 但如果包名很长,就不便于我们使用,可以使用import语句来引入包里面的类。


关于import语句:

例如修改Dog.java如下:
import com.hpe.Cat;public class Dog {public static void main(String[] args) {Cat c = new Cat();}}
编译通过。
这里在Dog.java文件中对com.hpe包中的Cat类进行了引入,因此在Dog.java中
可以直接使用Cat类。

或者修改为:import com.hpe.*;
表示将com.hpe包下所有的类都进行引入。

继续总结:
5. 一个类访问同一个包中的类不需要引入。
6. 对于用记事本写java文件、命令行编译java文件的情况,class文件的最上层包
   的父目录位于classpath目录下。
  (如D:\java\code\com\hpe\Cat.class,classpath是当前路径,如果命令行中的当前路径是D:\java,Dog.java在该目录下,即使Dog.java写了import com.hpe.Cat也没用,
  因为在D:\java目录下只找得到一个code目录,找不到com目录,因此只能将环境变量
  classpath中再加一句;D:\java\code),这也就是为什么Cat.class文件的最上层包
  com的父目录要位于classpath目录下。

在Eclipse中新建com.hpe2包,将Dog.java拖到该包中
package com.hpe2;import com.hpe.Cat;public class Dog {public static void main(String[] args) {Cat c = new Cat();}}
如果是在命令行中编译Dog.java,首先进入到Dog.java所在在的目录,然后执行javac Dog
然后将生成的Dog.class拖到./com/hpe2目录下。
在执行Dog.class时,不能只写java Dog来执行,要写全包名:java com.hpe2.Dog

最后的总结:
6. 对于用记事本写java文件、命令行编译java文件的情况,编译出来的class文件必须位

   于正确的目录下面(即和包的层次完全一致),而执行该类时要写全包名。


关于静态导入(了解)
1)可以导入到方法级别的导入
2)格式:
import static 包名....类名.方法名;
3)注意事项:
a、方法必须是静态的
b、如果多个类下有同名的方法,就不好区分了,还得加上前缀,所以一般不使用静态导入,但是一定要能够看懂。





0 0