Java之类。实例初始化
2021-06-08 15:04
标签:alt 变量赋值 一个 exp hid sys 实例 vat 使用 类被加载内存后,会在方法区创建一个Class对象(后面反射章节详细学习)来存储该类的所有信息。此时会为类的静态变量分配内存,然后为类变量进行初始化。那么,实际上,类初始化的过程时在调用一个 (1)静态类成员变量的显式赋值语句 (2)静态代码块中的语句 整个类初始化只会进行一次,如果子类初始化时,发现父类没有初始化,那么会先初始化父类。 区别有继承关系的时候,继承关系时候父类优先子类空间运行 父子类 结论: 每一个类都有一个类初始化方法 Java之类。实例初始化 标签:alt 变量赋值 一个 exp hid sys 实例 vat 使用 原文地址:https://www.cnblogs.com/harden13/p/14527153.html类初始化
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()");
}
}
运行结果:
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()");
}
}
运行结果:
Father:getNumber()
Father(1)
Father:getNumber()
Father(2)
Son:getNumber()
Son(1)
Son:getNumber()
Son(2)
Son:test()
-----------------------------
Son:test()
实例初始化