静态代码块和非静态代码块简介
静态代码块
- 内部可以输出语句
- 随着类的加载而执行,而且只执行一次
- 作用:初始化类的信息
- 如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
- 静态代码块的执行要优先于非静态代码块的执行
- 静态代码块内只能调用静态的属性、静态的方法,不能调用非静态的结构
非静态代码块
- 内部可以输出语句
- 随着对象的创建而执行
- 每创建一个对象,就执行一次非静态代码块
- 作用:可以在创建对象时,对对象的属性等进行初始化
- 如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行 非静态代码块内可以调用静态的属性、静态的方法,或非静态的属性、非静态的方法
示例
public class SupperClass {
private String name;
public SupperClass() {
System.out.println("--父类的无参构造函数--");
}
public SupperClass(String name) {
this.name = name;
System.out.println("--父类的有参构造函数--" + this.name);
}
static {
System.out.println("--父类的静态代码块--");
}
{
System.out.println("--父类的非静态代码块--");
}
public void speak() {
System.out.println("--父类的方法--");
}
测试类
import org.junit.jupiter.api.Test;
public class TestSupperClass {
public TestSupperClass() {
}
@Test
public void testfun(){
System.out.println("--单元测试--");
SupperClass father = new SupperClass("父亲的名字");
father.speak();
}
}
单元测试注意事项
- 测试类是public的
- 测试类提供公共的无参的构造器
- 测试类中声明单元测试方法
- 此时的单元测试方法:方法的权限是public,没返回值,没形参
- 此单元测试方法上需要声明注解:@Test,并在单元测试类中导入:import org.junit.Test;
创建子类
public class ChildClass extends SupperClass{
private String name;
static {
System.out.println("--子类的静态代码块--");
}
{
System.out.println("--子类的非静态代码块--");
}
ChildClass() {
System.out.println("--子类的无参构造函数--");
}
ChildClass(String name) {
this.name = name;
System.out.println("--子类的有参构造函数--" + this.name);
}
@Override
public void speak() {
System.out.println("--子类Override了父类speak的方法--");
}
}
单元测试
import org.junit.jupiter.api.Test;
public class TestChildClass {
public TestChildClass(){
}
@Test
public void testChildFun(){
System.out.println("--子类单元测试--");
SupperClass father = new SupperClass("父亲的名字");
father.speak();
ChildClass son = new ChildClass("儿子的名字");
son.speak();
}
}