java引用非静态库函数_java中静态代码块,非静态代码块,构造函数

关于静态代码块

静态代码块的写法:

static{

System.out.println("我是静态代码块");

}

静态代码块的特点:

1.执行优先级高于非静态的初始化块,它会在类初始化的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员。

2.随着类的加载而执行,而且只执行一次

先说一下类加载,一个程序要想运行,首先要把代码加载到内存中,然后才能去和CPU交流,这是冯诺依曼计算机规定的。Java也是一样,Java的.class字节码文件要想执行,首先也要加载到内存,由类加载器把字节码文件的代码加载到内存中,这一步就叫类加载,这是首先要进行的。

关于非静态代码块:

非静态代码块的写法:

{

System.out.println("我是非静态代码块");

}

非静态代码块的特点:

1.执行的时候如果有静态初始化块,先执行静态初始化块再执行非静态初始化块,在每个对象生成时都会被执行一次,它可以初始化类的实例变量。非静态初始化块会在构造函数执行时,在构造函数主体代码执行之前被运行。

2.非静态代码块在每new一次就执行一次

静态代码块与非静态代码库的异同点:

相同点:

都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。

不同点:

1.静态代码块在非静态代码块之前执行(静态代码块--》非静态代码块--》构造方法)。

静态代码块只在第一次new执行一次,之后不在执行,而非静态代码块在每new一次就执行一次。非静态代码块可以     在普通方法中定义(个人感觉作用不大);而静态代码块不行。

2.静态代码块是自动执行的;

静态方法是被调用的时候才执行的;

作用:

静态代码块可以用来初始化一些项目最常用的变量和对象;静态方法可以用作不创建对象也可以能需要执行的代码。

关于构造函数:

构造函数写法:

public class Father{

Father(){    System.out.println("我是构造函数");

}

}

构造函数的特点:

1.构造函数的名字必须和类名完全相同,构造函数不能有

2.返回值,不写void,构造函数不可以被子类继承

3.构造函数可以重载但是不可以被子类覆盖。

关于静态代码块,非静态代码块及构造函数的执行顺序

1.只在父类Class中测试

public classFather {static{

System.out.println("父类的静态代码块");

}

{

System.out.println("父类的非静态代码块");

}

Father() {

System.out.println("父类的构造函数");

}public static voidmain(String[] args) {

System.out.println("new父类前的main方法");newFather();

System.out.println("new父类后的main方法");

}

}

8564072bbfba6fc115eebb97a5bd8f91.png

总结:

只在父类Class中的执行顺序:

静态代码块>new 对象前的main方法顺序执行>非静态代码块>构造函数>new 对象后的main方法顺序执行

2.在继承了父类的子类Class中测试

public class Son extendsFather {static{

System.out.println("子类的静态代码块");

}

{

System.out.println("子类的非静态代码块");

}

Son() {

System.out.println("子类的构造函数");

}public static voidmain(String[] args) {

System.out.println("new子类前的main方法");newSon();

System.out.println("new子类后的main方法");

}

}

5527f221d5a4258c5504a73f0f42a2fd.png

总结:

在继承了父类的子类Class中的执行顺序:

父类的静态代码块>子类的静态代码块>new 对象前的main方法顺序执行>父类的非静态代码块>父类的构造函数>子类的非静态代码块>子类的构造函数>new 对象后的main方法顺序执行

3.在父类的Class中测试继承了父类的子类Class

public classFather {static{

System.out.println("父类的静态代码块");

}

{

System.out.println("父类的非静态代码块");

}

Father() {

System.out.println("父类的构造函数");

}public static voidmain(String[] args) {

System.out.println("new子类前的main方法");newSon();

System.out.println("new子类后的main方法");

}

}

ac6dc99d57e66bd16064c229a0b25541.png

总结:

在父类的Class中测试继承了父类的子类Class中的执行顺序:

父类的静态代码块>new 对象前的main方法顺序执行>子类的静态代码块>父类的非静态代码块>父类的构造函数>子类的非静态代码块>子类的构造函数>new 对象后的main方法顺序执行

第3个(在父类的Class中测试继承了父类的子类Class)和第2个(在继承了父类的子类Class中测试)对比:

f6ba8b2857259177114911ecf8d09ad1.png

4c9d2374ec95d83a44eb7b5a4e006e06.png

左图是在父类中new 子类然后执行main方法,右图是子类中new 子类然后执行main方法

可以看出来,父类new 子类之前,先执行父类的静态代码块,然后main函数里面的代码顺序执行,直到new 了子类,然后执行子类的静态代码块,然后父类非静态代码块>父类构造函数>子类非静态代码块>子类构造函数>new子类后的main方法顺序执行 在父类中执行了main方法,本身父类执行main方法就会执行一次静态代码块,但是在父类中main方法new了一次子类,按继承关系,父类中的静态代码块应该还会执行,但是控制台中却没有打印,这就是因为静态代码块的特征的原因所致,随着类的加载而执行,而且只执行一次.

如果还是有疑问,则看一下代码:

d6dc74cf725f399df0c5527b71cd8a8c.png

已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页