论坛首页 入门技术论坛

类的装载、连接与初始化 -- 纠正

浏览 7512 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-07-02   最后修改:2010-07-03
1.首先纠正<<深入java虚拟机>>电子书中的一个小错误(针对父类和子类拥有共同static变量时),那么父类和子类static变量,static块都会初始化。
 







-------------------------
class NewParent {  
  
    static int hoursOfSleep = (int) (Math.random() * 3.0);  
  
    static {  
        System.out.println("NewParent was initialized.");  
    }  
}  

class NewbornBaby extends NewParent {  
  
    static int hoursOfCrying = 6 + (int) (Math.random() * 2.0);  
  
    static {  
        System.out.println("NewbornBaby was initialized.");  
    }  
}  

class Example2 {  
    public static void main(String[] args) {  
        int hours = NewbornBaby.hoursOfSleep; 
        System.out.println(hours);  
    }  
  
    static {  
        System.out.println("Example2 was initialized.");  
    }  
}  

会输出:
Example2 was initialized.
NewParent was initialized.
2

如果是 int hours = NewbornBaby. hoursOfCrying ;
Example2 was initialized.
NewParent was initialized.
NewbornBaby was initialized.
2

如果
class NewParent {  
  
    static int hoursOfSleep = (int) (Math.random() * 3.0);  
  
    static {  
        System.out.println("NewParent was initialized.");  
    }  
}  

class NewbornBaby extends NewParent {  
  
    static int hoursOfSleep = 6 + (int) (Math.random() * 2.0);  
  
    static {  
        System.out.println("NewbornBaby was initialized.");  
    }  
}  

class Example2 {  
    public static void main(String[] args) {  
       [b] int hours = NewbornBaby.hoursOfSleep;  [/b][color=red][/color]
        System.out.println(hours);  
    }  
  
    static {  
        System.out.println("Example2 was initialized.");  
    }  
}  
会输出:
Example2 was initialized.
NewParent was initialized.
NewbornBaby was initialized.
2

------------------------------------


#######################################

2. 对类的加载、连接和初始化用Visio做了下整理,和大家一起讨论吧。









  • 大小: 149.4 KB
  • 大小: 42.8 KB
  • 大小: 66 KB
  • 大小: 100.9 KB
  • 大小: 156.7 KB
  • 大小: 177.3 KB
   发表时间:2010-07-02  
在这个领域,没有什么东西是永远如我党般永远正确的。
很多知识随着技术的进步,都变成了错误.
0 请登录后投票
   发表时间:2010-07-02  
-------------------------
正确输出(大家都知道):
Example2 was initialized.
Newparent was initialized.
NewbornBaby was initialized.
7


这个肯定是你代码错了
0 请登录后投票
   发表时间:2010-07-02  
zhangkaitao 写道
-------------------------
正确输出(大家都知道):
Example2 was initialized.
Newparent was initialized.
NewbornBaby was initialized.
7


这个肯定是你代码错了

--------------------------------------
你可以验证下
0 请登录后投票
   发表时间:2010-07-02   最后修改:2010-07-02
maozj 写道
zhangkaitao 写道
-------------------------
正确输出(大家都知道):
Example2 was initialized.
Newparent was initialized.
NewbornBaby was initialized.
7


这个肯定是你代码错了

--------------------------------------
你可以验证下


验证:翻开《深入JVM第二版》到第X章,肯定不会错.感觉这书要看个1遍,回头再看,理解消化,还有不错的
0 请登录后投票
   发表时间:2010-07-02  
lydawen 写道
maozj 写道
zhangkaitao 写道
-------------------------
正确输出(大家都知道):
Example2 was initialized.
Newparent was initialized.
NewbornBaby was initialized.
7


这个肯定是你代码错了

--------------------------------------
你可以验证下


验证:翻开《深入JVM第二版》到第X章,肯定不会错.感觉这书要看个1遍,回头再看,理解消化,还有不错的

上述代码的执行正确与否 我的验证是在jdk1.6下。。。 当然,我也是说它针对当前jdk版本的验证。 你运行过这段代码?
0 请登录后投票
   发表时间:2010-07-02  
我今天正好也看到这个地方,我在1.6下面验证了一下,这儿的确现在不正确了。事实上也是这样的父类的静态变量初始化,然后是子类的静态变量。
0 请登录后投票
   发表时间:2010-07-02  
我测试了一下,在jdk5下和原来一样,是正确的!
0 请登录后投票
   发表时间:2010-07-02  
maozj 写道
lydawen 写道
maozj 写道
zhangkaitao 写道
-------------------------
正确输出(大家都知道):
Example2 was initialized.
Newparent was initialized.
NewbornBaby was initialized.
7


这个肯定是你代码错了

--------------------------------------
你可以验证下


验证:翻开《深入JVM第二版》到第X章,肯定不会错.感觉这书要看个1遍,回头再看,理解消化,还有不错的

上述代码的执行正确与否 我的验证是在jdk1.6下。。。 当然,我也是说它针对当前jdk版本的验证。 你运行过这段代码?

我的JDK就行,
java version "1.6.0_10-rc2"
Java(TM) SE Runtime Environment (build 1.6.0_10-rc2-b32)
0 请登录后投票
   发表时间:2010-07-02  
zhangkaitao 写道
maozj 写道
lydawen 写道
maozj 写道
zhangkaitao 写道
-------------------------
正确输出(大家都知道):
Example2 was initialized.
Newparent was initialized.
NewbornBaby was initialized.
7


这个肯定是你代码错了

--------------------------------------
你可以验证下


验证:翻开《深入JVM第二版》到第X章,肯定不会错.感觉这书要看个1遍,回头再看,理解消化,还有不错的

上述代码的执行正确与否 我的验证是在jdk1.6下。。。 当然,我也是说它针对当前jdk版本的验证。 你运行过这段代码?

我的JDK就行,
java version "1.6.0_10-rc2"
Java(TM) SE Runtime Environment (build 1.6.0_10-rc2-b32)

你在java version "1.6.0_17"下测测
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics