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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class Root {
  2.     static {
  3.         System.out.println("Root的静态初始化块");
  4.     }
  5.     {
  6.         System.out.println("Root的普通初始化块");
  7.     }

  8.     public Root() {
  9.         System.out.println("Root的无参数的构造器");
  10.     }
  11. }

  12. class Mid extends Root {
  13.     static {
  14.         System.out.println("Mid的静态初始化块");
  15.     }
  16.     {
  17.         System.out.println("Mid的普通初始化块");
  18.     }

  19.     public Mid() {
  20.         System.out.println("Mid的无参数的构造器");
  21.     }

  22.     public Mid(String msg) {
  23.         this();
  24.         System.out.println("Mid的带参数构造器,其参数值:" + msg);
  25.     }
  26. }

  27. class Leaf extends Mid {
  28.     static {
  29.         System.out.println("Leaf的静态初始化块");
  30.     }
  31.     {
  32.         System.out.println("Leaf的普通初始化块");
  33.     }

  34.     public Leaf() {
  35.         super("测试语句");
  36.         System.out.println("执行Leaf的构造器");
  37.     }
  38. }

  39. public class Test {
  40.     public static void main(String[] args) {
  41.         new Leaf();
  42.         new Leaf();
  43.     }
  44. }<p></p>
复制代码
结果是:
Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:测试语句
Leaf的普通初始化块
执行Leaf的构造器
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:测试语句
Leaf的普通初始化块
执行Leaf的构造器

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1 加油

查看全部评分

10 个回复

倒序浏览
静态代码块优先加载~~~
回复 使用道具 举报
空洞的望着窗外 发表于 2015-3-9 23:02
静态代码块优先加载~~~

为啥普通初始化块也在构造函数前运行
回复 使用道具 举报
有那么复杂吗
回复 使用道具 举报
类一加载静态代码块就出来了,只执行一次,然后每new一个对象代码块运行,然后是构造函数
回复 使用道具 举报
静态语句快在类加载的时候就加载进来,只有一次,普通语句快和 构造方法是new对象的时候才有
回复 使用道具 举报
lwj123 金牌黑马 2015-3-10 22:52:25
7#
我也是有点晕晕的
回复 使用道具 举报
静态代码块随着类的加载而加载,所以不管是父类的或是子类的静态代码块都会先运行
回复 使用道具 举报
我先给你分析一下我写的程序,然后再看你的。你可能就会明白了
  1. public class Day08_1{
复制代码
最后的执行顺序是这样的* 代码块的执行顺序
* 1.Day08_1的静态代码块执行了
2.main函数执行了
3.Student的静态代码块执行了
4.构造代码块执行了
5.构造函数执行了
6.构造代码块执行了
分析:当JVM要想执行一个程序时,1.首先要找main方法,于是Day_8类就加载到了内存,静态代码块是一个类加载到内存时执行的,也就是类初始化的。所以1.Day08_1的静态代码块执行了第一个执行;2.接着main方法执行,于是2.main函数执行了执行了;3.接着new Student()时,Student类加载到了内存,所以3.Student的静态代码块执行了(并且只执行一次);4,接着new Sutdent()时,{}括起来的是对象初始化代码块,里面都是所有对象共有的内容,先于构造函数执行,所以构造代码块执行了,(并且每次调构造函数都会执行);5.构造函数执行了;6.构造代码块执行了


回复 使用道具 举报
android-liu 发表于 2015-3-10 23:22
我先给你分析一下我写的程序,然后再看你的。你可能就会明白了最后的执行顺序是这样的* 代码块的执行顺序[/ ...

首先谢谢你的解答,好像代码不全吧,只看到了第一行。。。
回复 使用道具 举报
  1. package com.xiangying;

  2. public class Day08_1 {

  3.         /**
  4.          * 代码块的执行顺序
  5.          *  1.Day08_1的静态代码块执行了
  6.                 2.main函数执行了
  7.                 3.Student的静态代码块执行了
  8.                 4.构造代码块执行了
  9.                 5.构造函数执行了
  10.                 6.构造代码块执行了
  11.          */
  12.        
  13.         public static void main(String[] args) {
  14.                 System.out.println("main函数执行了");
  15.                 Student s=new Student();
  16.                 Student s1=new Student();

  17.         }
  18. static {
  19.                
  20.                 System.out.println("Day08_1的静态代码块执行了");
  21.         }

  22. }
  23. class Student{
  24.         {
  25.                 System.out.println("构造代码块执行了");
  26.                
  27.         }
  28.         static{
  29.                 System.out.println("Student的静态代码块执行了");
  30.         }

  31.         public Student(){
  32.                 System.out.println("构造函数执行了");
  33.         }
  34.        
  35.        
  36.        
  37. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马