Java继承和初始化顺序

平时就正常的使用的Java继承什么的,不是很注意初始化的顺序什么的。有时候在一些面试题中可能会碰到继承的初始化顺序题目。发现自己对java初始化的过程还是有点模糊。趁放假补一下java一些基础知识。了解包括继承在内的初始化过程,以对所发生的一切有全局性的把握,对我们还是很有益的

   拿Java编程思想的一个例子来说明一些。看一下代码: 
    package com.yangwenjie.test;

/**
 * Created with IntelliJ IDEA
 *
 * @author yangwenjie
 * @date 2016/4/3 23:25
 */
public class Insect {
    private int i = 9;
    protected int j;
    public Insect(){
        System.out.println("i="+i+"  j="+j);
        j = 39;
    }

    private static int x1 = printInt("static Insect.x1 initialized");
    static int printInt(String s){
        System.out.println(s);
        return 47;
    }
}
package com.yangwenjie.test;

/**
 * Created with IntelliJ IDEA
 *
 * @author yangwenjie
 * @date 2016/4/3 23:29
 */
public class Beetle extends Insect {
    private int k = printInt("Beetle.k initialized");

    public Beetle(){
        System.out.println("k="+k+"  j="+j);
    }

    private static int x2 = printInt("static Beetle.x2 initialized");

    public static void main(String[] args) {
        System.out.println("Beetle 构造方法");
        Beetle beetle = new Beetle();
    }
}


改程序输出如下:
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle 构造方法
i=9  j=0
Beetle.k initialized
k=47  j=39

一般来说“类的代码在初次使用时才会加载”。这通常是指加载发生于创建类的第一个对象时,但是当访问static属性和方法时也会加载。当然定义为static的东西只会初始化一次。

上面例子初始化的过程是这样的

  1. 运行Beetle.java 的时候,由于调用了Beetle的main方法(static方法),于是开始加载Beetle.class 但是编译器通过extends关键字发现了它有一个父类,于是就加载Insect.class (不管你是否想产生该父类的一个对象,这都要发生的。如果该父类还有他自己的父类,那么第二个父类也会加载进来,如此类推。接下来,根父类的static初始化,在本例中是Insect)即会执行,后面就是下一个父类,以此类推。)于是就是就会打印
    static Insect.x1 initialized
    static Beetle.x2 initialized
    初始化工作完成之后,就执行main方法体里面的System.out.println(“Beetle 构造方法”);于是打印了
    Beetle 构造方法
    执行到Beetle beetle = new Beetle();的时候,由于static刚才已经初始化一次就不会再初始化了。会首先调用父类Insect的构造方法,再初始化自己的属性,最后调用自己的构造方法。就打印了
    i=9 j=0
    Beetle.k initialized
    k=47 j=39
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值