日期:2014-05-20  浏览次数:20807 次

新手求问package和import的问题??
我的两个源文件:

文件1:Cookie.java
package com.wym.access.dessert;

public class Cookie 
{
  public Cookie() {
  System.out.println("Cookie constructor");
  }
  void bite() { System.out.println("bite"); }
}

文件2:Dinner.java
package com.wym.access.dessert;

import com.wym.access.dessert.Cookie;

public class Dinner 
{
  public static void main(String[] args) {
  Cookie x = new Cookie();
  x.bite(); // Can't access
  }


将以上两个文件的package和import语句都注释掉,放在同一个文件夹内,使用默认的包权限。然后命令行输入
javac Dinner.java;java Dinner后程序可以输出正确的结果。但是加入package和import语句后,执行javac Dinner.java编译没有错误,执行java Dinner时弹出如下异常提示:
D:\java4th_classlib\com\wym\access\dessert>javac Dinner.java

D:\java4th_classlib\com\wym\access\dessert>java Dinner
Exception in thread "main" java.lang.NoClassDefFoundError: Dinner (wrong name: c
om/wym/access/dessert/Dinner)
  at java.lang.ClassLoader.defineClass1(Native Method)
  at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
  at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14
2)
  at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
  at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
  at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
  at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
  at java.security.AccessController.doPrivileged(Native Method)
  at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
  at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
  at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:472)
求高手解答是怎么回事?我的CLASSPATH设置为:
.;D:\java4th_classlib;C:\Program Files\Java\jdk1.7.0\lib\dt.jar;C:\Program Files\Java\jdk1.7.0\lib\tools.jar

------解决方案--------------------
然后在:
D:\java4th_classlib> 这里执行java com.wym.access.dessert.Dinner
------解决方案--------------------
你把自己当jvm想想就就知道了,当你执行java Dinner:
1、明确要执行的类是根路径的Dinner类下的main函数;
2、查找CLASSPATH,看有没有Dinner.class;
3、查看Dinner.class是否其包路径为根;// 这里就失败了
4、查找Dinner.class有没有main函数;
5、调用该main函数。

反之如果你执行:java com.wym.access.dessert.Dinner:
1、明确要执行的类是com.wym.access.dessert路径的Dinner类下的main函数;
2、查找CLASSPATH,看有没有com目录,进而看看有没有wym目录,然后是access目录,最后是desser目录,有没有Dinner.class;
3、查看Dinner.class其包路径是否为com.wym.access.dessert;
等等...