zoukankan      html  css  js  c++  java
  • (转) Java 静态代码块和非静态代码块

    参考:http://uule.iteye.com/blog/1558891

    Java中的静态代码块是在虚拟机加载类的时候,就执行的,而且只执行一次。如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

    非静态代码块是在类new一个实例的时候执行,而且是每次new对象实例都会执行。

    代码的执行顺序

    1. 主调类的静态代码块
    2. 对象父类的静态代码块
    3. 对象的静态代码块
    4. 对象父类的非静态代码块
    5. 对象父类的构造函数
    6. 对象的非静态代码块
    7. 对象的构造函数

    示例代码

    public class StaticBlockTest1 {
    
        //主调类的非静态代码块
        {
            System.out.println("StaticBlockTest1 not static block");
        }
        //主调类的静态代码块
        static {
            System.out.println("StaticBlockTest1 static block");
        }
    
        public StaticBlockTest1(){
            System.out.println("constructor StaticBlockTest1");
        }
    
        public static void main(String[] args) {
            Children children = new Children();
            children.getValue();
        }
    
    }
    
    
    class Parent{
    
        private String name;
        private int age;
    
        //父类无参构造方法
        public Parent(){
            System.out.println("Parent constructor method");
            {
                System.out.println("Parent constructor method--> not static block");
            }
        }
        //父类的非静态代码块
        {
            System.out.println("Parent not static block");
            name = "zhangsan";
            age = 50;
        }
        //父类静态代码块
        static {
            System.out.println("Parent static block");
        }
    
        //父类有参构造方法
        public Parent(String name, int age) {
            System.out.println("Parent constructor method");
            this.name = "lishi";
            this.age = 51;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    class Children extends Parent{
        //子类静态代码块
        static {
            System.out.println("Children static block");
        }
    
        //子类非静态代码块
        {
            System.out.println("Children not static block");
        }
    
        //子类无参构造方法
        public Children(){
            System.out.println("Children constructor method");
        }
    
    
        public void getValue(){
            //this.setName("lisi");
            //this.setAge(51);
            System.out.println(this.getName() + this.getAge());
        }
    }

    输出结果

    StaticBlockTest1 static block   //主调类的静态代码块
    Parent static block             //父类的静态代码块
    Children static block           //子类的静态代码块
    Parent not static block         //父类的非静态代码块
    Parent constructor method       //父类的构造函数
    Parent constructor method--> not static block
    Children not static block       //主调类的非静态代码块
    Children constructor method     //主调类的构造函数
    zhangsan50                      //主调main方法
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    总结:

    1. 按照前面提到的顺序执行
    2. 子类定义无参构造方法,调用的父类也是无参构造方法
    .
  • 相关阅读:
    'Undefined symbols for architecture i386,clang: error: linker command failed with exit code 1
    The codesign tool requires there only be one 解决办法
    XCode iOS project only shows “My Mac 64bit” but not simulator or device
    Provisioning profile XXXX can't be found 的解决办法
    UIView 中的控件事件穿透 Passthrough 的实现
    Xcode4.5出现时的OC新语法
    xcode 快捷键(持续更新)
    打越狱包
    php缓存与加速分析与汇总
    浏览器的判断
  • 原文地址:https://www.cnblogs.com/Dar-/p/9059684.html
Copyright © 2011-2022 走看看