java中类的初始化顺序

一般初始化:

1.没有继承

静态变量、静态初始化块 --> 变量、变量初始化块–>构造方法

2.有继承的情况

父类静态变量、父类静态初始化块–>子类静态变量、子类静态初始化块–>父类变量初始化、父类变量初始化块–>父类构造方法–>子类变量初始化、子类变量初始化块–>子类构造方法–>调用的其他非静态的方法们

  • 静态的先于非静态执行

普通示例:

定义父类Animal :
public class Animal {

    static int num1 = 1;
    //静态语句块
    static {
        System.out.println("父类静态语句块1"+",num1值:"+num1);
    }
    //非静态语句块
    {
        System.out.println("父类非静态语句块1"+",num1值:"+num1+",num2值:"+num2);
    }

    //静态语句块
    static {
        num1 = 3;
        System.out.println("父类静态语句块3"+",num1值:"+num1);
    }

    //非静态语句块
    {
        System.out.println("父类非静态语句块2"+",num1值:"+num1+",num2值:"+num2);
    }
    static int num2 = 2;
    //静态语句块
    static {
        System.out.println("父类静态语句块2"+",num1值:"+num1+",num2值:"+num2);
    }

    //非静态方法
    public void notStaticMethod() {
        System.out.println("父类非静态方法1");
    }

    //静态方法
    public static void staticMethod() {
        System.out.println("父类静态方法1");
    }

    //无参构造函数
    public Animal() {
        System.out.println("父类构造函数");
    }


    //一般静态方法
    public static void animalStaticTest(){
        System.out.println("父类一般静态方法");
    }

    //一般非静态方法
    public void animalTest(){
        System.out.println("父类一般非静态方法");
    }

    //一般非静态方法
    public void animalTest2(){
        System.out.println("父类一般非静态方法2");
    }
    }
定义子类dog:
public class Dog extends Animal {

    public static void main(String args[]) {

        Animal dog = new Dog();
        dog.animalTest();
        dog.animalTest2();

    }
    //一般非静态方法
    @Override
    public void animalTest2(){
        System.out.println("子类一般非静态方法2(重写了)");
    }

    //静态语句块
    static {
        System.out.println("子类静态语句块1");
    }
    //非静态语句块
    {
        System.out.println("子类非静态语句块2");
    }

    //静态语句块
    static {
        System.out.println("子类静态语句块3");
    }



    //非静态语句块
    {
        System.out.println("子类非静态语句块1");
    }



    //非静态方法
    public void dogTest() {
        System.out.println("子类非静态方法1");
    }

    //静态语句块
    static {
        System.out.println("子类静态语句块2");
    }
    //静态方法
    public static void dogStaticTest() {
        System.out.println("子类静态方法");
        return;
    }

    //构造函数
    public Dog() {
        System.out.println("子类构造函数");
    }


}
运行结果:
父类静态语句块1,num1值:1
父类静态语句块3,num1值:3
父类静态语句块2,num1值:3,num2值:2
子类静态语句块1
子类静态语句块3
子类静态语句块2
父类非静态语句块1,num1值:3,num2值:2
父类非静态语句块2,num1值:3,num2值:2
父类构造函数
子类非静态语句块2
子类非静态语句块1
子类构造函数
父类一般非静态方法
子类一般非静态方法2(重写了)

增加内部类后,初始化

定义父类Animal :

Animal 中有内部类AnimalInner

public class Animal {

    static int num1 = 1;
    //静态语句块
    static {
        System.out.println("父类静态语句块1"+",num1值:"+num1);
    }
    //非静态语句块
    {
        System.out.println("父类非静态语句块1"+",num1值:"+num1+",num2值:"+num2);
    }

    //静态语句块
    static {
        num1 = 3;
        System.out.println("父类静态语句块3"+",num1值:"+num1);
    }

    //非静态语句块
    {
        System.out.println("父类非静态语句块2"+",num1值:"+num1+",num2值:"+num2);
    }
    static int num2 = 2;
    //静态语句块
    static {
        System.out.println("父类静态语句块2"+",num1值:"+num1+",num2值:"+num2);
    }

    //非静态方法
    public void notStaticMethod() {
        System.out.println("父类非静态方法1");
    }

    //静态方法
    public static void staticMethod() {
        System.out.println("父类静态方法1");
    }

    //无参构造函数
    public Animal() {
        System.out.println("父类构造函数");
    }


    //一般静态方法
    public static void animalStaticTest(){
        System.out.println("父类一般静态方法");
    }

    //一般非静态方法
    public void animalTest(){
        System.out.println("父类一般非静态方法");
    }

    //一般非静态方法
    public void animalTest2(){
        System.out.println("父类一般非静态方法2");
    }


    protected class AnimalInner {
        public AnimalInner() {
            System.out.println("父类构造器-内部类");
        }

        public void animalInnerTest() {
            System.out.println("父类一般非静态方法-内部类");
        }
        ///非静态语句块
        {
            System.out.println("父类非静态语句块5-内部类"+",num1值:"+num1+",num2值:"+num2);
        }

    }

    private AnimalInner y = new Animal.AnimalInner();
    public void insertYolk(AnimalInner yy) {
        y = yy;
    }
    public void g() {
        y.animalInnerTest();
    }
}
定义子类cat:

Cat中的内部类CatInner继承Animal.AnimalInner

public class Cat extends Animal {

    public static void main(String args[]) {

        Animal cat = new Cat();
        cat.animalTest();
        cat.animalTest2();

    }

    protected class CatInner extends Animal.AnimalInner{
        public CatInner() {
            System.out.println("子类构造器-内部类");
        }

        @Override
        public void animalInnerTest() {
            System.out.println("子类一般非静态方法-内部类(重写了)");
        }
        ///非静态语句块
        {
            System.out.println("子类非静态语句块5-内部类"+",num1值:"+num1+",num2值:"+num2);
        }
    }

    //一般非静态方法
    @Override
    public void animalTest2(){
        System.out.println("子类一般非静态方法2(重写了)");
    }

    //静态语句块
    static {
        System.out.println("子类静态语句块1");
    }
    //非静态语句块
    {
        System.out.println("子类非静态语句块2");
    }

    //静态语句块
    static {
        System.out.println("子类静态语句块3");
    }



    //非静态语句块
    {
        System.out.println("子类非静态语句块1");

    }



    //非静态方法
    public void dogTest() {
        System.out.println("子类非静态方法1");
    }

    //静态语句块
    static {
        System.out.println("子类静态语句块2");
    }
    //静态方法
    public static void dogStaticTest() {
        System.out.println("子类静态方法");
        return;
    }

    //构造函数
    public Cat() {
        System.out.println("子类构造函数");
        insertYolk(new Cat.CatInner());
    }

}
运行结果:
父类静态语句块1,num1值:1
父类静态语句块3,num1值:3
父类静态语句块2,num1值:3,num2值:2
子类静态语句块1
子类静态语句块3
子类静态语句块2
父类非静态语句块1,num1值:3,num2值:2
父类非静态语句块2,num1值:3,num2值:2
父类非静态语句块5-内部类,num1值:3,num2值:2
父类构造器-内部类
父类构造函数
子类非静态语句块2
子类非静态语句块1
子类构造函数
父类非静态语句块5-内部类,num1值:3,num2值:2
父类构造器-内部类
子类非静态语句块5-内部类,num1值:3,num2值:2
子类构造器-内部类
父类一般非静态方法
子类一般非静态方法2(重写了)
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值