Package and ClassPath (轉)

gugu99發表於2008-01-06
Package and ClassPath (轉)[@more@]

 

  Package and ClassPath (靜水流深第一版)

  這是我的讀書筆記,希望能夠對大家學習有所幫助。
所有程式碼都經過測試,測試環境:

java version "1.4.0-rc"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-rc-b91)
Java HotSpot(TM) Client VM (build 1.4.0-rc-b91, mixed mode)

  如大家發現任何錯誤,或有任何意見請不吝賜教。

  quietwater
  .2.4

  寫作初衷

  首先是我自己遇到了有關package和classpath的問題,經過網友的幫助和
自己的摸索,終於搞清楚原因。後來發現有些網友有著和我同樣的問題,所以
決定寫篇文章來和大家分享。


正文:

一.private,friendly,protected,public的區別:


  private顧名思義就是私有,自己所以自己所用。
包括私有成員變數和私有成員, 只有它們所屬
的類中的成員函式(包括public friendly
protected and private 也就是所有)可以。
  public就是共有,大家所以,可以被任何class
呼叫。
  friendly友好,可以被同一個包中的class呼叫。
如果沒有明確宣告屬於哪一個包package,那麼就只
可以被同一個目錄中的class呼叫。因為預設同一個
目錄中的class屬於同一個package。
  protected保護,它具有friendly的屬性,也就是
說它是friendly的超集,protected還可以被子類訪問。

二. 預設package與friendly:

  預設情況下在同一個目錄下的所有class 在同一個
package 中。所以我們在預設情況下可以呼叫在同一個
目錄中的class 。預設情況下它們都是friendly。
  如果是j2sdk1.4那麼我們可以不classpath。
但是如果你想import你自己的package ,那麼你就必須
配置classpath 了。

三. 問題出在哪裡?

  舉例說明:

d:mypackageA.java

package mypackage;
public class A{
  public A(){
  System.out.println("Create A");
  }
}

d:mypackageB.java

import mypackage.*;
class B{
  B(){
  System.out.println("Create B");
  }
  public static void main(String[] args){
  A a=new A();
  B b=new B();
 
}
 
首先set classpath=.;d:
表示到當前目錄和d盤根目錄查詢包,包名與目錄名一致。如mypackage包
位於d:mypackage  java透過classpath找到d:然後透過包名找到
d:mypackage目錄,在d:mypackage目錄下找到A.class

D:mypackage>javac A.java 沒問題
D:mypackage>javac B.java
B.java:7: cannot access A
bad class file: .A.class
class file contains wrong class: mypackage.A
Please remove or make sure it appears in the correct subdirectory of the classpa
th.
  A a=new A();
  ^
1 error

將B.java移至d:B.java然後執行

D:>javac B.java

D:>java B
Create A
Create B

一切正常。

  總結:因為B class不在mypackage中,也就是說B class 要使用在mypackage 中的class,那麼class B應該位於mypackage包所在目錄之外才能避免衝突。不然預設class B
與它所在目錄的class位於同一個package中。

如想執行包中的類,如下:

 D:mypackage>java A
Exception in thread "main" java.lang.NoClassDefFoundError: A (wrong name: mypack
age/A)
  at java.lang.Claoader.defineClass0(Native Method)
  at java.lang.ClassLoader.defineClass(ClassLoader.java:509)
  at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12
3)
  at java.URLClassLoader.defineClass(URLClassLoader.java:246)
  at java.net.URLClassLoader.access$100(URLClassLoader.java:54)
  at java.net.URLClassLoader$1.run(URLClassLoader.java:193)
  at java.security.Accesntroller.doPrivileged(Native Method)
  at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
  at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:262)
  at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:322)

寫全名包名+類名如下:

D:mypackage>java mypackage.A
Exception in thread "main" java.lang.NoSuchMethodError: main

改寫A.java如下,新增main()

package mypackage;
public class A{
  public A(){
  System.out.println("Create A");
  }
  public static void main(String[] args){
  A a=new A();
  }
}

D:mypackage>java mypackage.A
Create A

 


 

 
 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-996635/,如需轉載,請註明出處,否則將追究法律責任。

相關文章