Java面试题:静态块、块、构造函数的初始化顺序
2014-02-26 18:29
316 查看
自己做了几遍,每次的输出结果都不一样。有时候父类的构造方法中的两个输出中竟然会穿插子类的非静态类方法体。按照网上http://blog.csdn.net/fang3081004/article/details/7764306的做法,没有再出现不稳定的情况。索性就这样总结了:
1. 单一类中:静态变量、静态块、普通变量、普通块、构造方法;
2. 有继承的子类中:先父后子。子类的静态变量和静态块会插队在父类静态块的后面,以后才严格尊重父亲大人。
创建顺序:
1。按照顺序执行父类静态变量、静态块
2。按照顺序执行子类静态变量、静态块
3。构造父类:按照顺序执行父类的普通变量、普通块
执行父类的构造函数
4。构造子类:按照顺序执行子类的普通变量、普通块
执行子类的构造函数
示例如下:(需要用debug进行调试才可以看到变量的顺序)
package ms;
public class MS_Extends {
public static void main(String[] args) {
//A a = new A();
B b = new B();
//A a = new B();
}
}
class A{
public static int a = 0;
public int b = 0;
static{
System.out.println("■父类 - 静态初始块 - 位置是构造函数前");
}
{
System.out.println("■父类 - 普通初始块 - 位置是构造函数前");
}
public A(){
System.out.println("■父类 - 构造函数");
}
static{
System.out.println("■父类 - 静态初始块 - 位置是构造函数后");
}
{
System.out.println("■父类 - 普通初始块 - 位置是构造函数后");
}
}
class B extends A{
public static int a = 0;
public int b = 0;
static{
System.out.println("◆子类 - 静态初始块 - 位置是构造函数前");
}
{
System.out.println("◆子类 - 普通初始块 - 位置是构造函数前");
}
public B(){
System.out.println("◆子类 - 构造函数");
}
static{
System.out.println("◆子类 - 静态初始块 - 位置是构造函数后");
}
{
System.out.println("◆子类 - 普通初始块 - 位置是构造函数后");
}
}
运行结果:
■父类 - 静态初始块 - 位置是构造函数前
■父类 - 静态初始块 - 位置是构造函数后
◆子类 - 静态初始块 - 位置是构造函数前
◆子类 - 静态初始块 - 位置是构造函数后
■父类 - 普通初始块 - 位置是构造函数前
■父类 - 普通初始块 - 位置是构造函数后
■父类 - 构造函数
◆子类 - 普通初始块 - 位置是构造函数前
◆子类 - 普通初始块 - 位置是构造函数后
◆子类 - 构造函数
1. 单一类中:静态变量、静态块、普通变量、普通块、构造方法;
2. 有继承的子类中:先父后子。子类的静态变量和静态块会插队在父类静态块的后面,以后才严格尊重父亲大人。
创建顺序:
1。按照顺序执行父类静态变量、静态块
2。按照顺序执行子类静态变量、静态块
3。构造父类:按照顺序执行父类的普通变量、普通块
执行父类的构造函数
4。构造子类:按照顺序执行子类的普通变量、普通块
执行子类的构造函数
示例如下:(需要用debug进行调试才可以看到变量的顺序)
package ms;
public class MS_Extends {
public static void main(String[] args) {
//A a = new A();
B b = new B();
//A a = new B();
}
}
class A{
public static int a = 0;
public int b = 0;
static{
System.out.println("■父类 - 静态初始块 - 位置是构造函数前");
}
{
System.out.println("■父类 - 普通初始块 - 位置是构造函数前");
}
public A(){
System.out.println("■父类 - 构造函数");
}
static{
System.out.println("■父类 - 静态初始块 - 位置是构造函数后");
}
{
System.out.println("■父类 - 普通初始块 - 位置是构造函数后");
}
}
class B extends A{
public static int a = 0;
public int b = 0;
static{
System.out.println("◆子类 - 静态初始块 - 位置是构造函数前");
}
{
System.out.println("◆子类 - 普通初始块 - 位置是构造函数前");
}
public B(){
System.out.println("◆子类 - 构造函数");
}
static{
System.out.println("◆子类 - 静态初始块 - 位置是构造函数后");
}
{
System.out.println("◆子类 - 普通初始块 - 位置是构造函数后");
}
}
运行结果:
■父类 - 静态初始块 - 位置是构造函数前
■父类 - 静态初始块 - 位置是构造函数后
◆子类 - 静态初始块 - 位置是构造函数前
◆子类 - 静态初始块 - 位置是构造函数后
■父类 - 普通初始块 - 位置是构造函数前
■父类 - 普通初始块 - 位置是构造函数后
■父类 - 构造函数
◆子类 - 普通初始块 - 位置是构造函数前
◆子类 - 普通初始块 - 位置是构造函数后
◆子类 - 构造函数
相关文章推荐
- Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序
- Java面试题:继承中静态块、块、构造函数的创建顺序
- Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序
- JAVA面试题解惑系列(一)——类的初始化顺序
- java 面试题解惑一 类的初始化顺序
- JAVA面试题解惑系列(一)——类的初始化顺序
- java的静态属性,静态块,构造函数的执行顺序
- Java中静态代码块、非静态代码块以及构造函数的初始化顺序
- Java初始化顺序总结及其程序执行过程图- 静态变量、静态代码块、成员变量、构造函数
- JAVA面试题解惑系列(一)——类的初始化顺序
- 黑马程序员-java中构造函数、构造代码块、静态代码块及它们的初始化顺序
- (Java)静态块、静态变量、类变量、构造函数、main方法在Jvm的创建顺序
- java变量,初始化快,构造函数的执行顺序
- java基础-显示代码,构造代码块 , 构造函数的初始化顺序
- java 静态块、非静态块、静态函数、构造函数 执行顺序
- java 静态块、非静态块、静态函数、构造函数 执行顺序
- Java类静态属性、静态块、非静态属性、非静态块、构造函数在初始化时的执行顺序
- JAVA面试题解惑系列(一)——类的初始化顺序
- java经典面试题(类加载和初始化顺序)