希望像唠嗑一样,one step one futher。
目录
(1)代码块的应用场景
(2)代码块的细节
1.static 代码块只加载一次
2.当调用类的静态成员时,类会加载
3. 使用类的静态成员时,static代码块会被执行,但普通代码块不会执行
4.创建对象时,静态成员、普通成员、 构造器的调用顺序
5.有继承关系时,静态成员、普通成员、 构造器的调用顺序
6.静态代码块中只能调用静态成员
基于韩顺平老师的课进行Java知识的巩固练习
(1)代码块的应用场景
假设有以下雇员类,在该类的每个构造函数中输出“我是员工”这句话,不免有些重复并且造成内存浪费。
public class Employee {
private String name;
private int id;
private int salary;
public Employee(String name) {
System.out.println("我是员工");
this.name = name;
}
public Employee(String name, int id) {
System.out.println("我是员工");
this.name = name;
this.id = id;
}
public Employee(String name, int id, int salary) {
System.out.println("我是员工");
this.name = name;
this.id = id;
this.salary = salary;
}
}
如果用代码块则可以解决重复的问题,由此可以看出代码块可以初始化并且解决重复语句的问题(代码块执行顺序要比构造函数高)
public class Employee {
private String name;
private int id;
private int salary;
{
System.out.println("我是员工");
}
public Employee(String name) {
this.name = name;
}
public Employee(String name, int id) {
this.name = name;
this.id = id;
}
public Employee(String name, int id, int salary) {
this.name = name;
this.id = id;
this.salary = salary;
}
}
(2)代码块的细节
1.static 代码块只加载一次
如果是普通代码块,每创建一个对象它就会执行一次代码块,而static代码块无论是创建多少个对象(>=1)都只会执行一次。
2.当调用类的静态成员时,类会加载
注意创建子类对象时,父类也会被加载。先加载父类代码块,再加载子类代码块。当创建了一个对象时,调用该对象的静态成员时,类就会被加载。
3. 使用类的静态成员时,static代码块会被执行,但普通代码块不会执行
由下列看出,当没有创建对象时,使用类加载去访问静态成员时,static代码块也会被加载(只加载一次),但普通代码块不会被加载。
4.创建对象时,静态成员、普通成员、 构造器的调用顺序
在创建对象时,调用顺序是这样的:先调用静态(属性或方法按顺序调用),然后是普通代码块和普通属性,最后才是构造器的调用。
5.有继承关系时,静态成员、普通成员、 构造器的调用顺序
由下列程序可以观察到,如果有两个类是继承关系,两个类都有静态、普通、构造方法。创建一个子类对象,则执行的顺序是:
(1)先调用父类static,然后是子类static。先完成父子类的静态属性
(2)父类的普通方法,然后是父类的构造器,完成父类后。
(3)子类的普通方法,最后是子类的构造器,最后完成子类。
class Employee{
static{
System.out.println("Employee静态代码块");
}
public Employee() {
System.out.println("Employee构造器");
}
}
class Manager extends Employee{
static{
System.out.println("Manager静态代码块");
}
public Manager(){
System.out.println("Manager构造器");
}
}
class Test{
public static void main(String[] args) {
Manager manager = new Manager();
}
}
6.静态代码块中只能调用静态成员
由下图看出当在静态代码块中访问非静态成员是不允许的。但在普通代码块中则可以访问静态或者非静态成员。