zoukankan      html  css  js  c++  java
  • Java中类的数据成员的初始化顺序

     

      对于单一类:
      属性初始化 ---> 按顺序执行静态初始化块(只能操作静态属性)
      ---> 按顺序执行初始化块 ---> 构造方法

      对于存在继承关系的类:
      父类属性初始化 ---> 按顺序执行父类静态初始化块 ---> 按顺序执行子类初始化块
      ---> 按顺序执行父类普通初始化块 ---> 父类构造方法
      ---> 按顺序执行子类普通初始化块 ---> 子类构造方法

      要点1:对于静态初始化块,无论声明多少次对象,只会执行一次
      要点2:在主函数之前,会优先桉顺序执行所在类(代码中的Test类)的静态初始化块,之后才执行主函数的内容

    参考代码: 

    以下是包含main函数的Test类

    package com.hao;
    
    class Test{
        
        //数据成员
        static int a = 1;
        
        //普通初始化块1
        {
            System.out.println("Test类普通初始化块1");
            
        }
        
        //静态初始化块1
        static{
            System.out.println("Test类静态初始化块1");
        }
        
        //普通初始化块2
        {
            System.out.println("Test类普通初始化块2");
        }
        
        //构造方法
        Test(){    
            System.out.println("Test类构造方法");
        }
        
        //普通初始化块3
        {
            System.out.println("Test类普通初始化块3");
        }
        
        //静态初始化块2
        static{
            System.out.println("Test类静态初始化块2");
        }
        
        
        
        
        
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
            
            //在主函数之前,会优先桉顺序执行所在类的静态初始化块,之后才执行主函数的内容
            System.out.println("Hello,World");
            Animal a = new Dog();
            Animal b = new Dog();
    //        Test a = new Test();
    //        Test b = new Test();
            
        }
    
    
    }//Test
    View Code

    以下是父类Animal的代码内容:

    package com.hao;
    
    public class Animal {
        
        static int a = 11;
        
        /* 
         *    可观察得到a的变化情况为 11 14 16 13 15 12
         */
        
        //父类构造方法
        Animal(){
            System.out.println("父类构造方法");
            System.out.printf("%d ---> ", a);
            a = 12;
            System.out.println(a);
        }
        
        //父类普通初始化块1
        {
            System.out.println("父类普通初始化块1:");
            System.out.printf("%d ---> ", a);
            a = 13;
            System.out.println(a);
        }
        
        //父类静态初始化块1
        static{
            System.out.println("父类静态初始化块1");
            System.out.printf("%d ---> ", a);
            a = 14;
            System.out.println(a);
        }
        
        
        //父类普通初始化快2
        {
            System.out.println("父类普通初始化块2");
            System.out.printf("%d ---> ", a);
            a = 15;
            System.out.println(a);
        }
        
        //父类静态初始化块2
        static{
            System.out.println("父类静态初始化块2");
            System.out.printf("%d ---> ", a);
            a = 16;
            System.out.println(a);
        }
    
    }//Animal
    View Code

    以下是子类Dog的代码内容:

    package com.hao;
    
    public class Dog extends Animal {
        
        //子类中的a变化顺序为 12->23->25->22->24->21 
        
        //子类构造方法
        Dog(){
            System.out.println("子类构造方法");
            System.out.printf("%d ---> ", a);
            a = 21;
            System.out.println(a);
        }
        
        //子类普通初始化块1
        {
            System.out.println("子类普通初始化块1");
            System.out.printf("%d ---> ", a);
            a = 22;
            System.out.println(a);
        }
        
        //子类静态初始化块1
        static{
            System.out.println("子类静态初始化块1");
            System.out.printf("%d ---> ", a);
            a = 23;
            System.out.println(a);
        }
        
        //子类普通初始化块2
        {
            System.out.println("子类普通初始化块2");
            System.out.printf("%d ---> ", a);
            a = 24;
            System.out.println(a);
        }
        
        //子类静态初始化块2
        static{
            System.out.println("子类静态初始化块2");    
            System.out.printf("%d ---> ", a);
            a = 25;
            System.out.println(a);
        }
        
    }
    View Code

    上述代码a的值的变化顺序依次为  11 14 16 23 25 13 15 12 22 24 21 (这里开始是第二个对象的了) 13 15 12 22 24 21

  • 相关阅读:
    md5() 加密password,数据库字段长度要够(eg:varchar(30)),丢失部分数据,导致登录不上
    PHP $_SERVER (eg:REMOTE_ADDR)
    u3000是全角空格的16进制Unicode编码。 xa0
    Javascript验证Textarea中是否有值/javascript验证select是否为空(是否选择)
    /[u4e00-u9fa5]/汉字的正则匹配
    mysql_error() mysql_errno() 错误代码1064
    javascript正则表达式验证身份证
    javascript与php中的正则表达式
    停课集训 12.1
    bzoj1227 组合数学+bit
  • 原文地址:https://www.cnblogs.com/tommychok/p/5501743.html
Copyright © 2011-2022 走看看