黑马程序员技术交流社区

标题: 基础问题之输出结果! [打印本页]

作者: hejinzhong    时间: 2014-9-14 14:30
标题: 基础问题之输出结果!

  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. }
复制代码


作者: 蒙奇.D.路飞    时间: 2014-9-14 15:30
输出结果是:
1
a
2
b
作者: 行进中的蜗牛    时间: 2014-9-14 16:02
输出1a2b2b
作者: zhappy    时间: 2014-9-14 16:55
A ab = new B();时创建里一遍A与B,显示1a3b
ab = new B(); 又创建了一遍A与B,static只编译一遍,所以只显示2b
作者: daoqin    时间: 2014-9-14 18:08
输出结果:1a2b2b
作者: 进击的大鹏    时间: 2014-9-14 21:34
静态方法随着类的加载而加载,所以先输出1,a, 然后第一次new B(); 去找父类A的构造函数打印2,然后执行B的构造函数打印b,然后又new B();再打印一次2,b. 静态代码块不再执行因为只加载一次。
作者: 石头-剪刀    时间: 2014-9-15 20:55
在Java中创建对象的时候有如下的执行顺序:
为静态Field分配内存-->静态初始化块-->为变量创建内存-->初始化块-->构造函数,
知道这个顺序后就很容易分析出输出结果
当A ab = new B(); 时,创建B对象,先看B对象的父类A有无static ,再看B类的static,然后再调用B的父类A的构造函数,最后调用B的构造函数




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