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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lovecx24 中级黑马   /  2013-11-30 21:51  /  1460 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Parent {     
  2.      public static String p_StaticField = "父类--静态变量";   
  3.      public String p_Field = "父类--变量";      
  4.      // 下面这些是干什么的?解释以下,不是很明白
  5.      static {   
  6.           System.out.println(p_StaticField);   
  7.           System.out.println("父类--静态初始化块");   
  8.       }      
  9.      // 下面这是干什么的?不明白?为什么这么写     
  10.       {   
  11.           System.out.println(p_Field);   
  12.           System.out.println("父类--初始化块");   
  13.       }      
  14.      public Parent() {   
  15.           System.out.println("父类--构造器");   
  16.       }   
  17. }      
  18. public class SubClass extends Parent {   
  19.      public static String s_StaticField = "子类--静态变量";
  20.      public String s_Field = "子类--变量";   
  21.      // 静态初始化块   
  22.      static {   
  23.           System.out.println(s_StaticField);   
  24.           System.out.println("子类--静态初始化块");   
  25.       }   
  26.       {   
  27.           System.out.println(s_Field);   
  28.           System.out.println("子类--初始化块");   
  29.       }        
  30.      public SubClass() {   
  31.           System.out.println("子类--构造器");   
  32.       }      
  33.      public static void main(String[] args) {
  34.         new Parent();
  35.        System.out.println("-------------------");
  36.         new SubClass();
  37.         System.out.println("-------------------");
  38.         new SubClass();  
  39.       }   
  40. }
复制代码

程序的运行结果为:
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
-------------------
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
-------------------
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器



不明白为什么是这样的结果?把详细的执行过程讲下好吗?

评分

参与人数 1技术分 +1 黑马币 +6 收起 理由
狼王 + 1 + 6 很给力!好问题,继续努力哈。。.

查看全部评分

6 个回复

倒序浏览
我说下吧,建立子类对象时,执行顺序为,父类静态代码块,子类静态代码块,父类代码块,父类构造函数,子类代码块,子类构造函数

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报
新手来回答下吧,如有错误,恳请指正。我觉得首先有两个类Parent、SubClass,其中SubClass继承了Parent,所以SubClass也继承了Parent的成员变量和方法,其中也包括静态的。在Parent类中,static {....}是一个静态块,用于初始化,即执行静态块中的代码。然后执行static下面的输出语句属于代码块,以及定义的构造函数。同理,SubClass类中也是同样结构。最后是执行阶段:执行main函数,执行顺序为父类静态块-子类静态块-父类代码块-父类构造函数-子类代码块-子类构造函数。此外,值得注意的是,静态块只执行一次,即第一次访问时,所以得到结果的第一部分。随后的两部分只执行Parent、SubClass的代码块和构造函数,所以后两次的结果一样。

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
狼王 + 1 + 3 赞一个!新手多到论坛转转就成老手啦。。。.

查看全部评分

回复 使用道具 举报
这个结果好长,我先介绍下代码块,有三种代码块:
静态代码块-随类的加载而加载,而且只会执行一次,你创建多少对象都与它无关,只执行一次
构造代码块-对对象初始化
局部代码块-控制变量的生命周期
我想你不理解的是代码块的执行顺序:静态代码块>构造代码块>局部代码块--(构造方法里方法体那部分就是局部代码块)

还有一点,子类继承父类,在子类创建对象时要调用子类的构造方法,而每个子类的构造方法中都有一个super()方法,

这个super()方法调用父类的 无参构造方法 ,所以创建子类对象的顺序是:
父类构造方法-子类构造方法

因为有了静态代码块和构造代码块的出现
父类的静态代码块-父构造代码块-父类构造方法-子类的静态代码块-子构造代码块-子类构造方法

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
狼王 + 1 + 3 不错哦

查看全部评分

回复 使用道具 举报
呵呵!回答下楼主代码中的问题:
  1. static{
  2. }
复制代码

静态代码块的作用:给类进行初始化,随着类的加载而执行,只执行一次,是优先于主函数执行的。
  1. {
  2. }
复制代码

构造代码块的作用:给对象进行初始化,它和构造函数是有区别的,构造函数
只是给对应的对象初始化,而构造代码块是给所有的对象初始化,里面定义的是
不同对象共性的初始化内容。
执行顺序楼上的同学已经说了,我就不写了

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!继续努力

查看全部评分

回复 使用道具 举报
静态初始化块、初始化块、构造方法这三个概念的执行顺序是固定的,你需要记住它的。
根据程序的不同需要去写在不同的地方

评分

参与人数 1黑马币 +3 收起 理由
狼王 + 3 赞一个!

查看全部评分

回复 使用道具 举报
L_t 中级黑马 2013-12-1 14:42:42
7#
静态属性优先级大于非静态属性,静态方法包括静态块的优先级大于非静态方法包括构造函数,在子类和父类中的执行编译顺序为由上至下

评分

参与人数 1黑马币 +3 收起 理由
狼王 + 3

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马