初始化块
{
语句
}
修饰符可以没有,有也只能是static
由static修饰的代码块叫静态代码块,也叫类初始化代码块
没有static修饰的代码块叫非静态代码块,也叫实力初始化代码块
- 实力初始化块 是"假象",一个类被编译之后,该代码块就会消失,都会还原到每个构造器的所有代码之前。
作用:所以可以将所有构造器前面相同的部分提取到实例初始化代码块中, - 只要程序调用构造器创建对象,程序就会先执行实例初始化代码块–因为实例初始化代码块被还原到构造器的super之后,this和剩余的所有代码之前。创建一个对象,调用一次。
- 定义属性时的给属性赋值,也是一个"假象",一个类被便一直很编译之后,该代码块就会消失,都会还原到每个构造器的所有代码之前。两个在构造器中的顺序 就是他们原来代码的顺序
public class AA {
public static void main(String[] args) {
A cat = new A();
}
}
class A{
{
System.out.println("hhh");
age = 20;
}
int age = 2;
public A(){
System.out.println("无参构造器");
System.out.println(age);
}
public A(int m){
System.out.println("有参构造器");
}
}
//编译后变为
class A{
int age;
public A(){
System.out.println("hhh");
age = 20; //初始化块中的内容
age = 2; //属性的赋值语句
//如果原码中的初始化块和定义属性的位置对调一下,那么编译之后,在构造器中的位置也应该对调。
System.out.println("无参构造器");
System.out.println(age);
}
public A(int m){
System.out.println("hhh");
age = 20;
age = 2;
System.out.println("有参构造器");
}
}
类初始化块
负责对类执行初始化
当程序第一次主动使用该类时,系统会为改类分配内存空间,并执行初始化(调用类初始化快)
只要使用该类,基本都算主动使用--除了仅使用类声明变量
整个程序中该代码块只执行一次
- 定义静态变量时指定的初始值,也是"假象"—指定后的初始值,编译之后就变成静态代码块中的一条赋值语句,先后取决于代码的先后。
public class AA {
public static void main(String[] args) {
A cat; //在这没有主动使用类,仅仅这一种情况不算主动使用类。
cat = new A();
}
}
class A{
static int age=2;
static{
system.out.println("类初始化块");
age = 20;
}
//编译之后,上面的四行语句变为
static int age;
static{
age=2;
system.out.println("类初始化块");
age=20;
}
//----
public A(){
System.out.println(age);
}
}
注意
-
初始化任何类之前一定要先从Object开始初始化,然后依次初始化他的祖先,最后在初始化自己
-
创建任何对象,一定是从Object的构造器开始执行。然后再执行祖先的构造器,最后执行自己的构造器,
例题
public class StaticClass_类初始化快 {
public static void main(String[] args) {
new Sub(3.4);
System.out.println("-------------------");
new Sub(1.4);
}
}
class Base{
static {
System.out.println("Base的类初始化快");
}
{
System.out.println("Base的实例初始化快");
}
public Base(){
System.out.println("Base 无参 构造器");
}
public Base(String string){
System.out.println("Base Strng 构造器");
}
}
class Mid extends Base{
static {
System.out.println("Mid的类初始化快");
}
{
System.out.println("Mid的实例初始化快");
}
public Mid(){
super("hsfg");
System.out.println("Mid 无参 构造器");
}
public Mid(double d){
this();
System.out.println("Mid int 构造器");
}
}
class Sub extends Mid{
static {
System.out.println("Sub的类初始化快");
}
{
System.out.println("Sub的实例初始化快");
}
public Sub(){
System.out.println("Sub 无参 构造器");
}
public Sub(double d){
this();
System.out.println("Sub double 构造器");
}
}
答案
Base的类初始化快
Mid的类初始化快
Sub的类初始化快
Base的实例初始化快
Base Strng 构造器
Mid的实例初始化快
Mid 无参 构造器
Sub的实例初始化快
Sub 无参 构造器
Sub double 构造器
-------------------
Base的实例初始化快
Base Strng 构造器
Mid的实例初始化快
Mid 无参 构造器
Sub的实例初始化快
Sub 无参 构造器
Sub double 构造器