解读静态代码块和构造代码块
一、对静态代码块和非静态代码块进行简单的总结
1.静态代码块:
静态代码块是在当类被载入(内存)时最先被调用的,且之被执行一次,静态块常用来执行类属性的初始化。执行类的载入之前就会调用。
2.非静态代码块:
非静态代码块是在当类的对象被创建载入(内存)时最先被调用的,每创建一个对象,即每载入一个对象,非静态代码块都执行一次。执行类对象的载入之前就会调用。
3.静态方法、非静态方法:
都是调用时,才执行的。静态方法属于类的,加载完类就可以调用静态方法;非静态方法是属于对象的,加载完对象就可以调用非静态方法。
二、相关示例演示
public class Cc {
public static void main(String[] args) {
test p=new test();
}
}
public class test {
public test() { //在类对象创建的时候就开始执行。简称创建即执行。
System.out.println("这是构造函数");
}
{ //构造代码块,执行在构造函数之前,每当在创建类对象的时候都执行。
System.out.println("这是构造代码块");
}
static { //静态代码块,最早执行,且只执行一次。
System.out.println("这是静态代码块");
}
}
打印结果:
演示当构造函数被调用两次的时候,会发生什么打印结果。对静态代码块只加载一次做一个深入的了解。
public class Ccc {
public static void main(String[]args){
MyTest p=new MyTest();
//第二次次调用
MyTest p2=new MyTest();
}
}
public class MyTest{
public MyTest(){
System.out.println("这是构造函数");
}
{
System.out.println("这是构造代码块");
}
static{
System.out.println("这是静态代码块");
}
}
打印结果如下:
进一步了解静态代码块。通过两个有继承关系的子类和父类来演示:
public class Human { //父类
private String name;
private int age;
{
System.out.println("父类非静态代码块");
}
static {
System.out.println("父类静态代码块");
}
public Human() {
System.out.println("父类无参构造");
}
public Human(String name, int age) {
System.out.println("父类带参构造");
this.name = name;
this.age = age;
}
}
public class Man extends Human { // 子类
private String work;
static {
System.out.println("子类静态代码块");
}
{
System.out.println("子类非静态代码块");
}
public Man() {
System.out.println("子类无参构造");
}
public Man(String work){
this();
System.out.println("子类带一个参数的构造器"+work);
}
public Man(String name,Integer age,String work) {
super(name, age);
System.out.println("子类带参构造");
this.work = work;
}
}
//main方法
public class HumanTest {
public static void main(String[] args) {
Man man = new Man();
}
}
打印结果如下: