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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丁朋伟 黑马帝   /  2011-9-16 11:48  /  2235 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

帮忙解释下如下代码为什么不会输出:
class B {   
   static int value = 100;   
   static {      
      System.out.println("Class B is initialized."); //输出   
   }
}
class A extends B {   
   static {      
      System.out.println("Class A is initialized."); //不会输出   
   }
}
public class InitTest {   
   public static void main(String[] args) {      
      System.out.println(A.value); //输出100   
   }
}

6 个回复

倒序浏览
黑马网友  发表于 2011-9-16 11:50:50
沙发
类InitTest通过A.value引用了类B中声明的静态域value。由于value是在类B中声明的,只有类B会被初始化,而类A则不会被初始化,所以就不会输出其静态代码块中的代码了
回复 使用道具 举报
这点你想到继承的概念 在子类继承父类的基础上 是有一个隐藏代码 super 始终隐藏在子类的第一行  会先调用父类的方法,静态方法只执行1 次 A类方法没有重写 所以执行完B后 直接结束方法
[ 本帖最后由 葛锐 于 2011-09-16  13:41 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-9-16 12:32:37
板凳
class B中你定义了static 的value,然后又在class A中继承了class B,也就是说class A有了class B的value的方法,在最后的主函数中输出class A的value,自然就输出的class的value = 100咯!不知道我这样理解是不是对的呢!???
回复 使用道具 举报
一个类中部有两个静态代码块?
static代码块的特点是随着类的加载而执行,而且只执行一次,而你的子类和父类都有静态代码块,就相当于子类有两个static代码块,又因为super();的原因所以先执行父类的static代码块,子类的自然就不执行了,
[ 本帖最后由 石欣欣 于 2011-09-16  12:58 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-9-17 16:21:21
地板
一个类中的静态代码块在一个类被初始化的的时候执行,且只执行一次,在这个代码中,子类A继承了类B的value变量,所以在访问A.value的时候,实际上访问的是类B的value,由于类B被使用,所以会被初始化,执行static代码块,而类A没有被使用,所以static代码块没有被执行。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马