/**
代码块的含义是Java中用{}括起来的内容:以下的分析主要是针对静态代码块和构造代码块的;
*构造代码块是指对象在创建的时候优先于构造方法先执行的,由于在每个子类的构造方法中都有先执行父类的构造方法,也就是说会先执行完父类,在执行子类的;
*静态代码块是在该类加载的时候会执行,只会执行一次;也叫做类的初始化代码;
这两者的原理在于:JVM在执行程序的时候,通过ClassLoad进行类型加载的时候,对类进行初始化的逻辑(包括static域和static代码块)都封装在了一个系统Java.lang.Class的方法clinit方法中,而对象的实例化操作封装在了init的方法中,而这两个方法分别在类加载和对象创建的时候调用,所以static代码块只执行
一次,构成代码块会执行多次;
具体测试代码如下:
*/
class ExtendsDemo2 {
//在测试类中也有一个静态代码块,构造代码块,以及局部代码块
static {
System.out.println("这是测试类的静态代码块");
}
{
System.out.println("这是测试类的构造代码块");
}
public static void main(String[] args) {
{
System.out.println("测试类的在对象前的局部代码块");
}
//在这个地方创建一个子类对象,用来测试创建对象的执行流程
Son son = new Son();
System.out.println("----------------------------------------------");
Son son2 = new Son("小易");
{
int x = 100;
System.out.println("这是测试类的局部代码块" + x);//局部代码块的作用是为了控制局部变量的生命周期,提早释放内存;
}
}
}
/*
这段代码是用来测试代码块的执行顺序的,创建三个类,分别为根类,父类,子类,然后用输出语句模拟代码块的执行流程
*/
//根类,有两个构造方法,一个是有参数的,一个是无参数的,因为在子类的构造方法执行的时候,会默认执行父类的无参构造方法
class GrandFather {
String name;
//无参构造方法
public GrandFather() {
System.out.println("根类----这是根类的-----------------无参构造方法");
}
//根类的有参构造方法
public GrandFather(String name) {
this.name = name;
System.out.println("根类---------这是根类的--有参构造方法");
}
//根类的静态代码块,用来给根类在加载的时候初始化根类使用的,这个代码块在根类加载到方法区时执行一次.除非根类重新加载到方法区,不然不会再执行
static {
System.out.println("这是根类的 -----静态代码块");
}
//根类的构造代码块,在根类的任何一个构造方法调用时优先于构造方法执行.用来存储构造方法中相同的代码部分,这样可以提高代码的复用性
{
System.out.println("这是根类的------------------构造代码块");
}
}
class Father extends GrandFather {
//父类的方法代码跟根类的类似
public Father() {
System.out.println("父类;;;这是父类的;;;;;;;;;无参构造方法");
}
//根类的有参构造方法
public Father(String name) {
this.name = name;
System.out.println("父类;;;;;;;;;;;;;这是父类的;;有参构造方法");
}
//根类的静态代码块,用来给根类在加载的时候初始化根类使用的,这个代码块在根类加载到方法区时执行一次.除非根类重新加载到方法区,不然不会再执行
static {
System.out.println("这是父类的;;;;;;;;静态代码块");
}
//根类的构造代码块,在根类的任何一个构造方法调用时优先于构造方法执行.用来存储构造方法中相同的代码部分,这样可以提高代码的复用性
{
System.out.println("这是父类的;;;;;;;;;;;;;;;;;;构造代码块");
}
}
class Son extends Father {
public Son() {
System.out.println("子类//这是子类的///////////////无参构造方法");
}
//根类的有参构造方法
public Son(String name) {
this.name = name;
System.out.println("子类//////////////这是子类的//有参构造方法");
}
//根类的静态代码块,用来给根类在加载的时候初始化根类使用的,这个代码块在根类加载到方法区时执行一次.除非根类重新加载到方法区,不然不会再执行
static {
System.out.println("这是子类的////////////静态代码块");
}
//根类的构造代码块,在根类的任何一个构造方法调用时优先于构造方法执行.用来存储构造方法中相同的代码部分,这样可以提高代码的复用性
{
System.out.println("这是子类的///////构造代码块");
}
}
|
|