java编程思想中有关"Class.forName()"和".class"的区别问题

hemiao_1993 2006-01-12 04:28:35
程序是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方法(默认调用的),这是怎么回事?
...全文
371 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hemiao_1993 2006-02-13
  • 打赏
  • 举报
回复
现在基本上想明白这个问题了, 还是我从前不太细心没有仔细观察输出结果.
程序结果可以得出两个事实,第一个就是Class.forName()和.class肯定是不同的,前者进行了加载, 后者没有加载所以静态代码块没有被执行.
第二, 虽然没有加载Cookie类但Cookie对应的Class类确实被创建了, toString()方法输出的是那个Class类对象, 而非Cookie类对象.
benq998() 的回答是正确的.

楼上的有人说的Loading Cookie两个打印结果我这里没有重现出来, 无论是在IDE中还是命令行都是一样没有, 可能是JAVA版本的问题.
humanity 2006-01-15
  • 打赏
  • 举报
回复
Class.forName 这句调用时才加载对应的类。

什么时候“确实需要”用到哪个类就加载哪个。
yingtju 2006-01-14
  • 打赏
  • 举报
回复
我试了一下:
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加载类时执行的,为了初始化类的静态变量
ygn1001 2006-01-14
  • 打赏
  • 举报
回复
楼主:
在编译中,就会把static 数据加载在内存里.

在执行Class.forName("Gum");,说明: 执行 名为'Gum'的类.当然会打印出来.

但在执行Class c = Cookie.class; 则是把'Cookie'的地址名赋给变量'C',当然显示为'Cookie'
smile_hxy 2006-01-14
  • 打赏
  • 举报
回复
执行结果:
inside main
Loading Candy
After creating Candy
Loading Gum
After Class.forName("Gum")
Loading Cookie
Cookie toString(): class Cookie
After creating Cookie

static{}在类首次加载时执行.
tommy_jk 2006-01-13
  • 打赏
  • 举报
回复
这个类应该是创建了,只不过Class这个类没有pulbic构造器,所以创建时访问不到
static
{
System.out.println("Loading Gum");
}
看看开发文档中java.lang.Class这个类。呵呵。
benq998 2006-01-13
  • 打赏
  • 举报
回复
但是如果没有被加载,这个Class确实又被创建了可以调用toString方法(默认调用的),这是怎么回事?


这里传创建的时Class类的一个实例,它是用来表示某个类的结构信息和其所含有的方法的信息的(这里可能说得不太准确,大概就是这个意思),实际的Cookie并没有被载入内存。

你应该好好看看开发文档中java.lang.Class这个类。
lgh2008 2006-01-13
  • 打赏
  • 举报
回复
学习

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧