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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

刚才复习了下面向对象类的加载以及对象的初始化,看下面一段代码

  1. public class Dog extends NewAnimal {
  2.        
  3.         static {
  4.                 printInfo("Dog静态代码块执行");
  5.         }
  6.        
  7.         static Cat mc1 = new Cat();
  8.         static Cat mc2 = new Cat();
  9.        
  10.         public static void main(String[] args) {
  11.                 Dog.printInfo("总算进入了main函数了,准备工作太多了,好累啊-----------------------");
  12.                 new Dog();

  13.         }
  14.         {
  15.                 Dog.printInfo("Dog构造块代码执行");
  16.         }
  17.         public Dog() {
  18.                 Dog.printInfo("Dog构造方法执行,创建了一个Dog对象");
  19.         }
  20.        
  21.         public static void printInfo(Object o) {
  22.                 System.out.println(o);
  23.         }

  24. }

  25. class NewAnimal extends LivingThings {
  26.         {
  27.                 Dog.printInfo("NewAnimal构造块执行");
  28.         }
  29.         static {
  30.                 Dog.printInfo("NewAnimal静态代码块执行");
  31.         }
  32.        
  33.         public NewAnimal() {
  34.                 Dog.printInfo("NewAnimal构造方法执行");
  35.         }
  36.         static Cat mc1 = new Cat();
  37.         static Cat mc2 = new Cat();
  38.         static {
  39.                 Dog.printInfo("NewAnimal静态代码块执行-----第二次");
  40.         }
  41. }

  42. class LivingThings {

  43.         static Cat mc1 = new Cat();
  44.        
  45.         {
  46.                 Dog.printInfo("LivingThings构造代码块执行");
  47.         }
  48.         static {
  49.                 Dog.printInfo("LivingThings静态代码块执行");
  50.         }
  51.         public LivingThings() {
  52.                 Dog.printInfo("LivingThings构造方法执行");
  53.         }
  54.         static Cat mc2 = new Cat();
  55.         static {
  56.                 Dog.printInfo("LivingThings静态代码块执行---第二次");
  57.         }
  58. }

  59. class Cat {
  60.         static int count1 = 1;
  61.         static int count2 = 1;
  62.        
  63.         {
  64.                 Dog.printInfo("Cat构造块执行"+ count2++);
  65.         }
  66.         static {
  67.                 Dog.printInfo("Cat静态代码块执行");
  68.         }
  69.         public Cat() {
  70.                 Dog.printInfo("Cat构造方法执行" + count1++);
  71.         }
  72. }
复制代码
代码总结,首先运行程序后jvm将编译好的.class文件加载进内存,同时执行static修饰的数据(包括字段,静态代码块)
1.首先加载静态数据之前先看看有没有父类,如果有,就去加载他的父类中的静态数据,就这样一直找下去直到找到Object,然后才从最终父类加载到最终子类
2.加载时,如果有静态字段和静态代码块他们没有执行先后顺序,是按照代码的前后文顺序由上至下执行(与构造代码块和构造方法不同,构造代码块优先于构造方法执行)
3.加载完所有类之后,第三步就是执行main()方法创建对象了,看看上面的这段代码吧
首先加载运行的类Dog,加载时发现他还有父类,暂停加载该类,找他父类加载去,父类还有父类,一直找到他的老祖宗Object中去,加载完Object之后就加载LivingThings,之后执行
static Cat mc1 = new Cat();加载Cat类初始化两个变量后执行静态代码块,然后创建Cat对象,先调用构造代码块接着执行构造方法,下面才加载LivingThings,NewAnimal,Dog全部加载完毕后进入main()方法,创建对象,创建对象也是一层一层的往上找,找到最终父类后由上往下一级一级的调用构造方法(如果有构造块限于构造方法执行)。应该就是这样吧,大家有什么意见多提提吧


评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

9 个回复

正序浏览

回帖奖励 +10

果断收藏了
回复 使用道具 举报
看了一会 慢慢懂了 谢谢
回复 使用道具 举报
对象加载和静态代码块,,,
回复 使用道具 举报
代码确实好长的说啊,不过总结的真是非常的详细
回复 使用道具 举报

回帖奖励 +10

看一下:)
回复 使用道具 举报

回帖奖励 +10

代码好长啊,我视频看的也不好啊
回复 使用道具 举报
学习学习
回复 使用道具 举报
黑马-李嘉欣 发表于 2013-3-14 22:51
我表示还得继续努力,不怎么懂。。。

不至于吧,多看看thinking in java吧,真是一本好书啊,两个月前完全看不懂,现在看着感觉压力没这么大了
回复 使用道具 举报
我表示还得继续努力,不怎么懂。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马