您的位置:首页 > 编程语言

关于静态代码块,非静态代码块,构造函数的多态表现问题

2016-08-16 22:37 323 查看
先看一段代码

public class Test1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Parent p = new Child();
System.out.println(p.age);
p.print();
}

}


public class Parent {
int age = 25;
static{
System.out.println("这里是父类的静态初始化块");
}
{
System.out.println("这里是父类的非静态初始化块");
}
public Parent(){
System.out.println("这里是父类的构造函数");
}
public void print()
{
System.out.println("这里是父类");
}

}


public class Child extends Parent {
int age = 10;
static{
System.out.println("这里是子类的静态初始化块");
}
{
System.out.println("这里是子类的非静态初始化块");
}
public Child(){
System.out.println("这里是子类的构造函数");
}
public void print()
{
System.out.println("这里是子类");
}
}


关于静态代码块大家都知道,当类的对象创建的时候首次加载并且只加载一次,其次是非静态代码块,最后是构造函数。输出是这样的:

这里是父类的静态初始化块
这里是父类的非静态初始化块
这里是父类的构造函数
25
这里是父类


那么继承此类后也就是这里的Child();当父类的引用指向子类的实例对象的时候,这时的输出是这样的:

这里是父类的静态初始化块
这里是子类的静态初始化块
这里是父类的非静态初始化块
这里是父类的构造函数
这里是子类的非静态初始化块
这里是子类的构造函数
25
这里是子类


可以发现子类的静态初始化块先于父类的非静态初始化块,为什么,参考:

http://blog.csdn.net/xuxurui007/article/details/7749671

可知:要看类中是否有静态的变量和语句,如果有,先给这些静态的变量分配存储空间和执行静态语句(不是静态方法),且由于类的父类中也有静态的变量,根据继承的特性,则先执行父类Parent的静态数据的初始化,然会执行子类的静态数据的初始化。

总结:

有静态就先静态(先父后子),(非静态+构造函数)(先父后子);

父->子。静态>非静态>构造。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多态 静态代码块