Package and ClassPath (静水流深第一版) 
    这是我的读书笔记,希望能够对大家学习java有所帮助。 所有代码都经过测试,测试环境: 
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                              2003.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:\mypackage\A.java 
package mypackage; public class A{   public A(){     System.out.println("Create A");   } } 
d:\mypackage\B.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.ClassLoader.defineClass0(Native Method)         at java.lang.ClassLoader.defineClass(ClassLoader.java:509)         at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12 3)         at java.net.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.AccessController.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 
  
      
         
   
 
  |