Java 静态代码块和非静态代码块

原文链接:https://blog.csdn.net/kunlyy/article/details/52176305

参考:https://blog.csdn.net/kunlyy/article/details/52176305

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

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

代码的执行顺序

  1. 主调类的静态代码块
  2. 对象父类的静态代码块
  3. 对象的静态代码块
  4. 对象父类的非静态代码块
  5. 对象父类的构造函数
  6. 对象的非静态代码块
  7. 对象的构造函数
    //主调类
    package test;
    
    public class StaticBlockTest1 {
    	    //主调类的非静态代码块
    	    {
    	        System.out.println("主调类的非静态代码块");
    	    }
    	    //主调类的静态代码块
    	    static {
    	        System.out.println("主调类的静态代码块");
    	    }
    
    	    public StaticBlockTest1(){
    	        System.out.println("主调类的无参构造");
    	    }
    
    	    public static void main(String[] args) {
    	        Children children = new Children("zhan");
    	        children.getValue();
    	    }
    
    	}
    
    //父类
    package test;
    
    public class Parent {
    	    private String name;
    	    private int age;
    
    	    //父类无参构造方法
    	    public Parent(){
    	        System.out.println("父类无参构造方法");
    	        {
    	            System.out.println("Parent constructor method--> not static block");
    	        }
    	    }
    	    //父类的非静态代码块
    	    {
    	        System.out.println("父类的非静态代码块");
    	        name = "zhangsan";
    	        age = 50;
    	    }
    	    //父类静态代码块
    	    static {
    	        System.out.println("父类静态代码块");
    	    }
    
    	    //父类有参构造方法
    	    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;
    	    }
    	}
    
    //子类
    package test;
    
    class Children extends Parent{
        //子类静态代码块
        static {
            System.out.println("子类静态代码块");
        }
    
        //子类非静态代码块
        {
            System.out.println("子类非静态代码块");
        }
    
        //子类无参构造方法
        public Children(String str){
            System.out.println("子类无参构造方法");
        }
    
    
        public void getValue(){
            //this.setName("lisi");
            //this.setAge(51);
            System.out.println(this.getName() + this.getAge());
        }
    }
    

     

主调类的静态代码块
父类静态代码块
子类静态代码块
父类的非静态代码块
父类无参构造方法
Parent constructor method--> not static block
子类非静态代码块
子类无参构造方法
zhangsan50

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章