继承中的初始化问题

 本文章重点比较了一下含有static关键词的继承关系中的初始化顺序问题,现在直接贴出需要的代码:
public class Apple {
    static private int i = 0;//只初始化一次:只有第一次新建对象时会执行
    private int k;//每次都要进行初始化
    private String s;

    public Apple(){
        k++;
        i++;
        System.out.println("applei" + i);
        System.out.println("applek" + k);
        System.out.println(s);
    }

    {
        System.out.println("defeinds" + s);
        s = "kaka";
    }
    //这块代码只有第一次新建对象时会执行
    static{
        System.out.println("statici" + i);  
        i = 4;//只有第一次初始化,之后不起作用
    }
    public static int getI() {
        return i;
    }
    public static void setI(int i) {
        Apple.i = i;
    }   
}
public class Fruit extends Apple{
    private int f = 2;
    public Fruit(){
        System.out.println("Fruit" + f);
    }

    {
        System.out.println("Fruit defeind" + f);
        f++;
    }
}
public class AppleDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Fruit();
        new Fruit();
    }
}
运行的结果:
statici0
defeindsnull
applei5
applek1
kaka
Fruit defeind2
Fruit3
defeindsnull
applei6
applek1
kaka
Fruit defeind2
Fruit3

现在写出分析结果:
知识点一:
在初始化时,static修饰的变量会被优先初始化,若存在多个static变量则按static的出现顺序初始化。
知识点二:
static变量只会在第一次创建对象的时候被初始化,之后创建的对象则不会再次对它进行初始化。
知识点三:
在调用构造器之前所有的初始化已经完成。
知识点四
在子类对象初始化前会先对父类进行初始化。
最终给出初始化顺序:
超类的静态成员(静态块)
子类的静态成员(静态块)
超类的非静态成员
超类的构造函数
子类的非静态成员
子类的构造函数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值