Package and ClassPath

浏览:45日期:2023-02-05
内容: 这是我的读书笔记,希望能够对大家学习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) 如大家发现任何错误,或有任何意见请不吝赐教。 quietwater2003.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.javapackage mypackage;public class A{ public A(){ System.out.println('Create A'); }}d:mypackageB.javaimport 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.classD:mypackage>javac A.java 没问题D:mypackage>javac B.javaB.java:7: cannot access Abad class file: .A.classclass file contains wrong class: mypackage.APlease remove or make sure it appears in the correct subdirectory of the classpath. A a=new A(); ^1 error将B.java移至d:B.java然后运行D:>javac B.javaD:>java BCreate ACreate B一切正常。 总结:因为B class不在mypackage中,也就是说B class 要使用在mypackage 中的class,那么class B应该位于mypackage包所在目录之外才能避免冲突。不然默认class B与它所在目录的class位于同一个package中。如想运行包中的类,如下: D:mypackage>java AException in thread 'main' java.lang.NoClassDefFoundError: A (wrong name: mypackage/A) at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:509) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123) 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.AException 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.ACreate Abill-转自:csdn Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
相关文章: