黑马程序员技术交流社区

标题: 继承与类的静态代码块的问题。 [打印本页]

作者: Lin0411    时间: 2014-5-6 12:28
标题: 继承与类的静态代码块的问题。
本帖最后由 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中的静态代码块为什么没有被执行?哪位大神能指点一下。
作者: thinkervsruler    时间: 2014-5-6 13:39
本帖最后由 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
当然这是规范,不是规则,小写也正确的,只是以命名规则来书写会更好区分。


作者: Lin0411    时间: 2014-5-6 14:35
thinkervsruler 发表于 2014-5-6 13:39
继承结构中父类的成员变量,在子类中是共享的,利用子类去调用成员变量时实际上等效于父类去调用
由于整个 ...

多谢,清晰了。
作者: 屋檐下的期待    时间: 2014-5-7 12:22
2楼解释的非常好, 而且,提的意见更重要,因为好的习惯会给你带来更多的意想不到的好处。这些好习惯都是前辈们留给我们的财富。赞一个。
作者: 别小乐    时间: 2014-5-7 14:37
赞一个。赞一个
作者: 李小新H    时间: 2014-5-9 07:31
thinkervsruler 发表于 2014-5-6 13:39
继承结构中父类的成员变量,在子类中是共享的,利用子类去调用成员变量时实际上等效于父类去调用
由于整个 ...

太厉害了!
作者: 走在道上发着呆    时间: 2014-5-9 10:39
package com.itheiam;
作者: 走在道上发着呆    时间: 2014-5-9 10:43
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的时候而是着直接使用类名调用静态成员的时候,只会对静态成员所在类的所有静态成员进行初始化,而不会涉及到子类。
作者: 饥渴ing    时间: 2014-5-9 12:32
subclass没被装载
作者: 天外的星    时间: 2014-5-9 12:53
看完之后很受启发




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2