ITPub博客

首页 > 应用开发 > IT综合 > Package and ClassPath (转)

Package and ClassPath (转)

原创 IT综合 作者:amyz 时间:2007-10-14 14:02:31 0 删除 编辑
Package and ClassPath (转)[@more@]

 

  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: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.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

 


 

 
 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752019/viewspace-976409/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    3984
  • 访问量
    7362974