1、成员变量有默认值
类别 | 具体类型 | 默认值 |
---|---|---|
基本类型 | 整数(byte,short,int,long) | 0 |
浮点数(float,double) | 0.0 | |
字符(char) | ‘\u0000’ | |
布尔(boolean) | false | |
数据类型 | 默认值 | |
引用类型 | 数组,类,接口 | null |
2、初始化的过程
1)
没有被static修饰的成员变量,是在 类----》static修饰的成员变量-----》static代码块(静态代码块)----》没有被static修饰的成员变量加载到堆空间----》普通代码块----》实例化对象
实列化对象时初始化值
2)
被static修饰的成员变量,是在 类----》static修饰的成员变量加载到方法区----》static代码块(静态代码块)----》没有被static修饰的成员变量加载到堆空间----》普通代码块----》实例化对象
加载类过后就初始化值,加载到了方法区,所以可以直接用类调用static属性
public class TestFour {
static String name = setMyName();
int age = setMyAge();
static final String gender;
static {
gender = "男";
System.out.println("静态代码被加载了");
}
{
System.out.println("普通代码块被加载了,我是在实列话对象之前被加载的");
}
public static String setMyName(){
//静态的不能使用非静态的,所以这里使用静态方法给 name赋值
System.out.println("准备加载 static String name ");
return "张三";
}
public int setMyAge(){
System.out.println("准备加载 int age ");
return 100;
}
public static void main(String[] args) {
System.out.println("我是静态方法,加载完了。。然后我要加载没有static修饰的成员变量和方法了");
TestFour testFour = new TestFour();
System.out.println("我实例化对象好了");
}
}
准备加载 static String name
静态代码被加载了
我是静态方法,加载完了。。然后我要加载没有static修饰的成员变量和方法了
准备加载 int age
普通代码块被加载了,我是在实列话对象之前被加载的
我实例化对象好了
总结
属性的初始化最早。静态属性在类加载时初始化,普通属性在创建对象时初始化。
创建一个对象时会首先调用静态代码块,然后调用普通代码块,然后调用构造方法。
静态代码块是类加载时调用,所以无论该类创建多少个对象,静态代码块只调用一次。
普通代码块是创建对象时调用,创建一个对象则普通代码块就要调用一次。先代码块再构造方法。
由于代码块是在加载或创建对象时调用,切仅在这个时间调用,所以代码块的调用顺序就是编写顺序。