关于静态代码块
静态代码块的写法:
静态{
System.out.println ('我是静态代码块');
}
静态代码块的特点:
1 .执行优先级高于非静态初始化块,在类初始化时执行一次,执行完成后丢弃。 只能初始化类变量,即静态限定的数据成员。
2 .随着类的加载运行,只运行一次
首先,我将介绍一下类加载。 为了运行一个程序,必须首先将代码加载到内存中,然后与CPU进行交流。 这是冯诺依曼电脑规定的。 Java也是如此,要运行Java的. class字节码文件,首先将其加载到内存中,然后类加载器将字节码文件中的代码加载到内存中。 这一步称为类加载。 这首先进行。
关于非静态代码块:
如何写非静态代码块:
{
System.out.println ('我是非静态代码块');
}
非静态代码块特征:
1 .如果在运行时有静态初始化块,则可以运行静态初始化块,然后运行非静态初始化块,以便在生成每个对象时运行一次,并初始化类的实例变量。 非静态初始化块在构造函数运行时执行构造函数主体的代码之前执行。
2 .每个new执行非静态代码块
静态代码块与非静态代码库的区别:
同一点:
两者都是在JVM加载类和构造方法执行之前执行的,并且可以在类中定义多个。 通常,在代码块中为几个静态变量赋值。
不同之处:
1 .静态代码块在非静态代码块之前执行(静态代码块-----非静态代码块--- -构建方法)。
静态代码块只在第一个new上运行一次,然后不运行。 静态代码块每new执行一次。 非静态代码块可以用普通方法定义(个人觉得效果不大); 静态代码块不行。
2 .静态代码块自动执行
静态方法在调用时执行;
角色:
静态代码块可以用于初始化项目中最常用的变量和对象。 可以将静态方法用作需要执行的代码,而无需创建对象。
关于构造函数:
构造函数的写法:
公共类过滤器{
Father () {System.out.println ) (我是构造函数);
}
}
构造函数特征:
1 .构造函数的名称必须与类名完全相同,不能有构造函数
2 .返回值,不写void。 构造函数不能继承到子类中
3 .构造函数可以重载,但不能用子类覆盖。
关于静态代码块、非静态代码块和构造函数的执行顺序
1 .只在父类Class中测试
公共类过滤器{ static }
System.out.println (父类的静态代码块);
}
{
System.out.println (父类的非静态代码块);
}
Father ()。
系统. out.println (父类的构造函数);
} publicstaticvoidmain (字符串[ ] args ) )
system.out.println('new父类之前的main方法); newFather (;
system.out.println('new父类之后的main方法);
}
}
总结:
仅在父类Class中执行顺序:
静态代码块new对象之前的main方法按顺序执行非静态代码块构造函数new对象之后的main方法
2 .在继承父类的子类Class中测试
publicclassonextendsfather { static }
System.out.println (子类静态代码块);
}
{
System.out.println (子类的非静态代码块);
}
Son () )。
System.out.println (子类构造函数);
} publicstaticvoidmain (字符串[ ] args ) )
system.out.println('new子类前面的main方法); newSon (;
system.out.println(new子类后的主方法);
}
}
总结:
在继承父类的子类Class中的执行顺序:
父类的静态代码块子类的静态代码块new对象前面的main方法按顺序执行父类的非静态代码块父类的构造函数的子类的非静态
代码块>子类的构造函数>new 对象后的main方法顺序执行3.在父类的Class中测试继承了父类的子类Class
public classFather {static{
System.out.println("父类的静态代码块");
}
{
System.out.println("父类的非静态代码块");
}
Father() {
System.out.println("父类的构造函数");
}public static voidmain(String[] args) {
System.out.println("new子类前的main方法");newSon();
System.out.println("new子类后的main方法");
}
}
总结:
在父类的Class中测试继承了父类的子类Class中的执行顺序:
父类的静态代码块>new 对象前的main方法顺序执行>子类的静态代码块>父类的非静态代码块>父类的构造函数>子类的非静态代码块>子类的构造函数>new 对象后的main方法顺序执行
第3个(在父类的Class中测试继承了父类的子类Class)和第2个(在继承了父类的子类Class中测试)对比:
左图是在父类中new 子类然后执行main方法,右图是子类中new 子类然后执行main方法
可以看出来,父类new 子类之前,先执行父类的静态代码块,然后main函数里面的代码顺序执行,直到new 了子类,然后执行子类的静态代码块,然后父类非静态代码块>父类构造函数>子类非静态代码块>子类构造函数>new子类后的main方法顺序执行 在父类中执行了main方法,本身父类执行main方法就会执行一次静态代码块,但是在父类中main方法new了一次子类,按继承关系,父类中的静态代码块应该还会执行,但是控制台中却没有打印,这就是因为静态代码块的特征的原因所致,随着类的加载而执行,而且只执行一次.
如果还是有疑问,则看一下代码: