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

© hejinzhong 中级黑马   /  2014-9-14 14:30  /  1215 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. class A{
  2.     static{
  3.         System.out.print("1");
  4.     }
  5.     public A(){
  6.         System.out.print("2");
  7.     }
  8. }
  9. class B extends A{
  10.     static{
  11.         System.out.print("a");
  12.     }
  13.     public B(){
  14.         System.out.print("b");
  15.     }   
  16. }
  17. public class Hello{
  18.     public static void main(String[] ars){
  19.         A ab = new B();
  20.         ab = new B();
  21.     }
  22. }
复制代码

6 个回复

倒序浏览
输出结果是:
1
a
2
b
回复 使用道具 举报
输出1a2b2b
回复 使用道具 举报
A ab = new B();时创建里一遍A与B,显示1a3b
ab = new B(); 又创建了一遍A与B,static只编译一遍,所以只显示2b
回复 使用道具 举报
输出结果:1a2b2b
回复 使用道具 举报
静态方法随着类的加载而加载,所以先输出1,a, 然后第一次new B(); 去找父类A的构造函数打印2,然后执行B的构造函数打印b,然后又new B();再打印一次2,b. 静态代码块不再执行因为只加载一次。
回复 使用道具 举报
在Java中创建对象的时候有如下的执行顺序:
为静态Field分配内存-->静态初始化块-->为变量创建内存-->初始化块-->构造函数,
知道这个顺序后就很容易分析出输出结果
当A ab = new B(); 时,创建B对象,先看B对象的父类A有无static ,再看B类的static,然后再调用B的父类A的构造函数,最后调用B的构造函数
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马