java中的package_JAVA中的PACKAGE机制——(好文转帖)

1,什么都别说,先跟着我来做一把

我们先找一个目录,比如C:\myjob

然后我们建立两个目录,一个叫做src,一个叫做bin

C:\myjob>md src

C:\myjob>md bin

C:\myjob>dir

驱动器 C 中的卷是 LIGHTNING

卷的序列号是 3DD1-83D9

C:\myjob 的目录

2005-12-25  14:33   

2005-12-25  14:33   

2005-12-25  14:34   

2005-12-25  14:34   

0 个文件              0 字节

4 个目录    305,123,328 可用字节

C:\myjob>

然后我们在src目录中去写程序

C:\myjob>cd src

C:\myjob\src>

我们写这么4个java文件

A.java

package com.lightning;

public class A{

{System.out.println("com.lightning.A");}

}

B.java

package com.lightning;

public class B{

{System.out.println("com.lightning.B");}

}

C.java

package com;

public class C{

{System.out.println("com.C");}

}

Test.java

package net.test;

import com.lightning.*;

import com.*;

public class Test{

public static void main(String[] args)

{

new A();new B();new C();

System.out.println("net.test.Test");

}

}

写好之后就是这样

C:\myjob\src>dir

驱动器 C 中的卷是 LIGHTNING

卷的序列号是 3DD1-83D9

C:\myjob\src 的目录

2005-12-25  14:34   

2005-12-25  14:34   

2005-12-25  14:39                86 A.java

2005-12-25  14:40                86 B.java

2005-12-25  14:42               194 Test.java

2005-12-25  14:43                68 C.java

4 个文件            434 字节

2 个目录    305,106,944 可用字节

然后我们建立com目录,com\lightning\目录,net\test\目录

C:\myjob\src>md com

C:\myjob\src>md com\lightning

C:\myjob\src>md net\test\

我们将Test.java放入net\test\中去

将A.java,B.java放入com\lightning\中去

将C.java放入com\中去

C:\myjob\src>move Test.java net\test\

C:\myjob\src>move A.java com\lightning\

C:\myjob\src>move B.java com\lightning\

C:\myjob\src>move C.java com\

然后我们在c:\myjobs中发令:

C:\myjob\src>cd ..

C:\myjob>javac -sourcepath src -d bin src\net\test\Test.java

然后我们看看bin目录中多了什么

C:\myjob>dir bin /s

驱动器 C 中的卷是 LIGHTNING

卷的

C:\myjob\bin 的目录

2005-12-25  14:34   

2005-12-25  14:34   

2005-12-25  14:46   

2005-12-25  14:46   

0 个文件              0 字节

C:\myjob\bin\net 的目录

2005-12-25  14:46   

2005-12-25  14:46   

2005-12-25  14:46   

0 个文件              0 字节

C:\myjob\bin\net\test 的目录

2005-12-25  14:46   

2005-12-25  14:46   

2005-12-25  14:46               520 Test.class

1 个文件            520 字节

C:\myjob\bin\com 的目录

2005-12-25  14:46   

2005-12-25  14:46   

2005-12-25  14:46   

2005-12-25  14:46               338 C.class

1 个文件            338 字节

C:\myjob\bin\com\lightning 的目录

2005-12-25  14:46   

2005-12-25  14:46   

2005-12-25  14:46               354 A.class

2005-12-25  14:46               354 B.class

2 个文件            708 字节

所列文件总数:

4 个文件          1,566

然后我们执行,同样在c:\myjobs\下发令

C:\myjob>java -cp bin net.test.Test

com.lightning.A

com.lightning.B

com.C

net.test.Test

2,从实践到理论

刚才我用一个非常简单但是非常完整的例子给大家演示了java的package机制。

为什么以前脑海里面那么简单的javac会搞得这么复杂呢?

实际上它本就这么复杂,

并不是一个.java,一行javac一个当前目录中的class这么简单。

首先我要打破一些东西,然后才好建立一些东西。

javac并非只是给一个.java编译一个class的。javac自带有make机制,也就是说,如果在

javac的参数中java文件使用到的任何类,javac首先会去找寻这个类的class文件存在与否

,如果不存在,就会在sourcepath中找寻源代码文件来编译。

什么是sourcepath呢?sourcepath是javac的一个参数,如果你不加指定,那么sourcepath

就是classpath。

比如我们装好jdk之后,我说过不要设定classpath环境变量,因为大部分人一旦设定了

classpath,不是多此一举把什么dt.jar放进去。(我可以好好打击你一下,告诉你一个可

悲的事实——jre永远不会从你这个classpath中去寻找dt.jar。你完全是徒劳的!)就是

把"."搞不见了,搞得是冷水一盆盆的往自己身上泼,脑袋一点点的涨大。

不要设!classpath没有你想象中那么普适和强大,它只是命令行的简化替代品。

你不设的话它就是"."。

回到sourcepath,sourcepath指的是你

很多浮躁的初学者被default打包方式宠坏了。自我为中心,以为java就是一套库,自己写

的时候最多import进来就行了,代码从不打包,直接javac,直接java,多么方便。

孰不知自己写的这个.java也不过是java大平台的其中一个小单元而已。如果不打包,

我写一个Point,你写一个Point,甚至更有甚者敢于给自己的类起名叫String等等。

全部都在平板式的目录中,那jre该选哪一个?

一旦要使用package语句,就要使用代码树结构,当然,你要直接javac,也行。

不过javac出来的这个class要放在符合package结构的目录中才能发挥正常作用,否则就是

废物一坨。

而且,如果你这个.java还用到其它自己写的有package语句的.java,那这个方法就回天乏

术了。

按照sun的想象,应该是写好的.java放在符合package结构的目录中,package语句保证了

正确放置,如果目录位置和package语句中指示的不同,则会出错。

所以按照刚才我们的那种package写法,我们必然要将那几个.java文件放入相应的目录中

才能让javac顺利找到他们来make。

有人说javac可不可以像java那样 java aaa.bbb.c...java?

不可以

javac中的那个.java文件参数必须是一个文件系统的路径文件名形式。

然后如果用到其它的.java,javac会根据目前的sourcepath出发寻找目录结构中的那些

java文件。

当然了,既然打了包,在使用的时候。

要么写全名——包名.类名

或者使用import

不得不提的是,import就好比c++的using,它不负责做文件操作,它只是方便你写代码。

另外import

所以,如果程序一旦写到一定规模。

就不得不使用ant来管理这些。

或者使用IDE,否则jdk就真的变成了java developer killer。

但是对于初学者,在了解为什么会有ant之类的之前,还是要体会一下使用

jdk的艰辛。

这个和以前在unix上开发的人用gcc命令行到后来使用make之后使用ide

之类的时候的体会是类似的。

最后,javac的-d参数是指示编译出来的class

posted on 2007-04-29 14:19 执手麦田 阅读(2632) 评论(1)  编辑  收藏 所属分类: 咖啡馆

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值