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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 安安安 中级黑马   /  2015-6-20 15:29  /  172 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

以一个题目为例
  1. public class Test {

  2.     Person person = new Person("Test");

  3.     static{

  4.         System.out.println("test static");
  5.     }

  6.      
  7.     public Test() {

  8.         System.out.println("test constructor");
  9.     }


  10.     public static void main(String[] args) {

  11.         new MyClass();
  12.     }

  13. }


  14. class Person{

  15.     static{

  16.         System.out.println("person static");
  17.     }

  18.     public Person(String str) {

  19.         System.out.println("person "+str);
  20.     }

  21. }


  22. class MyClass extends Test {

  23.     Person person = new Person("MyClass");

  24.     static{

  25.         System.out.println("myclass static");
  26.     }

  27.    
  28.     public MyClass() {

  29.         System.out.println("myclass constructor");
  30.     }
  31. }
复制代码
运行结果:
test static
myclass static
person static
person Test
test constructor
person MyClass
myclass constructor

1、主函数在Test类中,所以先加载Test类,在加载Test类时会执行Test类的静态代码块。打印test static。
2、在主函数中new了个MyClass类对象,执行MyClass类时发现MyClass类继承自Test类,但Test类已经被加载了,所以加载MyClass类,并执行了静态代码块。打印myclass static。
3、在通过MyClass类的构造方法生成变量的时候首先会初始化父类的成员变量,因此会new一个Person类对象,而Persom类还没有被加载,所以加载Person类,并执行静态代码块。打印person static。
4、然后执行Person类的构造方法。打印person Test。
5、初始化父类变量之后执行父类的构造方法(继承的子类的构造方法中默认存在super();),打印test constructor。
6、完成父类的初始化之后,初始化自身,先对自身的成员变量初始化。打印person MyClass。
7、最后执行自身的构造方法。打印myclass constructor。







0 个回复

您需要登录后才可以回帖 登录 | 加入黑马