zoukankan      html  css  js  c++  java
  • 构造函数,构造代码块,静态函数的执行顺序

    静态代码块》构造代码块》构造函数》普通代码块

    当调用静态内部列时,并不会引起外部类的初始化

    https://blog.csdn.net/qq_27093465/article/details/75339803

    1:调用类中的字段

    package functionExecutionSequence;
    
    /**
     * @program: GradleTestUseSubModule
     * @author: Yafei Li
     * @create: 2018-09-10 15:22
     **/
    public class ClassA {
        public static void main(String[] args){
    
    //        System.out.println("ClassA");
            System.out.println(ClassC.str);
    //        System.out.println("----------------------------");
    //        ClassC c=new ClassC();
    //        System.out.println(c.str);
        }
    
        static {
            System.out.println("staticClassA");
        }
        {
            System.out.println("contructClassA");
        }
    
        ClassA(){
            System.out.println("contructFunctionClassA");
        }
    
    }
    
    class ClassB{
        static {
            System.out.println("staticClassB");
        }
        {
            System.out.println("contructClassB");
        }
    
        ClassB(){
            System.out.println("contructFunctionClassB");
        }
    }
    
    class ClassC extends ClassB{
        public static String str="ClassC";
        static {
            System.out.println("staticClassC");
        }
        {
            System.out.println("contructClassC");
        }
    
        ClassC(){
            System.out.println("contructFunctionClassC");
        }
    }

    结果: 静态函数中都会执行。

    staticClassA
    staticClassB
    staticClassC
    ClassC

    2:创建对象实例调用对象中的字段。

    package functionExecutionSequence;
    
    /**
     * @program: GradleTestUseSubModule
     * @author: Yafei Li
     * @create: 2018-09-10 15:22
     **/
    public class ClassA {
        public static void main(String[] args){
    
    //        System.out.println("ClassA");
            System.out.println(ClassC.str);
            System.out.println("----------------------------");
            ClassC c=new ClassC();
            System.out.println(c.str);
        }
    
        static {
            System.out.println("staticClassA");
        }
        {
            System.out.println("contructClassA");
        }
    
        ClassA(){
            System.out.println("contructFunctionClassA");
        }
    
    }
    
    class ClassB{
        static {
            System.out.println("staticClassB");
        }
        {
            System.out.println("contructClassB");
        }
    
        ClassB(){
            System.out.println("contructFunctionClassB");
        }
    }
    
    class ClassC extends ClassB{
        public static String str="ClassC";
        static {
            System.out.println("staticClassC");
        }
        {
            System.out.println("contructClassC");
        }
    
        ClassC(){
            System.out.println("contructFunctionClassC");
        }
    }

    执行结果:当调用对象中的属性和行为时,静态代码块都会执行。  构造函数和构造代码块,当创建对象时,才执行。

    但是,静态方法只会执行一次。

    staticClassA
    staticClassB
    staticClassC
    ClassC
    ----------------------------
    contructClassB
    contructFunctionClassB
    contructClassC
    contructFunctionClassC
    ClassC

    3:将类中的字段修改为final修饰。

    package functionExecutionSequence;
    
    /**
     * @program: GradleTestUseSubModule
     * @author: Yafei Li
     * @create: 2018-09-10 15:22
     **/
    public class ClassA {
        public static void main(String[] args){
    
    //        System.out.println("ClassA");
            System.out.println(ClassC.str);
            System.out.println("----------------------------");
    //        ClassC c=new ClassC();
    //        System.out.println(c.str);
        }
    
        static {
            System.out.println("staticClassA");
        }
        {
            System.out.println("contructClassA");
        }
    
        ClassA(){
            System.out.println("contructFunctionClassA");
        }
    
    }
    
    class ClassB{
        static {
            System.out.println("staticClassB");
        }
        {
            System.out.println("contructClassB");
        }
    
        ClassB(){
            System.out.println("contructFunctionClassB");
        }
    }
    
    class ClassC extends ClassB{
        public static final String str="ClassC";
        static {
            System.out.println("staticClassC");
        }
        {
            System.out.println("contructClassC");
        }
    
        ClassC(){
            System.out.println("contructFunctionClassC");
        }
    }

    结果:  则类中的静态方法不会调用

    staticClassA
    ClassC
    ----------------------------
  • 相关阅读:
    洛谷 P2634 BZOJ 2152 【模板】点分治(聪聪可可)
    洛谷 P3819 松江1843路
    洛谷 P1005 矩阵取数游戏
    洛谷 P2712 摄像头
    洛谷 P2774 方格取数问题
    洛谷 P3369 BZOJ 3224 【模板】普通平衡树(Treap/SBT)
    洛谷 P2805 BZOJ 1565 植物大战僵尸
    洛谷 P2312 解方程
    洛谷 P3355 骑士共存问题
    洛谷 P2762 太空飞行计划问题
  • 原文地址:https://www.cnblogs.com/liyafei/p/9620148.html
Copyright © 2011-2022 走看看