zoukankan      html  css  js  c++  java
  • Java中static成员变量、成员变量、static代码块、代码块、构造方法的执行顺序

    执行顺序的规则:

    一、先执行内部静态对象的构造方法,如果有多个按定义的先后顺序执行;静态对象在构造的时候也是也先执行其内部的静态对象。

    二、再调用父类的构造方法(父类还有父类的话,从最开始的基类开始调用),如果没有明显指定调用父类自定义的构造方法,那么编译器会调用默认的父类构造方法super()。但是如果要调用父类自定义的构造方法,要在子类的构造方法中明确指定。

    三、按声明顺序将成员引用对象变量初始化。

    四、最后调用自身的构造方法。

    五、同一个类中的static代码块,代码块,构造函数的执行顺序此顺序执行,static代码块与代码块的区别是static代码块只执行一次。

    下面以一个例子来说明代码如下:

    package com.dxz;
    
    class Animal {
        String name;
    
        Animal() {
            System.out.println("class Animal default construct");
        }
    
        Animal(String name) {
            this.name = name;
            System.out.println(name + " class Animal construct");
            printNumber();
        }
    
        public void printNumber() {
    
        }
    }
    package com.dxz;
    
    public class Fish extends Animal {
        Fish() {  
            System.out.println("class Fish");  
        }
    }
    
    package com.dxz;
    
    public class GoldFish extends Fish {
        GoldFish() {  
            System.out.println("class GoldFish");  
        }  
    }
    
    package com.dxz;
    
    public class Cat {
        Cat(){  
            System.out.println("class cat");  
        }
    }
    
    
    package com.dxz;
    
    public class Rabbit {
        private static int number;
        private static Cat cat = new Cat();//静态成员先执行
        
        public Rabbit() {  
            number++;  
            System.out.println(number + "class rabbit");  
        }
        
        static {
            System.out.println("static Rabbit");
        }
        
        {
            System.out.println("I'm a Rabbit");
        }
    }
    package com.dxz;
    
    public class Dog extends Animal {
        public int dogNumber;  
        private GoldFish goldFish = new GoldFish();  
        static  Rabbit blackRabbit = new Rabbit();   
        static  Rabbit whiterabbit = new Rabbit();   
          
        public Dog() {
            super("super Tom");  
            System.out.println("class Dog");  
            dogNumber = 10;  
            System.out.println("The dog's number is:" + dogNumber);  
        }  
          
        public void printNumber(){  
            System.out.println("The dog's number is:" + dogNumber);  
        }  
    }
    package com.dxz;
    
    public class TestInheritanceConstructor extends Animal {
        public static void main(String[] args){ 
            System.out.println("---------------begin---------");
            new Dog(); 
        }  
    }
    
    //结果:
    1:---------------begin---------
    2:class cat 
    3:static Rabbit
    4:I'm a Rabbit
    5:1class rabbit
    6:I'm a Rabbit
    7:2class rabbit
    8:super Tom class Animal construct
    9:The dog's number is:0
    10:class Animal default construct
    11:class Fish
    12:class GoldFish
    13:class Dog
    14:The dog's number is:10

    解释:

    输出第2行:class cat  是因为Dog类中有静态成员。而静态成员所在的类Rabbit中又有静态成员。所以最先执行它。验证第一句。

    输出第5、7行:1class rabbit 和 2class rabbit 是执行类Rabbit构造函数。

    输出第3、4、5、6、7行:同一个类中static代码块,代码块,构造函数的执行顺序及static代码块只执行一次。验证第五句。

    输出第8行:super Tom class Animal construct 执行父类的构造函数,因为用super("")。

    输出第9行:The dog's number is:0 可以看出子类的dogNumber还是默认值0

    输出第10、11、12行:class Animal default construct和 class Fish 和 class GoldFish是构造goldFish引用对象类型。验证第三句。

    输出第13、14行:class Dog  和The dog's number is:10是执行自己的构造函数。

  • 相关阅读:
    20199320 2019-2020-2 《网络攻防实践》第2周作业
    20199320 2019-2020-2 《网络攻防实践》第1周作业
    20199320 《网络攻防实践》假期作业
    第二周测试补交-myod
    20199320《Linux内核原理与分析》第十二周作业
    第六周测试补交-sumN
    20199320《Linux内核原理与分析》第十一周作业
    2019-2020-1 20199320《Linux内核原理与分析》第九周作业
    20199309 《网络攻防实践》 综合实践
    20199309 2019-2020-2 《网络攻防实践》第十一周作业
  • 原文地址:https://www.cnblogs.com/duanxz/p/2806666.html
Copyright © 2011-2022 走看看