程序是java编程思想中的,我改动了一点点:
class Candy {
static
{
System.out.println("Loading Candy");
}
}class Gum
{
static
{
System.out.println("Loading Gum");
}
}class Cookie
{
static
{
System.out.println("Loading Cookie");
}
}public class SweetShop {
/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("inside main");
new Candy();
System.out.println("After creating Candy");
try
{
Class.forName("Gum");
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
System.out.println("After Class.forName(\"Gum\")");
Class c = Cookie.class;
System.out.println("Cookie toString(): " + c);
System.out.println("After creating Cookie");
}}
下面是打印结果:
inside main
Loading Candy
After creating Candy
Loading Gum
After Class.forName("Gum")
Cookie toString(): class Cookie
After creating Cookie
问题主要是创建Class引用时,用Class.forName和用类名.class的形式创建有什么区别.
从结果可以看出用Class.forName创建时静态代码块中的语句被执行了,说明类已经被加载了.
但是用Cookie.class获得Cookie的Class对象时静态代码块中的语句没有被执行,是不是就说明此类并没有被加载?
但是如果没有被加载,这个Class确实又被创建了可以调用toString方法(默认调用的),这是怎么回事?

解决方案 »

  1.   

    但是如果没有被加载,这个Class确实又被创建了可以调用toString方法(默认调用的),这是怎么回事?
    这里传创建的时Class类的一个实例,它是用来表示某个类的结构信息和其所含有的方法的信息的(这里可能说得不太准确,大概就是这个意思),实际的Cookie并没有被载入内存。你应该好好看看开发文档中java.lang.Class这个类。
      

  2.   

    这个类应该是创建了,只不过Class这个类没有pulbic构造器,所以创建时访问不到
    static
    {
    System.out.println("Loading Gum");
    }
    看看开发文档中java.lang.Class这个类。呵呵。
      

  3.   

    楼主:
    在编译中,就会把static 数据加载在内存里.在执行Class.forName("Gum");,说明: 执行 名为'Gum'的类.当然会打印出来.但在执行Class c = Cookie.class; 则是把'Cookie'的地址名赋给变量'C',当然显示为'Cookie'
      

  4.   

    我试了一下:
    inside main
    Loading Candy
    After creating Candy
    Loading Gum
    After Class.forName("Gum")
    Loading Cookie
    Cookie toString(): class Cookie
    After creating Cookie有Loading Cookie啊,你的是怎么回事?
    static{}是classloader加载类时执行的,为了初始化类的静态变量
      

  5.   

    执行结果:
    inside main
    Loading Candy
    After creating Candy
    Loading Gum
    After Class.forName("Gum")
    Loading Cookie
    Cookie toString(): class Cookie
    After creating Cookiestatic{}在类首次加载时执行.
      

  6.   

    Class.forName 这句调用时才加载对应的类。什么时候“确实需要”用到哪个类就加载哪个。
      

  7.   

    现在基本上想明白这个问题了, 还是我从前不太细心没有仔细观察输出结果.
    程序结果可以得出两个事实,第一个就是Class.forName()和.class肯定是不同的,前者进行了加载, 后者没有加载所以静态代码块没有被执行.
    第二, 虽然没有加载Cookie类但Cookie对应的Class类确实被创建了, toString()方法输出的是那个Class类对象, 而非Cookie类对象.
     benq998() 的回答是正确的.楼上的有人说的Loading Cookie两个打印结果我这里没有重现出来, 无论是在IDE中还是命令行都是一样没有, 可能是JAVA版本的问题.