静态变量、变量、构造器的初使化及实例化过程
本文介绍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类的静态成员、静态代码块、普通成员、普通代码块、构造方法初始化执行的顺序详细说明
相关视频:
以上是静态变量、变量、构造器的初使化及实例化过程的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

在使用IntelliJIDEAUltimate版本启动Spring...

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

在使用TKMyBatis进行数据库查询时,如何优雅地获取实体类变量名以构建查询条件,是一个常见的难题。本文将针...

理解Spring项目启动中循环依赖的随机性在进行Spring项目开发时,可能会遇到项目启动时由于循环依赖导致的随机...
