A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Lin0411 中级黑马   /  2014-5-6 12:28  /  1482 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Lin0411 于 2014-5-6 14:36 编辑

class superclass
{
    static
    {
          System.out.println("superclass");
    }
   public static int value = 3;
}

class subclass extends superclass
{
    static
   {
      System.out.println("subclass");
   }
}

public class test
{
     public static void main(String[] args)
     {
          System.out.println(subclass.value);
     }
}

结果输出是:
superclass
3

觉得特别疑惑,subclass中的静态代码块为什么没有被执行?哪位大神能指点一下。

评分

参与人数 1技术分 +1 收起 理由
Silent_memory + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
本帖最后由 thinkervsruler 于 2014-5-6 13:58 编辑

继承结构中父类的成员变量,在子类中是共享的,利用子类去调用成员变量时实际上等效于父类去调用
由于整个过程都是静态调用,没有创建实例对象,所以类是否加载就要看有没有调用到类中的成员或方法。
System.out.println(subclass.value)中value是父类中的静态成员变量,所以subclass.value实际就是在调用的父类中的value,
这时父类会被加载,而子类不会被加载,父类一加载,静态代码块就先执行,打印出superclass,然后再打印出value的值3。所以结果是:
superclass
3
如果都是非静态的代码块和非静态成员,则需先创建对象,再调用,那么两个类都会被加载,结果则是:
superclass
subclass
3
LZ可以通过多次增删除一些关键字或语句,比较运行结果,便会更加明白了。
另外关于类名的命名给LZ点建议,类名的的所有英文单词首字母应大写,即superclass—>SuperClass,subclass—>SubClass
当然这是规范,不是规则,小写也正确的,只是以命名规则来书写会更好区分。

评分

参与人数 1技术分 +1 收起 理由
Silent_memory + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
thinkervsruler 发表于 2014-5-6 13:39
继承结构中父类的成员变量,在子类中是共享的,利用子类去调用成员变量时实际上等效于父类去调用
由于整个 ...

多谢,清晰了。
回复 使用道具 举报
2楼解释的非常好, 而且,提的意见更重要,因为好的习惯会给你带来更多的意想不到的好处。这些好习惯都是前辈们留给我们的财富。赞一个。
回复 使用道具 举报 1 0
赞一个。赞一个
回复 使用道具 举报
thinkervsruler 发表于 2014-5-6 13:39
继承结构中父类的成员变量,在子类中是共享的,利用子类去调用成员变量时实际上等效于父类去调用
由于整个 ...

太厉害了!
回复 使用道具 举报
package com.itheiam;
回复 使用道具 举报
package com.itheiam;
class superclass
{
    static
    {
          System.out.println("superclass");
    }
   public static int value = 3;
}

class subclass extends superclass
{
    static
   {
      System.out.println("subclass");
   }
}

public class e2
{
     public static void main(String[] args)
     {
          System.out.println(new subclass().value);
     }
}
这是一道java类的初始化顺序问题拿这个代码和你自己的代码作比较。就会发现问题。在没有使用new的时候而是着直接使用类名调用静态成员的时候,只会对静态成员所在类的所有静态成员进行初始化,而不会涉及到子类。
回复 使用道具 举报
subclass没被装载
回复 使用道具 举报
看完之后很受启发
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马