黑马程序员技术交流社区
标题:
继承与类的静态代码块的问题。
[打印本页]
作者:
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