0

0

静态变量、变量、构造器的初使化及实例化过程

php是最好的语言

php是最好的语言

发布时间:2018-07-28 11:23:16

|

1630人浏览过

|

来源于php中文网

原创

本文介绍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);
    }

Mokker AI
Mokker AI

AI产品图添加背景

下载

将其在堆内存上赋值,然后将对应的值打印出来,然后执行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中static静态变量的初始化完全解析

Java类的静态成员、静态代码块、普通成员、普通代码块、构造方法初始化执行的顺序详细说明

相关视频:

静态变量和成员变量的区别-JAVA 初级入门视频教程

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

193

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

19

2026.02.03

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1031

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

186

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

134

2025.11.27

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号