WEB开发网      濠电姷鏁告繛鈧繛浣冲洤纾瑰┑鐘宠壘閻ょ偓銇勯幇鍫曟闁稿鍠愰妵鍕冀閵娧佲偓鎺楁⒒閸曨偄顏柡宀嬬畱铻e〒姘煎灡绗戦梻浣筋嚙濮橈箓顢氳濠€浣糕攽閻樿宸ュΔ鐘叉啞缁傚秹宕滆绾惧ジ寮堕崼娑樺缂佹宀搁弻鐔风暋閻楀牆娈楅梺璇″枓閺呯姴鐣疯ぐ鎺濇晝闁靛牆妫欓蹇旂節閻㈤潧浠﹂柛銊ョ埣楠炴劙骞橀鑲╋紱闂佽宕樼粔顔裤亹閹烘挸浜归梺缁樺灦閿曗晛螞閸曨垱鈷戦柟鑲╁仜婵″ジ鎮楀☉鎺撴珖缂侇喖顑呴鍏煎緞濡粯娅囬梻浣瑰缁诲倿寮绘繝鍥ㄦ櫇闁稿本绋撻崢鐢告煟鎼淬垻鈯曢柨姘舵煟韫囥儳绋荤紒缁樼箖缁绘繈宕橀妸褌绱濋梻浣筋嚃閸ㄤ即宕弶鎴犳殾闁绘梻鈷堥弫鍌炴煕閳锯偓閺呮瑧妲愬Ο琛℃斀闁绘劕妯婇崵鐔封攽椤旇棄鍔ら摶鐐烘煕閺囥劌澧柛娆忕箻閺屽秹宕崟顒€娅g紓浣插亾濠㈣泛顑囩粻楣冩煙鐎涙ḿ绠橀柨娑樼У椤ㄣ儵鎮欓鍕紙闂佽鍠栫紞濠傜暦閹偊妲诲┑鈩冨絻椤兘寮诲☉銏犖╅柕澶堝労閸斿绱撴担绋库偓鍝ョ矓瑜版帒鏋侀柟鍓х帛閺呮悂鏌ㄩ悤鍌涘 ---闂傚倸鍊烽悞锔锯偓绗涘厾娲煛閸涱厾顔嗛梺璺ㄥ櫐閹凤拷
开发学院WEB开发Jsp 再议package包的问题 阅读

再议package包的问题

 2008-01-05 09:52:41 来源:WEB开发网 闂傚倸鍊风欢姘缚瑜嶈灋闁圭虎鍠栫粻顖炴煥閻曞倹瀚�闂傚倸鍊风粈渚€骞夐敓鐘插瀭闁汇垹鐏氬畷鏌ユ煙閹殿喖顣奸柛搴$У閵囧嫰骞掗幋婵冨亾閻㈢ǹ纾婚柟鐐灱濡插牊绻涢崱妤冃℃繛宀婁簽缁辨捇宕掑鎵佹瀸闂佺懓鍤栭幏锟�濠电姷鏁告慨顓㈠箯閸愵喖宸濇い鎾寸箘閹规洟姊绘笟鈧ḿ褍煤閵堝悿娲Ω閳轰胶鍔﹀銈嗗笂閼冲爼鍩婇弴銏$厪闁搞儮鏅涙禒褏绱掓潏鈺佷槐闁轰焦鎹囬弫鎾绘晸閿燂拷闂傚倸鍊风欢姘缚瑜嶈灋闁圭虎鍠栫粻顖炴煥閻曞倹瀚�  闂傚倸鍊烽懗鑸电仚缂備胶绮〃鍛村煝瀹ュ鍗抽柕蹇曞У閻庮剟姊虹紒妯哄闁诲繑姘ㄩ埀顒佸嚬閸撶喎顫忓ú顏勫瀭妞ゆ洖鎳庨崜浼存⒑闁偛鑻晶顔剧磼婢跺﹦绉虹€殿喖顭锋俊姝岊槷闁稿鎹囧Λ鍐ㄢ槈濞嗗繑娈橀梻浣风串缂嶁偓濞存粠鍓熼崺鈧い鎺戝€归弳顒勬煕鐎n亷韬€规洑鍗冲鍊燁槾闁哄棴绠撻弻銊╂偆閸屾稑顏�
核心提示: 通常package包会把很多人搞糊涂,于是我翻阅资料发现“java编程思想”中有比较详尽的解释于是与大家分享,再议package包的问题,希望能祝你一臂之力,package解析自己为机器上的一个目录,那么必须象下面这样编程:java.util.Vector v = new java.util.Vector();由于它

   通常package包会把很多人搞糊涂,于是我翻阅资料发现“java编程思想”中有比较详尽
  的解释于是与大家分享,希望能祝你一臂之力。
  
  package解析自己为机器上的一个目录。这样一来,Java程序运行并需要装载.class文件的时候,它就可以找到.class文件驻留的那个目录。
  Java解释器的工作程序如下:首先,它找到环境变量CLASSPATH(将Java或者具有Java解释能力的工具——如浏览器——安装到机器中时,通过操作系统进行设定)。CLASSPATH包含了一个或多个目录,它们作为一种非凡的“根”使用,从这里展开对.class文件的搜索。从那个根开始,解释器会寻找包名,并将每个点号(句点)替换成一个斜杠,从而生成从CLASSPATH根开始的一个路径名(所以package foo.bar.baz会变成foo\bar\baz或者foo/bar/baz;具体是正斜杠还是反斜杠由操作系统决定)。随后将它们连接到一起,成为CLASSPATH内的各个条目(入口)。以后搜索.class文件时,就可从这些地方开始查找与预备创建的类名对应的名字。此外,它也会搜索一些标准目录——这些目录与Java解释器驻留的地方有关。
  为进一步理解这个问题,下面以我自己的域名为例,它是brUCeeckel.com。将其反转过来后,com.bruceeckel就为我的类创建了独一无二的全局名称(com,edu,org,net等扩展名以前在Java包中都是大写的,但自Java 1.2以来,这种情况已发生了变化。现在整个包名都是小写的)。由于决定创建一个名为util的库,我可以进一步地分割它,所以最后得到的包名如下:
  package com.bruceeckel.util;
  现在,可将这个包名作为下述两个文件的“命名空间”使用:
  
  //: Vector.java
  // Creating a package
  package com.bruceeckel.util;
  
  public class Vector {
   public Vector() {
    System.out.PRintln(
     "com.bruceeckel.util.Vector");
   }
  } ///:~
  
  创建自己的包时,要求package语句必须是文件中的第一个“非注释”代码。第二个文件表面看起来是类似的:
  
  //: List.java
  // Creating a package
  package com.bruceeckel.util;
  
  public class List {
   public List() {
    System.out.println(
     "com.bruceeckel.util.List");
   }
  } ///:~
  
  这两个文件都置于我自己系统的一个子目录中:
  C:\DOC\JavaT\com\bruceeckel\util
  若通过它往回走,就会发现包名com.bruceeckel.util,但路径的第一部分又是什么呢?这是由CLASSPATH环境变量决定的。在我的机器上,它是:
  CLASSPATH=.;D:\JAVA\LIB;C:\DOC\JavaT
  可以看出,CLASSPATH里能包含大量备用的搜索路径。然而,使用JAR文件时要注重一个问题:必须将JAR文件的名字置于类路径里,而不仅仅是它所在的路径。所以对一个名为grape.jar的JAR文件来说,我们的类路径需要包括:
  CLASSPATH=.;D:\JAVA\LIB;C:\flavors\grape.jar
  正确设置好类路径后,可将下面这个文件置于任何目录里(若在执行该程序时碰到麻烦,请参见第3章的3.1.2小节“赋值”):
  
  //: LiBTest.java
  // Uses the library
  package c05;
  import com.bruceeckel.util.*;
  
  public class LibTest {
   public static void main(String[] args) {
    Vector v = new Vector();
    List l = new List();
   }
  } ///:~
  
  编译器碰到import语句后,它会搜索由CLASSPATH指定的目录,查找子目录com\bruceeckel\util,然后查找名称适当的已编译文件(对于Vector是Vector.class,对于List则是List.class)。注重Vector和List内无论类还是需要的方法都必须设为public。
  戀灳
  1. 自动编译
  为导入的类首次创建一个对象时(或者访问一个类的static成员时),编译器会在适当的目录里寻找同名的.class文件(所以假如创建类X的一个对象,就应该是X.class)。若只发现X.class,它就是必须使用的那一个类。然而,假如它在相同的目录中还发现了一个X.java,编译器就会比较两个文件的日期标记。假如X.java比X.class新,就会自动编译X.java,生成一个最新的X.class。
  对于一个特定的类,或在与它同名的.java文件中没有找到它,就会对那个类采取上述的处理。
  
  2. 冲突
  若通过*导入了两个库,而且它们包括相同的名字,这时会出现什么情况呢?例如,假定一个程序使用了下述导入语句:
  import com.bruceeckel.util.*;
  import java.util.*;
  由于java.util.*也包含了一个Vector类,所以这会造成潜在的冲突。然而,只要冲突并不真的发生,那么就不会产生任何问题——这当然是最理想的情况,因为否则的话,就需要进行大量编程工作,防范那些可能可能永远也不会发生的冲突。
  如现在试着生成一个Vector,就肯定会发生冲突。如下所示:
  Vector v = new Vector();
  它引用的到底是哪个Vector类呢?编译器对这个问题没有答案,读者也不可能知道。所以编译器会报告一个错误,强迫我们进行明确的说明。例如,假设我想使用标准的Java Vector,那么必须象下面这样编程:
  java.util.Vector v = new java.util.Vector();
  由于它(与CLASSPATH一起)完整指定了那个Vector的位置,所以不再需要import java.util.*语句,除非还想使用来自java.util的其他东西。

Tags:package 问题

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接