关于静态代码块,非静态代码块,构造函数的多态表现问题
2016-08-16 22:37
323 查看
先看一段代码
关于静态代码块大家都知道,当类的对象创建的时候首次加载并且只加载一次,其次是非静态代码块,最后是构造函数。输出是这样的:
那么继承此类后也就是这里的Child();当父类的引用指向子类的实例对象的时候,这时的输出是这样的:
可以发现子类的静态初始化块先于父类的非静态初始化块,为什么,参考:
http://blog.csdn.net/xuxurui007/article/details/7749671
可知:要看类中是否有静态的变量和语句,如果有,先给这些静态的变量分配存储空间和执行静态语句(不是静态方法),且由于类的父类中也有静态的变量,根据继承的特性,则先执行父类Parent的静态数据的初始化,然会执行子类的静态数据的初始化。
总结:
有静态就先静态(先父后子),(非静态+构造函数)(先父后子);
父->子。静态>非静态>构造。
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的静态数据的初始化,然会执行子类的静态数据的初始化。
总结:
有静态就先静态(先父后子),(非静态+构造函数)(先父后子);
父->子。静态>非静态>构造。
相关文章推荐
- C#与.net高级编程 C#的多态介绍
- C#中面向对象编程机制之多态学习笔记
- C#中的多态深入理解
- C#中多态、重载、重写区别分析
- 设计引导--一个鸭子游戏引发的设计理念(多态,继承,抽象,接口,策略者模式)
- C# 面向对象三大特性:封装、继承、多态
- javascript每日必学之多态
- c#基础学习之多态
- PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
- 从汇编看c++中多态的应用
- javascript 面向对象全新理练之继承与多态
- Java多态的使用注意事项
- C#使用虚拟方法实现多态
- 实例讲解PHP面向对象之多态
- C#中多态现象和多态的实现方法
- 从汇编看c++中的多态详解
- C++基础之this指针与另一种“多态”
- 深入解析C++中的虚函数与多态
- C++多态的实现及原理详细解析
- PHP5中实现多态的两种方法实例分享