Day08
局部代码块,构造代码块和静态代码块
CodeDemo
- 局部代码块:局部变量,用于限定变量的生命周期。
- 构造代码块:在类中的成员位置,用{}括起来的代码。每次调用构造方法执行前都会先执行构造代码块。
作用:可以把多个构造方法中的共同代码放在一起。 - 静态代码块:在类中的成员位置,用{}括起来的代码,只不过它用static修饰。
- 作用:一般是对类进行初始化。
- 执行顺序:静态-构造-构造方法
- 静态代码块只执行一次,构造代码块每次调用构造方法都执行。
class Code{
//构造代码块
{
int x = 100;
System.out.println(x);
}
//无参构造方法
public Code(){
System.out.println("code");
}
//带参构造方法
public Code(int a){
System.out.println("code");
}
//构造代码块
{
int y = 200;
System.out.println(y);
}
}
class CodeDemo{
public static void main(String[] args){
//局部代码块
{
int x = 10;
System.out.println(x);
}
{
int y = 20;
System.out.println("y");
}
System.out.println("-----------");
Code c = new Code();
System.out.println("-----------");
Code c2 = new Code();
System.out.println("-----------");
Code c3 = new Code(1);
}
}
class Student {
static {
System.out.println("Student 静态代码块");
}
{
System.out.println("Student 构造代码块");
}
public Student() {
System.out.println("Student 构造方法");
}
}
class StudentDemo{
static{
System.out.println("!!!!!")
}
public static void main(String[] args){
System.out.println("main");
Student s1 = new Student();
Student s2 = new Student();
}
}
/*
写程序的执行结果。
!!!!!!
main
Student 静态代码块
Student 构造代码块
Student 构造方法
Student 构造代码块
Student 构造方法
*/
1.静态代码块
A:格式 - 在java类中(静态代码块不能存在于方法中)使用static关键字和{}声明的代码块
B:执行时 - 静态代码在类被加载的时候就运行了,并且只运行一次,优先级高于其余代码块和构造函数。
(若有多个静态代码块,则按书写顺序执行)
C:作用 - eg:一个项目启动时需要加载很多配置文件,这时可以把配置文件放入静态代码块中。
D:说明 - 静态代码块不能存在于任何方法中——
对于普通方法,是通过加载类,然后new出实例化对象,通过对象运行此方法,而静态代码块只需要加载类就可以直接运行了。
对于静态方法,在类加载时,静态方法也已经加载,但是我们必须通过类名或者对象名才能访问,也就是说相比于静态代码快,静态代码是主动运行的,而静态方法是被动运行的。
2.构造代码块
A:格式 - 在java类中使用{}声明的代码块(和静态代码块的区别是少了static关键字):
public class Test1{
static{
System.out.println("静态代码块")
}
{
System.out.println("构造代码块")
}
}
B:执行时 - 构造代码块时创建对象时被调用,每次创建对象被调用一次,但是优先于构造函数执行。需要注意的是,构造函数块并不是优先级高于构造函数,而是依托于构造函数。即:若不实例化对象,构造代码块是不会执行的。
eg:
public class CodeBlock{
{
System.out.println("构造代码块");
}
public CodeBlock(){
System.out.println("无参构造函数");
}
public CodeBlock(String str){
System.out.println("有参构造函数");
}
}
反编译的class文件:
C:作用 - 和构造函数相似,都能对对象进行初始化,并且只要创建一个对象,就执行一次。但是反过来,构造函数不一定每个对象建立时都执行(多个构造函数的情况下,建立对象时传入的参数不同则初始化使用对应的构造函数不同)。
3.构造函数
A:构造函数的命名必须和类名完全相同。在java中普通函数可以和构造函数同名,但是必须带有返回值。
B:构造函数的功能主要用于在类的对象创建时定义初始化的状态。无返回值,也不能用void来修饰。这就保证了它不仅什么也不用返回,而且不能有任何选择。其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的
C:构造函数不能被直接调用,必须通过new运算符在创建对象是才会自动调用;而一般的方法是在程序执行到它的时候被调用的
D:当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中制定初始值的工作也可省略,不过java编译器会提供一个默认的构造函数,此默认构造函数是不带参数的。而一般的方法不存在这一特点。