java中有哪些有趣的现象_一个有趣的现象 - DANCE WITH JAVA - BlogJava

评论

# re: 一个有趣的现象[未登录]

2007-07-05 09:15

刘明

估计可能在null==getMyInt();这里的时候,getMyInt()不存在,直接为null吧?大概,需要测试一下。  回复  更多评论

# re: 一个有趣的现象

2007-07-05 09:38

dennis

没必要打包成jar都有这个现象,将MyInt.class删除也一样。

MyInt从来没有被连接过(link),仅仅是被尝试装载(load),而装载MyInt类但是没有使用是不会抛出NoClassDefFoundError的。  回复  更多评论

# re: 一个有趣的现象[未登录]

2007-07-05 09:45

刘明

将iface.jar移走后,如果不重新编译的话,程序依然能够运行,true null,(我直接用的类,没打包)。其实当你把iface.jar移走后没有重新编译,如果重新编译就能看到会报错的(找不到MyJar)。你使用的应该是旧的class文件。

我估计可能getMyInt()都没有执行,找不到就为null了。

要知道具体原因可能需要打开class文件具体查看一下了。  回复  更多评论

# re: 一个有趣的现象

2007-07-05 09:56

dennis

getMyInt()是肯定有执行,不信你可以在getMyInt加个

System.out.println("getMyInt()");

看看,原因俺已经说明了,更深入地请看《深入Java虚拟机》,常量池中的MyInt虽然被装载(装载失败),但没有使用,没有被连接、解析并初始化,可以简单地把它当成一个符号罢了  回复  更多评论

# re: 一个有趣的现象

2007-07-06 09:56

BeanSoft

懒惰加载, 优化过的代码, JVM 会走捷径.  回复  更多评论

# re: 一个有趣的现象

2007-07-06 11:25

李敏

我没有打包,而是直接运行的。现在说说我的看法。

1 编译好的字节码中可能储存了信息。具体的我也说不出来... !--

2 当你 javac Test的时候,它先是自动搜索当前有无编译好的字节码,如果没有话,才会重新编译,所以它会从之前的字节码中读出信息来参与编译。

可以用一个方法来测试,就是在当前的classpath下,删除掉MyJar.class,MyInt.java更换一个package的时候,就会发现,无法通过编译!

呵呵,不知道我的想法对你有没有帮助!

回复  更多评论

# re: 一个有趣的现象

2007-07-06 12:37

dreamstone

@dennis

打包只是为了模拟一个需求。怎么能说没被使用呢

isMyInterface()是调用了getMyInt()的。

执行isMyInterface()没问题,

执行getMyInt()有问题。这个怎么解释,呵呵  回复  更多评论

# re: 一个有趣的现象

2007-07-06 12:39

dreamstone

@刘明

你可以测试一下,是可以重新编译的。至少在eclipse是可以的。

你可以直接删掉.class文件,让他重新编译出来  回复  更多评论

# re: 一个有趣的现象

2007-07-06 12:40

dreamstone

@dennis

相对比较赞同这个观点,不过为什么调用getMyInt()会出错呢。根本编译不了。呵呵。  回复  更多评论

# re: 一个有趣的现象

2007-07-06 12:42

dreamstone

@BeanSoft

好像不是,我取了字节码看,还是有这个接口的。不过考虑可能是load失败,但是判断null==A的时候,根本不管是个什么什么东西,只要知道它不是null就直接得出结论。因为null的==是比较特殊的。不过这也是猜测,没有有力的证明  回复  更多评论

# re: 一个有趣的现象

2007-07-06 12:46

dreamstone

@李敏

恩,我明白你的意思。不过我说的特殊点在这里:

c是test b是isMyInterface() a是getMyInt()

c调用b b调用a能成功

c直接调用a不能成功。

而且都是putlic static 的函数,  回复  更多评论

# re: 一个有趣的现象

2007-07-06 13:04

dreamstone

另外提供一个信息,同样的代码和执行方式

在ibm aix上使用ibm sdk得到的结果是不一样的,就是执行isMyInterface() 也出错,呵呵。这个才是起因。  回复  更多评论

# re: 一个有趣的现象

2007-07-06 17:03

dennis

load失败抛出错误的时间,不同jdk实现不同,有的是一失败就马上给出NoClassDefFoundError,有的是延迟到使用该类的时候再报错。为什么不能调用getMyInt?编译不能通过啊,编译过程中编译器会查找所有出现的符号是否存在。  回复  更多评论

# re: 一个有趣的现象

2007-07-06 17:04

dennis

这个问题,你再看下《深入java虚拟机》连接和初始化那个章节就明了了  回复  更多评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值