zoukankan      html  css  js  c++  java
  • 深入了解Java程序执行顺序

    先看代码:
    class Parent {     
        public static String p_StaticField = "父类--静态变量";    
        public String p_Field = "父类--变量";      
        // 下面这些是干什么的?解释以下,不是很明白 
        static {    
             System.out.println(p_StaticField);    
             System.out.println("父类--静态初始化块");    
         }      
        // 下面这是干什么的?不明白?为什么这么写     
         {    
             System.out.println(p_Field);    
             System.out.println("父类--初始化块");    
         }      
        public Parent() {    
             System.out.println("父类--构造器");    
         }    
    }       
    public class SubClass extends Parent {    
        public static String s_StaticField = "子类--静态变量"; 
        public String s_Field = "子类--变量";    
        // 静态初始化块    
        static {    
             System.out.println(s_StaticField);    
             System.out.println("子类--静态初始化块");    
         }    
         {    
             System.out.println(s_Field);    
             System.out.println("子类--初始化块");    
         }        
        public SubClass() {    
             System.out.println("子类--构造器");    
         }       
        public static void main(String[] args) { 
           new Parent();
          System.out.println("-------------------");
           new SubClass(); 
           System.out.println("-------------------");
           new SubClass();  
         }    

    程序的运行结果为:
    父类--静态变量
    父类--静态初始化块
    子类--静态变量
    子类--静态初始化块
    父类--变量
    父类--初始化块
    父类--构造器
    -------------------
    父类--变量
    父类--初始化块
    父类--构造器
    子类--变量
    子类--初始化块
    子类--构造器
    -------------------
    父类--变量
    父类--初始化块
    父类--构造器
    子类--变量
    子类--初始化块
    子类--构造器

    class A {
        public A() {
            System.out.println("A的构造方法");
        }
    
        public static int j = print();
    
        public static int print() {
            System.out.println("A print");
            return 521;
        }
    }
    
    public class B extends A {
        public B() {
            System.out.println("B的构造方法");
        }
    
        public static int k = print();
    
        public static int print() {
            System.out.println("B print");
            return 522;
        }
    
        public static void main(String[] args) {
            System.out.println("main start");
            B b = new B();     
            System.out.println("------------------------");
            A a = new B();
        }
    }

    输出:

    A print
    B print
    main start
    A的构造方法
    B的构造方法
    ------------------------
    A的构造方法
    B的构造方法

  • 相关阅读:
    抓住六个点,谈唯品会的峰值系统应对实践
    从服务端架构设计角度,深入理解大型APP架构升级
    腾讯微信技术总监周颢:一亿用户增长背后的架构秘密
    App服务端架构变迁
    微服务、SOA 和 API对比与分析
    QPS从0到4000请求每秒,谈达达后台架构演化之路
    重构心法——打造高质量代码
    [转]使用 C++11 编写 Linux 多线程程序
    [转]编译防火墙——C++的Pimpl惯用法解析
    [转]C++ 取代switch的三种方法
  • 原文地址:https://www.cnblogs.com/huangjianping/p/7182085.html
Copyright © 2011-2022 走看看