类和实例变量的初始化过程

关于类和实例变量初始化过程,我们直接看代码来解释比较好理解。
代码如下:

public class Father{
    private int i = test();
    private static int j = method();

    static{
        System.out.print("(1)");
    }
    Father(){
        System.out.print("(2)");
    }
    {
        System.out.print("(3)");
    }


    public int test(){
        System.out.print("(4)");
        return 1;
    }
    public static int method(){
        System.out.print("(5)");
        return 1;
    }
}
public class Son extends Father{
    private int i = test();
    private static int j = method();
    static{
        System.out.print("(6)");
    }
    Son(){
//      super();//写或不写都在,在子类构造器中一定会调用父类的构造器
        System.out.print("(7)");
    }
    {
        System.out.print("(8)");
    }
    public int test(){
        System.out.print("(9)");
        return 1;
    }
    public static int method(){
        System.out.print("(10)");
        return 1;
    }
    public static void main(String[] args) {
        Son s1 = new Son();
        System.out.println();
        Son s2 = new Son();
    }
}

执行结果如下:

(5)(1)(10)(6)(9)(3)(2)(9)(8)(7)
(9)(3)(2)(9)(8)(7)

我们根据程序执行结果来分析可以得知:

类和实例变量的初始化过程:
程序首先初始化父类,再初始化子类。
具体初始化顺序如下:
第一步首先初始化类
1)静态实例变量
2)静态代码块
3)它俩谁在程序前边谁先执行
第二步初始化类的实例变量
1)初始化非静态变量
2)非静态代码块
3)它俩谁在程序前边谁先执行
4)父构造器
5)子构造器
需要注意的是程序中的test()方法为重写的方法,Son对象在初始化时执行的是Son类里的test()方法。

非静态方法前面其实有一个默认的对象this,this在构造器(或<init>)它表示的是正在创建的对象,因为这里是在创建Son对象,所以test()执行的是子类重写的代码(面向对象多态)。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,148评论 1 32
  • 第6章 继承与多态 学习目标 了解继承的目的 了解继承与多态的关系 知道如何重写方法 认识java.lang.Ob...
    默然说话_牟勇阅读 640评论 0 0
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,881评论 2 17
  • “喂,醒醒”,听到身边有人在喊自己,叶葵慢慢的睁开眼。今天天气很好,阳光明媚,温暖的阳光从窗户照射进来,整个病房都...
    天宫狗阅读 1,551评论 18 32
  • 屋内不知春至 天热的时候才发观 夏天已经到了 忙于生计 忘了四季
    饲梦客阅读 127评论 0 0