变量、初始化块和构造方法的初始化顺序问题(笔试题)
来源:互联网 发布:萧山网络问政南阳 编辑:程序博客网 时间:2024/05/22 01:33
在某公司面试时碰见的该题目,
给出如下程序,让写出程序打印的语句的顺序,也就是程序加载执行的过程。
当时确实有些懵了,只根据大体印象写了答案。回来后写程序跑了一遍,自己还真是没猜对。所以贴出来帮助记忆并与大家共赏!!
package com.skd.timu;public class Demo4 {public static void main(String[] args) {new childrenDemo();new childrenDemo();}}class ParentDemo{ staticString staParentString="父类-静态-变量"; String parentString="父类-非静态-变量"; static{ System.out.println(staParentString); System.out.println("父类 - 静态 - 初始化块"); } { System.out.println(parentString); System.out.println("父类 - 非静态 - 初始化块"); } ParentDemo(){ System.out.println("父类-构造方法"); }}class childrenDemo extends ParentDemo{staticString staChildrenString="子类-静态-变量"; String childrenString="子类-非静态-变量"; static{ System.out.println(staChildrenString); System.out.println("子类 - 静态 - 初始化块"); } { System.out.println(childrenString); System.out.println("子类- 非静态 - 初始化块"); } childrenDemo(){ System.out.println("子类-构造方法"); }}
看完该程序不妨自己先写个输出语句的顺序然后写程序执行看是否与自己的判断一致。
先把程序执行的结果贴上:
父类-静态-变量父类 - 静态 - 初始化块子类-静态-变量子类 - 静态 - 初始化块父类-非静态-变量父类 - 非静态 - 初始化块父类-构造方法子类-非静态-变量子类- 非静态 - 初始化块子类-构造方法父类-非静态-变量父类 - 非静态 - 初始化块父类-构造方法子类-非静态-变量子类- 非静态 - 初始化块子类-构造方法
构造块的加载顺序在静态块之后但在构造方法之前,而且在构造块加载之前,变量已经加载;
构造方法是在静态变量,静态块,变量,构造块后才加载的,是在类实例化时,除了调用方法外的最后加载的位置;
因为静态变量和静态块都是全局的,因此在程序加载时就已经加载,不会因为是子类中的静态变量和静态块就比父类的构造块加载晚,但在都是静态变量或静态块的情况下,
总是先初始化父类的,然后初始化子类的。
同样的因为构造块和构造方法不是全局的,而且子类在实例化时总是先调用父类的构造块和构造方法,因此父类的构造块和构造方法在子类的之前调用。即在实例化子类时,程序会先调用父类的实例化构造块或者构造方法,然后才会调用子类的构造块和构造方法完成子类的实例化。
而且,构造块和构造方法会在每次实例化的时候都执行,静态变量和静态块只会执行一次(不管该类实例化多少对象)。
0 0
- 变量、初始化块和构造方法的初始化顺序问题(笔试题)
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
- Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造方法)
- Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)
- 初始化块和构造器的执行顺序问题
- [转] Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)
- 【转】Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)
- 【转】Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)
- Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器
- MySQL 5.7 Fabric: any good?
- 解决eclipse中org.w3c.dom.Node类老报The method getTextContent() is undefined 问题
- 数据库的设计原则
- 【leetcode】 Maximum Gap
- 黑马程序员--OC-内存
- 变量、初始化块和构造方法的初始化顺序问题(笔试题)
- x264使用示例 /** * @note x264的编码示例. * 使用x264的 (2013-07-03 10:40:12)
- C++之“友元类”学习笔记
- 每个人都宣称自己是别人——http协议useragent的历史变迁
- ADB server didn't ACK * failed to start daemon *
- easyUI文本框
- 解题报告 之 HDU5115 Dire Wolf
- JavaScript之面向对象程序设计
- animal项目布局