本文介绍Java 中静态变量、变量、构造器的初使化的执行顺序,加深对类初使化的理解~一般情况,类中会有静太变量、变量、构造器、方法。(其实构造器从某种程度上可以将其理成为静态方法) ,将它们组合在一起之后,便形成了如下一个类
class Art{
static String ar1,ar2,ar3;
static{
ar1 = "good";
ar2 = "perfect";
ar3 = "beautifull";
System.out.println(ar1);
System.out.println(ar2);
System.out.println(ar3);
}
String art1,art2,art3;
{
art1 = "art1";
art2 = "art2";
art3 = "art3";
System.out.println(art1);
System.out.println(art2);
System.out.println(art3);
}
Art(){
System.out.println("Art constructor...");
}
}
大家知道,在我们的项目开发过程中,我们会经常用到Java 的一大特性,继承。 所以我们将 Art 理解成基类,它会有一堆的子类去继承它,所以,我们又得到一个子类 Drawing
class Drawing extends Art{
static String dra1,dra2,dra3;
static{
dra1 = "window";
dra2 = "flay";
dra3 = "flool";
System.out.println(dra1);
System.out.println(dra2);
System.out.println(dra3);
}
String cc1,cc2,cc3;
{
cc1 = "aaa";
cc2 = "bbb";
cc3 = "ccc";
System.out.println(cc1);
System.out.println(cc2);
System.out.println(cc3);
}
Drawing(){
System.out.println("Drawing constructor...");
}
}
Drawing 类也可能有子类,所以我们在此再写一个Drawing 类的子类Cartoon
public class Cartoon extends Drawing{
static String car1,car2,car3;
static{
car1 = "one";
car2 = "two";
car3 = "three";
System.out.println(car1);
System.out.println(car2);
System.out.println(car3);
}
String info1,info2,info3;
{
info1 = "info1";
info2 = "info2";
info3 = "info3";
System.out.println(info1);
System.out.println(info2);
System.out.println(info3);
}
public static void main(String[] args) {
Cartoon cartoon = new Cartoon();
}
}
在 Cartoon 类中,我们对 Cartoon 进行了实例化,我们来分析变量和构造器是如何一步一步进行实例化的
我们看到 main函数
new Cartoon()的时候,JVM 就会去找 Cartoon类,看是不是有基类,然而,根据关键字 extends 查找到了 Drawing这个类,
然后再去Drawing 这个类中查找 是否有 extends 这个关键字,然后又查找到了 Art 这个类,所以他它去找查 Art 类,在Art 类中,并没有查找到 extends 关键字,所以 JVM 会去根据自己的规则再往上去查找,因为 如果没有 使用 extends,那么java 会默认为其添加一个基类 Object 类,这一路查找已经走完,这个时候 JVM 则会去查找带有 static 关键字的静态变量
在 Object 类中,并没有发现带有 static 关键字的静态变量,所以,这个时候 JVM 会往下走,走到 Art类中,找到了带有static 的变量块,并将这些变量划进内存块(栈)中,并将其赋予相应值
static String ar1,ar2,ar3;
static{
ar1 = "good";
ar2 = "perfect";
ar3 = "beautifull";
System.out.println(ar1);
System.out.println(ar2);
System.out.println(ar3);
}
然后JVM再继续往下走,走到了Drawing 类中,发现了其中带有 static 关键字的静态变量块
static String dra1,dra2,dra3;
static{
dra1 = "window";
dra2 = "flay";
dra3 = "flool";
System.out.println(dra1);
System.out.println(dra2);
System.out.println(dra3);
}
走到这里的时候,JVM 做的事情跟走到 Art 类中做的事情是一样的 ,将变量在内存(栈)中分配值,然后执行 System.out.print()方法,将值打印出来,然后继续往下走,找到了Cartoon 类中,做的事情跟走到Drawing类中做的事情是一样的
将static 关键字的静态变量在内存(栈)进行赋值,并进行打印。
static String car1,car2,car3;
static{
car1 = "one";
car2 = "two";
car3 = "three";
System.out.println(car1);
System.out.println(car2);
System.out.println(car3);
}
JVM将这个动作执行完成后,第二步便是开始执行实例化对像的动作,JVM 会开始往上走 从
Cartoon ——> Drawing——> Art ——> Object
首先在 Object 类中,进行变量实例化 然后 执行 object 的构造器函数
执行完成后,沿着线路执行到 Art 类,在 Art 类中 将变量块
String art1,art2,art3;
{
art1 = "art1";
art2 = "art2";
art3 = "art3";
System.out.println(art1);
System.out.println(art2);
System.out.println(art3);
}
在堆上进行赋值,然后执行打印语句,然后执行 Art 类的构造方法,构造方法执行完成后,继续往下走
执行到Drawing 类中,发现 Drawing 类中有这些变量
String cc1,cc2,cc3;
{
cc1 = "aaa";
cc2 = "bbb";
cc3 = "ccc";
System.out.println(cc1);
System.out.println(cc2);
System.out.println(cc3);
}
JVM 将这些变量在内存堆中进行初使化,如果有基本类型,发现并没有将其赋值,则会赋默认值,其它类型如果没有赋值,则会将其赋默认值 null ,然后 JVM 则会执行Drawing 类的构造方法。然后JVM 继续往下走,走到了 Cartoon 类中
又进行上重复的动作
实例化 变量
String info1,info2,info3;
{
info1 = "info1";
info2 = "info2";
info3 = "info3";
System.out.println(info1);
System.out.println(info2);
System.out.println(info3);
}
将其在堆内存上赋值,然后将对应的值打印出来,然后执行Cartoon 类的构造方法
下面将整个程序贴出来,大家先理解一下,程序的执行结果 然后再将程序执行一遍,看看你的理解是否跟程序跑的结果一致
class Art extends Object{
static String ar1,ar2,ar3;
static{
ar1 = "good";
ar2 = "perfect";
ar3 = "beautifull";
System.out.println(ar1);
System.out.println(ar2);
System.out.println(ar3);
}
String art1,art2,art3;
{
art1 = "art1";
art2 = "art2";
art3 = "art3";
System.out.println(art1);
System.out.println(art2);
System.out.println(art3);
}
Art(){
System.out.println("Art constructor...");
}
}
class Drawing extends Art{
static String dra1,dra2,dra3;
static{
dra1 = "window";
dra2 = "flay";
dra3 = "flool";
System.out.println(dra1);
System.out.println(dra2);
System.out.println(dra3);
}
String cc1,cc2,cc3;
{
cc1 = "aaa";
cc2 = "bbb";
cc3 = "ccc";
System.out.println(cc1);
System.out.println(cc2);
System.out.println(cc3);
}
Drawing(){
System.out.println("Drawing constructor...");
}
}
public class Cartoon extends Drawing{
static String car1,car2,car3;
static{
car1 = "one";
car2 = "two";
car3 = "three";
System.out.println(car1);
System.out.println(car2);
System.out.println(car3);
}
String info1,info2,info3;
{
info1 = "info1";
info2 = "info2";
info3 = "info3";
System.out.println(info1);
System.out.println(info2);
System.out.println(info3);
}
public static void main(String[] args) {
Cartoon cartoon = new Cartoon();
}
}
下面将程序的执行结果贴出来
good
perfect
beautifull
window
flay
flool
one
two
three
art1
art2
art3
Art constructor...
aaa
bbb
ccc
Drawing constructor...
info1
info2
info3
相关文章:
Java类的静态成员、静态代码块、普通成员、普通代码块、构造方法初始化执行的顺序详细说明
相关视频:
Atas ialah kandungan terperinci 静态变量、变量、构造器的初使化及实例化过程. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!