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
    ----------------------------
  • 相关阅读:
    命令行扩展功能
    bash的工作特性及其使用方法
    Linux的管理类命令及其使用方法
    命名规范
    CSS后代选择器可能的错误认识
    两个viewport的故事(第二部分)
    两个viewport的故事(第一部分)
    移动前端开发之viewport的深入理解
    mybatis 详解(五)------动态SQL
    mybatis 详解(四)------properties以及别名定义
  • 原文地址:https://www.cnblogs.com/liyafei/p/9620148.html
Copyright © 2011-2022 走看看