package onlyfun.caterpillar; 
import java.util.*;
import java.lang.ref.*;class VeryBig
{
    private static final int SZ = 10000;
    private double[] d = new double[SZ];
    private String ident;
    public VeryBig(String id)
    {
        this.ident = id;
    }
    public String toString()
    {
        return ident;
    }
    public void finalize()
    {
        System.out.println("Finalizing " + ident);
    }
}public class TreeSetDemo
{
    private static ReferenceQueue rq = new ReferenceQueue();
    public static void checkOut()
    {
        Object inq = rq.poll();
        if(inq != null)
        {
            System.out.println("In Queue" + (VeryBig)((Reference)inq).get());
        }
    }
    public static void main(String[] args)
    {
      int size = 10;
      if(args.length > 0)
          size = Integer.parseInt(args[0]);
      SoftReference[] sa = new SoftReference[size];
      for(int i = 0; i < sa.length; i++)
      {
          sa[i] = new SoftReference(new VeryBig("Soft " + i), rq);
          System.out.println("Just created: " + (VeryBig)sa[i].get());
          checkOut();
      }
      
      WeakReference[] wa = new WeakReference[size];
      for(int i = 0; i < wa.length; i++)
      {
          wa[i] = new WeakReference(new VeryBig("Weak " + i), rq);
          System.out.println("Just created: " + (VeryBig)wa[i].get());
          checkOut();
      }
      
      SoftReference s = new SoftReference(new VeryBig("Soft"));
      WeakReference w = new WeakReference(new VeryBig("Weak"));
      System.gc();
      
      PhantomReference[] pa = new PhantomReference[size];
      for(int i = 0; i < pa.length; i++)
      {
          pa[i] = new PhantomReference(new VeryBig("Phantom " + i), rq);
          System.out.println("Just created: " + (VeryBig)pa[i].get());
          checkOut();
      }
      
    }
}
=====================
错误提示:
java.lang.NoClassDefFoundError: TreeSetDemo (wrong name: onlyfun/caterpillar/TreeSetDemo)
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:537)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
Exception in thread "main" 我可是照书上打出来的啊,怎么不知道哪里出错了,谢谢大家

解决方案 »

  1.   

    Java 有包的概念,它是一个名称空间,这个要记住,不能光理解成一个文件夹结构,
    一个类定义在哪个包里面就必须出现在相应的子目录下,当一个类 x.class
     出现在一个错误的子目录层次中时 JVM 会拒绝执行它。
    当我这样: D:\JDK\bin\java.exe -classpath C:\Jars\log4j-1.2.8.jar;C:\jars\log4j-optional.jar org.apache.log4j.net.Log4jRadio 224.0.0.2 5001 来执行一个 Java Main Class 时,JVM 是这样搜索我的 Log4jRadio 类的,他先到 JVM /lib 目录找,当然找不到,再到 /lib/ext 找,当然还是找不到(因为这个类是我自己写的),那么它就到 C:\Jars\log4j-1.2.8.jar 中来找,你打开 WinZIP/WinRAR 看看 JAR 目录结构也是属性结构, JVM 查找事就是 把 JAR 根当作当前搜索根目录,把类的包名当成子目录名,去找 Log4jRadio.class 文件,这个例子中他应该到 /org/apache/log4j/net/ 目录下找到了 Log4jRadio.class 文件并装载, 如果他发现 Log4jRadio 出现在 /org/apache/log4j/ 目录下面他就会跑出异常 java.lang.NoClassDefFoundError , 拒绝执行,就好像你说你是只是个打杂的你偏偏坐在总裁的位子上一样。
    JVM 搜索时把类路径下的每个路径当成“搜索根目录”,报名当成子目录名搜索 对应的 .class 文件, 这样安排就解决了跨平台的问题, 我们在写类定义时都是用包名,然后压缩成  .jar ,这个过程在所有的操作系统上都是一样的, 以后你到 不同的操作系统上运行他都没问题,因为类路径是运行时指定的,不需要编码时考虑,
    在 Windows 下 我们这样:
    C:\jdk\bin\> java -cp C:\jars\a.jar org.apache.log4j.net.Log4jRadio xxx.
    在 Linux 下 我们这样:/home/jdk/bin# java -cp /home/userA/jars/a.jar org.apache.log4j.net.Log4jRadio xxx
    比如你的 DOS 窗口这样的:C:\MyJavaSourceDir\>dir
    2006-01-13  22:17            12,965 TreeSetDemo.java
    2006-01-13  22:17            12,965 TreeSetDemo.class
    2006-01-13  22:17            12,965 VeryBig.java
    2006-01-13  22:17            12,965 VeryBig.class    5 个文件      3,159,052 字节
       15 个目录  2,836,619,264 可用字节
    C:\MyJavaSourceDir\>md onlyfunC:\MyJavaSourceDir\>cd onlyfunC:\MyJavaSourceDir\onlyfun\>md caterpillarC:\MyJavaSourceDir\onlyfun\>cd caterpillarC:\MyJavaSourceDir\onlyfun\caterpillar\> copy ..\..\*.*
        4 files copied.C:\MyJavaSourceDir\onlyfun\caterpillar\>cd ..\..\C:\MyJavaSourceDir\> D:\JDK\bin\java.exe onlyfun.caterpillar.TreeSetDemo 5
     《以下是你的程序输出》C:\MyJavaSourceDir\>D:D:\JDK\>bin\java.exe -classpath C:\MyJavaSourceDir onlyfun.caterpillar.TreeSetDemo 5
     《以下是你的程序输出》