类的初始化顺序

上传人:hs****ma 文档编号:561208533 上传时间:2023-03-02 格式:DOCX 页数:12 大小:17.40KB
返回 下载 相关 举报
类的初始化顺序_第1页
第1页 / 共12页
类的初始化顺序_第2页
第2页 / 共12页
类的初始化顺序_第3页
第3页 / 共12页
类的初始化顺序_第4页
第4页 / 共12页
类的初始化顺序_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《类的初始化顺序》由会员分享,可在线阅读,更多相关《类的初始化顺序(12页珍藏版)》请在金锄头文库上搜索。

1、大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类 里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变 量值输出到控制台的代码,然后让我们判断输出的结果。这实际上是在考查我们对于继承情况下类的初始 化顺序的了解。我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是静 态变量静态初始化块变量初始化块构造器。我们也可以通过下面的测试代码来验证这一点: Java 代码public class InitialOrderTest / 静态变量public static String

2、staticField = 静态变量;/ 变量public String field = 变量;/ 静态初始化块static System.out.println(staticField);System.out.p rintln(静态初始化块);/ 初始化块System.out.println(field);System.out.p rintln(初始化块);/ 构造器public InitialOrderTest() System.out.p rintln(构造器);public static void main(String args) new InitialOrderTest();pub

3、lic class InitialOrderTest / 静态变量public static String staticField = 静态变量;/ 变量public String field = 变量;/ 静态初始化块static System.out.println(staticField);System.out.p rintln(静态初始化块);/ 初始化块System.out.println(field);System.out.p rintln(初始化块);/ 构造器public InitialOrderTest() System.out.p rintln(构造器);public st

4、atic void main(String args) new InitialOrderTest();运行以上代码,我们会得到如下的输出结果:静态变量静态初始化块变量初始化块构造器这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果Java 代码class Parent / 静态变量public static String p_StaticField = 父类-静态变量;/ 变量public String p_Field = 父类-变量;/ 静态初始化块static System.out.println(p_StaticField);System.out.

5、p rintln(父类-静态初始化块);/ 初始化块System.out.println(p_Field);System.out.p rintln(父类-初始化块);/ 构造器public Parent() System.out.p rintln(父类-构造器);public class SubClass extends Parent / 静态变量public static String s_StaticField = 子类-静态变量;/ 变量public String s_Field = 子类-变量;/ 静态初始化块static System.out.println(s_StaticFiel

6、d);System.out.p rintln(子类-静态初始化块);/ 初始化块System.out.println(s_Field);System.out.p rintln(子类-初始化块);/ 构造器public SubClass() System.out.p rintln(子类-构造器);/ 程序入口public static void main(String args) new SubClass();class Parent / 静态变量public static String p_StaticField = 父类-静态变量;/ 变量public String p_Field = 父类

7、-变量;/ 静态初始化块 static System.out.println(p_StaticField);System.out.p rintln(父类-静态初始化块);/ 初始化块System.out.println(p_Field); System.out.p rintln(父类-初始化块);/ 构造器public Parent() System.out.p ri ntln(父类-构造器);public class SubClass extends Parent / 静态变量public static String s_StaticField = 子类-静态变量;/ 变量public St

8、ring s_Field = 子类-变量;/ 静态初始化块 static System.out.println(s_StaticField); System.out.p rintln(子类-静态初始化块);/ 初始化块System.out.println(s_Field); System.out.p rintln(子类-初始化块);/ 构造器public SubClass() System.out.p ri ntln(子类-构造器);/ 程序入口public static void main(String args) new SubClass();运行一下上面的代码,结果马上呈现在我们的眼前:

9、父类-静态变量 或 父类-静态初始化块子类-静态变量 或 子类-静态初始化块父类-变量父类-初始化块父类-构造器子类-变量子类-初始化块子类-构造器现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类 的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之 前就完成了。 静态变量和静态初始化块根据在类中定义的顺序执行!分析如下程序类初始化过程:例子 1:class Insectprivate int i=9;protected int j;Insect()System.out.println(i=+i+,j=+j);

10、j=37;private static int x1=print(static Insect.x1.initialized);static int print(String s)System.out.println(s);return 47;public class Bettle extends Insectprivate int k=print(Bettle.k initialized);public Bettle()System.out.println(k=+k);System.out.println(j=+j);private static int x2=print(static Ins

11、ect.x2 initialized);public static void main(String args)System.out.println(Bettle constructor);Bettle b=new Bettle();运行结果:static Insect.x1.initializedstatic Insect.x2 initializedBettle constructori=9,j=0Bettle.k initializedk=47j=37static 成员在 Beetle 构造器还没有调用时就加载Bettie运行这个就先加载父类,即加载In sect,在加载In sect先

12、运行所有的Static代码(函 数建立,但不运行),运行下面这一句private static int x1=print(static Insect.x1.initiaiized);加载完成后加载 Bettie然后进入Main(),运行System.out.printin(Bettie constructor);再运行 Bettie b=new Bettie(); 新建时加新建父类,加载类时,先把所有属性设为初始值(string 为空串,数字为 0),如果你定义了值,再赋值,如private int i=9;然后运行构造函数System.out.printin(i=+i+,j=+j);加载完父

13、类再加载子类同上,先设定义值private int k=print(Bettie.k initiaiized);然后运行构造函数例子 2:/* author 潘宝坤 * version 1.0 创建时间: 2006-11-23 下午 02:49:16* 类说明* 父类初始化时会调用子类的重载的函数* jvm 先加载类对象,再实例化对象* 类级别的东西先加载* 所以初始化的顺序是: 先父类静态后子类静态;先父类定义初始化* 父类构造函数初始化,再子类定义初始化,再子类构造函数初始化* 如果在初始化时父类调用了父类中被子类重载的方法,那么执行的是子类的方法* 所以要注意 : 不要在定义初始化时调用

14、函数,这样不安全 ,因为无法预知子类重载的方法* 是否是安全的* 如果子类没有使用 super 关键字显式地调用父类指定的构造函数* 那么会调用缺省的无参构造函数*/class Fatherprivate int i=getI();private int j=getFM();private static int k=getK(); public int getI() System.out.p rintln(父类定义初始化有重载); return 0;private static int getK() System.out.p rintln(父类静态定义初始化);return 0;private int getFM() System.out.p rintln(父类定义初始化无重载);return 0;public Father()get

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号