码迷,mamicode.com
首页 > 编程语言 > 详细

Java之类。实例初始化

时间:2021-03-15 10:54:01      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:alt   变量赋值   一个   exp   hid   sys   实例   vat   使用   

类初始化

类被加载内存后,会在方法区创建一个Class对象(后面反射章节详细学习)来存储该类的所有信息。此时会为类的静态变量分配内存,然后为类变量进行初始化。那么,实际上,类初始化的过程时在调用一个<clinit>()方法,而这个方法是编译器自动生成的。编译器会将如下两部分的所有代码,按顺序合并到类初始化<clinit>()方法体中。

(1)静态类成员变量的显式赋值语句

(2)静态代码块中的语句

整个类初始化只会进行一次,如果子类初始化时,发现父类没有初始化,那么会先初始化父类。

技术图片
public class Test{
    public static void main(String[] args){
        Father.test();
    }
}
class Father{
    private static int a = getNumber();
    static{
        System.out.println("Father(1)");
    }
    private static int b = getNumber();
    static{
        System.out.println("Father(2)");
    }
    
    public static int getNumber(){
        System.out.println("getNumber()");
        return 1;
    }
    
    public static void test(){
        System.out.println("Father:test()");
    }
}
View Code
运行结果:
getNumber()
Father(1)
getNumber()
Father(2)
Father:test()
	private static int a = getNumber();
	static{
		System.out.println("Father(1)");
	}
	private static int b = getNumber();
	static{
		System.out.println("Father(2)");
	}

顺序改变 输出内容也改变

    static{
        System.out.println("Father(1)");
    }
    private static int a = getNumber();
    private static int b = getNumber();
    static{
        System.out.println("Father(2)");
    } 
类加载时候:Father.test();第一次使用的时候类就加载,此时静态变量赋值和静态初始化按书写顺序同时进行
类加载要比实例化靠前 对象实力化=执行构造器=new 
类初始化块在类加载时进行,static静态变量也在类加载时赋值
实例初始化块在实例化对象时进行,同事执行构造器 

区别有继承关系的时候,继承关系时候父类优先子类空间运行

父子类

技术图片
public class Test{
    public static void main(String[] args){
        Son.test();
        System.out.println("-----------------------------");
        Son.test();
    }
}
class Father{
    private static int a = getNumber();
    static{
        System.out.println("Father(1)");
    }
    private static int b = getNumber();
    static{
        System.out.println("Father(2)");
    }
    
    public static int getNumber(){
        System.out.println("Father:getNumber()");
        return 1;
    }
}
class Son extends Father{
    private static int a = getNumber();
    static{
        System.out.println("Son(1)");
    }
    private static int b = getNumber();
    static{
        System.out.println("Son(2)");
    }
    
    public static int getNumber(){
        System.out.println("Son:getNumber()");
        return 1;
    }
    
    public static void test(){
        System.out.println("Son:test()");
    }    
}
View Code
运行结果:
Father:getNumber()
Father(1)
Father:getNumber()
Father(2)
Son:getNumber()
Son(1)
Son:getNumber()
Son(2)
Son:test()
-----------------------------
Son:test()

结论:

每一个类都有一个类初始化方法<clinit>()方法,然后子类初始化时,如果发现父类加载和没有初始化,会先加载和初始化父类,然后再加载和初始化子类。一个类,只会初始化一次。

实例初始化

  

 

 

Java之类。实例初始化

标签:alt   变量赋值   一个   exp   hid   sys   实例   vat   使用   

原文地址:https://www.cnblogs.com/harden13/p/14527153.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!