搜索
首页Javajava教程静态变量、变量、构造器的初使化及实例化过程

本文介绍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中static静态变量的初始化完全解析

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

相关视频:

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

以上是静态变量、变量、构造器的初使化及实例化过程的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案?如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案?Mar 17, 2025 pm 05:46 PM

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)?如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存?如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存?Mar 17, 2025 pm 05:44 PM

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射?如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射?Mar 17, 2025 pm 05:43 PM

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

Java的类负载机制如何起作用,包括不同的类载荷及其委托模型?Java的类负载机制如何起作用,包括不同的类载荷及其委托模型?Mar 17, 2025 pm 05:35 PM

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA

如何将Java的RMI(远程方法调用)用于分布式计算?如何将Java的RMI(远程方法调用)用于分布式计算?Mar 11, 2025 pm 05:53 PM

本文解释了用于构建分布式应用程序的Java的远程方法调用(RMI)。 它详细介绍了接口定义,实现,注册表设置和客户端调用,以解决网络问题和安全性等挑战。

如何使用Java的插座API进行网络通信?如何使用Java的插座API进行网络通信?Mar 11, 2025 pm 05:53 PM

本文详细介绍了用于网络通信的Java的套接字API,涵盖了客户服务器设置,数据处理和关键考虑因素,例如资源管理,错误处理和安全性。 它还探索了性能优化技术,我

如何在Java中创建自定义网络协议?如何在Java中创建自定义网络协议?Mar 11, 2025 pm 05:52 PM

本文详细介绍了创建自定义Java网络协议。 它涵盖协议定义(数据结构,框架,错误处理,版本控制),实现(使用插座),数据序列化和最佳实践(效率,安全性,维护

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用