导航:首页 > 编程语言 > java静态代码块调用

java静态代码块调用

发布时间:2023-07-31 21:50:36

java中的静态代码块、代码块、构造器的执行顺序是怎样呢,这三者有什么作用呢

还是不得不拿出<clinit>和<init>说事了。以下拿类T作为讲解的对象类型吧:
class T{
private static final String msg = "this is a test class!";
private static int version = 1;

static{

version = 2;
desc = "class T";
}
private static String desc = “T is a test Class”;

private int age = 2;
{
age = 10;
name = "panda";

}
public T(){

age = 12;
name = "foxli";
}
private String name = "micky";
}
类T,存在静态域version和desc,实例域和name。
类中,存在静态代码块static{}以及实例化代码块{}和默认的构造方法。
------------------------------------------------------------------------------------------------------------
先来说一下类型初始化方法<clinit>:
JVM通过Classload进行类型加载时,如果在加载时需要进行类型初始化操作时,则会调用类型的初始化方法。类型初始化方法主要是对static变量进行初始化操作,对static域和static代码块初始化的逻辑全部封装在<clinit>方法中。
java.lang.Class.forName(String name, boolean initialize,ClassLoader loader),其中第二个参数就是是否需要初始化。
Java类型初始化过程中对static变量的初始化操作依赖于static域和static代码块的前后关系,static域与static代码块声明的位置关系会导致java编译器生成<clinit>方法打字节码。
由上例子,T类型的类型初始化方法<clinit>最后编译出来的字节码顺序大概是这样的:
T.<clinit>{
private static int version;
private static String desc;
version = 1;
version = 2;
desc = "class T";
desc = "T is a test Class";
}
类型的初始化方法<clinit>只在该类型被加载时才执行,且只执行一次。
-------------------------------------------------------------------------------------------------------------
接下来说一下对象实例化方法<init>:
Java对象在被创建时,会进行实例化操作。该部分操作封装在<init>方法中,并且子类的<init>方法中会首先对父类<init>方法的调用。
Java对象实例化过程中对实例域的初始化赋值操作全部在<init>方法中进行,<init>方法显式的调用父类的<init>方法,实例域的声明以及实例初始化语句块同样的位置关系会影响编译器生成的<init>方法的字节码顺序,<init>方法以构造方法作为结束。
由上例子,T对象的对象实例化方法<init>最后编译出来的字节码顺序大概是这样的:
T.<init>{
int age;
String name;
this.age = 2;
this.age = 10;
this.name = "panda";
this.name = "micky";
this.age = 12;
this.name = "foxli";

}
对象实例化方法<init>以构造方法作为结束。当前并没有考虑存在父类的情况,如果存在,<init>方法首先会调用父类的<init>方法。
-------------------------------------------------------------------------------------------------------------
PS:这里面的msg称为编译时常量,他不再<clinit>方法中出现。
其中<clinit>方法在javap命令中没有显示,javap输出的static{}就是<clinit>方法。

Ⅱ Java的静态块和初始化块分别何时执行有什么区别

静态初始化块:当类第一次加载时执行。

非静态初始化块:非静态初始化块会在构造函数执行时,且在构造函数主体代码执行之前被执行。

区别如下:

1、执行次数不同

静态块只执行一次,初始化块可以执行多次。

2、作用不同

静态初始化块仅能初始化类变量,即static修饰的数据成员。

非静态初始化块可以初始化类的实例变量。

(2)java静态代码块调用扩展阅读:

使用Java静态代码块注意事项:

1、它是随着类的加载而执行,只执行一次,并优先于主函数。具体说,静态代码块是由类调用的。类调用时,先执行静态代码块,然后才执行主函数的。

2、静态代码块其实就是给类初始化的,而构造代码块是给对象初始化的。

3、静态代码块中的变量是局部变量,与普通函数中的局部变量性质没有区别。

4、一个类中可以有多个静态代码块。

5、对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。

Ⅲ Java静态代码块和静态方法的区别

没有静态类,如果有什么需要提前实例化的话,参考下面方式
static
int
i;
static{
i=1;
}
public
static
void
f(){
system.out.println(i);
}

Ⅳ java 调用静态方法和构造函数和静态块执行的先后顺序

java中首先是静态块先执行,静态方法,最后是构造函数。示例如下:

publicclassExA{
static{
System.out.println("父类--静态代码块");
}

publicExA(){
System.out.println("父类--构造函数");
}

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

publicstaticvoidmain(String[]args){
newExB();
}
}

classExBextendsExA{
static{
System.out.println("子类--静态代码块");
}
{
System.out.println("子类--非静态代码块");
}

publicExB(){
System.out.println("子类--构造函数");
}
}

执行结果
=====
父类--静态代码块
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数

Ⅳ java,静态方法为什么不能调用类成员

楼主想问的应该是不用调用成员变量吧
首先,这涉及到代码执行优先级的问题,在一个Java类中,存在的代码形式有静态代码块(花括号{}包裹住的代码片段),静态方法,构造函数,成员方法。不同形式的代码执行顺序不同:
1、静态代码块:当类被载入时,静态代码块被执行,且只被执行一次,静态代码块常用来执行类属性的初始化。
2、静态方法(也叫类方法):在类加载的时候,在不创建对象的情况下执行,可以直接用类名调用。
两者的区别是静态代码块是主动执行的,静态方法是被动执行,只有被调用时才执行。
3、构造函数在创建对象的时候执行。
4、成员方法在被调用的时候执行。
总结:Java代码执行先后顺序:静态代码块>静态方法>构造函数=非静态代码块。
在了解执行顺序后,楼主的问题就很容易解答了。
从层级上看,静态方法属于类级别,成员变量属于对象级别。同时静态方法也先于构造函数执行,内存也没给类成员分配空间,说白就是都不存在,你静态方法调用一个不存在的变量肯定不行的呀。

阅读全文

与java静态代码块调用相关的资料

热点内容
成都制作pdf文件 浏览:735
怎么样点开电脑里面的网络连接 浏览:755
微信怎么退出账号 浏览:32
w微信开发者工具 浏览:325
数据库还原附加 浏览:713
打包成exe执行文件 浏览:652
信丰营销app有哪些 浏览:463
苹果文件下载项如何下载 浏览:179
ps抠婚纱教程 浏览:203
如何在移动硬盘上隐藏文件夹 浏览:451
瑞虎8老车机怎么刷app 浏览:992
学ui设计要学java吗 浏览:275
淘宝票房数据源怎么调整 浏览:470
iphone5s升级ios卡黑屏 浏览:622
u盘没用的文件删不了怎么办 浏览:561
文件夹解锁工具 浏览:528
creo如何减小stp文件大小 浏览:857
法那科英制螺纹数控怎么编程 浏览:430
恋舞最新升级奖励表 浏览:149
四川语音交友恋爱app有哪些 浏览:528

友情链接