Java中main方法,静态,非静态的执行顺序解析

AD23导出Gerber文件保姆级教程:从PCB到嘉立创下单,一步不落(附常见问题排查) 本文提供AD23导出Gerber文件的详细教程,涵盖从PCB设计检查到嘉立创下单的全流程,特别针对两层板设计场景,帮助新手工程师避免常见错误。内容包括Gerber文件生成步骤、钻孔文件设置、文件检查工具推荐以及嘉立创下单实操指南,确保PCB打样顺利。 阅读详情
Java程序运行时,第一件事情就是试图访问main方法,因为main相等于程序的入口,如果没有main方法,程序将无法启动,main方法更是占一个独立的线程,找到main方法后,是不是就会执行mian方法块里的第一句话呢?答案是不一定

 看看下面两种最常见的情况:

  第一种情况:

    main方法在一个具有其他方法或属性的类中;

public class Test1 {
public static String name;
    public Test1() {
    }
    public static void get() {
        System.out.println("Test start");
    }
    public static void main(String[] args) {
        System.out.println("main start");
        Test1 bb = new Test1();
    }
}
第二种情况:

              main方法在一个没有其他方法或属性的类中;

public class Test {
    public static void main(String[] args) {
        Student stu =new Student();
    }
}

分析:

  因为静态部分是依赖于类,而不是依赖于对象存在的,所以静态部分的加载优先于对象存在。

  当找到main方法后,因为main方法虽然是一个特殊的静态方法,但是还是静态方法,此时JVM会加载main方法所在的类,试图找到类中其他静态部分,即首先会找main方法所在的类。

 

执行顺序大致分类:

  1.静态属性,静态方法声明,静态块。

  2.动态属性,普通方法声明,构造块。

  3.构造方法。

    

1.1 静态:

  当加载一个类时,JVM会根据属性的数据类型第一时间赋默认值(一举生成的)。然后再进行静态属性初始化,并为静态属性分配内存空间,静态方法的声明,静态块的加载,没有优先级之分,按出现顺序执行,静态部分仅仅加载一次。至此为止,必要的类都已经加载完毕,对象就可以被创建了。

1.2 普通:

  当new一个对象时,此时会调用构造方法,但是在调用构造方法之前,(此刻1.1已经完成,除非被打断而暂停)执行动态属性定义并设置默认值(一举生成的)。然后动态属性初始化,分配内存,构造块,普通方法声明(只是加载,它不需要初始化,只有调用它时才分配内存,当方法执行完毕后内存立即释放),没有优先级之分,按出现顺序执行。最后进行构造方法中赋值。当再次创建一个对象,不再执行静态部分,仅仅重复执行普通部分。

  注意:如果存在继承关系,创建对象时,依然会首先进行动态属性进行定义并设默认值,然后父类的构造器才会被调用,其他一切都是先父类再子类(因为子类的static初始化可能会依赖于父类成员能否被正确初始化),如果父类还有父类,依次类推,不管你是否打算产生一个该父类的对象,这都是自然发生的。

下面是一道小程序:

  代码部分:

class A {
    public A() {
        System.out.println("A的构造方法");
    }

    public static int j = print();

    public static int print() {
        System.out.println("A print");
        return 521;
    }
}

public class Test1 extends A {
    public Test1() {
        System.out.println("Test1的构造方法");
    }

    public static int k = print();

    public static int print() {
        System.out.println("Test print");
        return 522;
    }

    public static void main(String[] args) {
        System.out.println("main start");
        Test1 t1 = new Test1();
    }
}
运行结果:

A print
Test print
main start
A的构造方法
Test1的构造方法

下面是一道阿里巴巴的面试题:非常经典,可以不断的改变程序的顺序,来找到执行顺序机制。

  代码部分:

public class Text {
    public static int k = 0;
    public static Text t1 = new Text("t1");
    public static Text t2 = new Text("t2");
    public static int i = print("i");
    public static int n = 99;
    public int j = print("j");

    {
        print("构造块");
    }
    static {
        print("静态块");
    }

    public Text(String str) {
        System.out.println((++k) + ":" + str + "   i=" + i + "    n=" + n);
        ++i;
        ++n;
    }

    public static int print(String str) {
        System.out.println((++k) + ":" + str + "   i=" + i + "    n=" + n);
        ++n;
        return ++i;
    }

    public static void main(String args[]) {
        Text t = new Text("init");
    }
}

运行结果:
1:j   i=0    n=0
2:构造块   i=1    n=1
3:t1   i=2    n=2
4:j   i=3    n=3
5:构造块   i=4    n=4
6:t2   i=5    n=5
7:i   i=6    n=6
8:静态块   i=7    n=99
9:j   i=8    n=100
10:构造块   i=9    n=101
11:init   i=10    n=102

总结:只要按照这个步骤,遇到这一类问题就可以解决了。  

          1-3:类加载过程,不涉及构造方法

          1-5: 实例化过程,涉及构造方法

  1.类中所有属性的默认值(一举而成)

  2. 父类静态属性初始化,静态块,静态方法的声明(按出现顺序执行)

  3. 子类静态属性初始化,静态块,静态方法的声明 (按出现顺序执行)

  4.  调用父类的构造方法,

      首先父类的非静态成员初始化,构造块,普通方法的声明(按出现顺序执行)

      然后父类构造方法

  5.  调用子类的构造方法,

      首先子类的非静态成员初始化,构造块,普通方法的声明(按出现顺序执行)

      然后子类构造方法

 

   (注意:类加载过程中,可能调用了实例化过程(因为static可以修饰方法,属性,代码块,内部类),此时则会暂停类加载过程而先执行实例化过程(被打断),执行结束再进行类加载过程,上面阿里那道面试题就是典型的暂停类加载。

 

下面附加一个小程序来显示新建对象时属性的四个过程:

public class Test {
    public static void main(String[] args) {
        Student stu = new Student("zhangan", 21);
    }
}

class Student {
    public String name = "李寻欢";
    public int age = 20;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

}

1.

2.

3.

4.


感谢原文作者,原文链接 点击打开链接

华为OD机考双机位C卷 - 两个字符串间的最短路径(Java & Python& JS & C/C++ & GO ) 华为OD机考双机位C卷 - 两个字符串间的最短路径(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。 阅读详情

相关推荐

西电计组实验二 运算器实验

算术逻辑运算实验 一.实验目的   1.了解简单运算器的数据传输通路。   2.验证运算功能发生器的组合功能。   3.掌握算术逻辑运算加、减、与的工作原理。   4.验证实验台运算的8位加、减、与、直通功能。   5.按给定数据,完成几种指定的算术和逻辑运算。 二.实验原理   算术逻辑单元ALU的数据通路如图2-1所示。其中运算器ALU181根据74LS181的功能用VHDL硬件描述语言编辑而成,构成8位字长的ALU。参加运算的两个8位数据分别为A[7…0]和B[7…0],运算模式由S[3…0]的16种

Polaris的博客 1万+

深入了解Java程序执行顺序

Java中main方法,静态,非静态的执行顺序详解   Java程序运行时,第一件事情就是试图访问main方法,因为main相等于程序的入口,如果没有main方法,程序将无法启动,main方法更是占一个独立的线程,找到main方法后,是不是就会执行mian方法块里的第一句话呢?答案是不一定  看看下面两种最常见的情况:   第一种情况:     main方法在一个具有其他方法或属性的类中;...

weixin_33836223的博客 504

MMDetection框架入门教程(完全版)

  网上MMDetection的教程看似有很多,但感觉都不成系统,看完一圈下来还是不知道MMDetection要怎么用。这里还是推荐直接跟着官方教程,结合源码学习MMDetection,相关链接汇总如下: 官方教程 - MMCV 官方教程 - MMDetection 官方教程 - 不得不知的 MMDetection 学习路线(个人经验版) 西安交大课件 - mmdetection教程(使用篇)   本文会介绍如何在MMDetection中从头开始搭建一套属于自己的算法。前几篇博客算是本人学习过...

Sual 10万+

java中的执行顺序_Java代码执行顺序()

静态的属于类的,非静态属于对象的!### 1、先执行静态代码块publicclassOrderTest{static{System.out.println("static code execute");}publicstaticvoidmain(String[]args) {System.out.println("main() execute");}}执行结果:staticcodeexecutem...

weixin_39753791的博客 380

别再只调电压了!深入理解数控电源的CC/CV模式与双闭环PID控制(以BUCK电路为例)

本文深入解析数控电源的CC/CV模式与双闭环PID控制技术,以BUCK电路为例,探讨如何通过双闭环控制优化负载突变响应和模式切换稳定性。文章详细介绍了电压环与电流环的协同工作原理、PID参数整定技巧及工程实践中的非线性补偿方法,帮助工程师提升电源设计的智能控制能力。

weixin_27017211的博客 263

动态表单设计

自定一表单数据结构。内容展示如有必要行转列。前端根据题目类型自定义组件后端跟俊题目类型用策略模式校验各种类型这样有统计功能的简单动态问卷就可以了展示时可能某些场景需要行转列。大概估摸使用的话有可能kmic_form_data_detail表的记录数比较大,后期再考虑数据或者表迁移或拆分。

zquwei的博客 3455

java代码的执行顺序

今天测试了一下java代码的执行顺序。通常,我们会认为jvm加载一个类时,首先会执行main方法,其实并不是这样的。测试一下得知,真正执行顺序如下:static变量—>Static代码块—> mani()—>实例变量—>代码块—>构造函数       JVM只为静态分配一次内存,在加载类的过程中首先找带static的,为其内存分配 测试代码:package test;/

终日思 < 须臾学 1317

华为OD机考2025B卷 - 报文响应时间(Java & Python& JS & C++ & C )

华为OD机考2025B卷 - 报文响应时间

算法大师! 8083

Java中main 方法的执行过程

参考 https://www.cnblogs.com/max-home/p/12270183.html。

pxyp123的博客 3526

财务惊呼“不可能”!Python 自动识别 PDF 发票,数据秒级录入系统

电子发票(原生 PDF):这种最爽,文字是可以选中的。我们用 PyPDF2 直接提取文本,速度快,准确率 100%。 纸质扫描/拍照发票:这种是图片。必须上 OCR(光学字符识别)。我们要用百度开源的 PaddleOCR,这是目前中文识别效果最好的开源库之一,吊打早已过气的 Tesseract。

BUG猿的博客 1024

Java--main()方法

如果要在 main() 方法中调用本类中的其他方法,则该方法也必须是静态的,否则需要先创建本类的实例对象,然后再通过对象调用成员方法。,这是一个常用于对类进行单元测试(对软件中的最小可测试单元进行检查和验证)的技巧。在同一个package下面,直接用main方法调用。3、main() 方法没有返回值,4、main() 方法定义必须是“2、main() 方法是。

weixin_44688529的博客 3592

AI人工智能领域多模态数据融合在智能诊断系统的应用案例

在医疗诊断领域,单一模态数据(如CT影像或电子病历)的局限性日益凸显——就像老中医只"望"不"闻"会漏掉关键线索。本文将深入解析多模态数据融合技术如何突破这一瓶颈:从生活化的"中医四诊"类比切入,拆解数据层/特征层/决策层融合的技术原理;结合肺癌智能诊断的真实案例,展示CT影像、病理文本、基因数据、生命体征的多模态融合全流程;最后探讨技术落地的核心挑战与未来方向。无论你是医疗从业者、AI开发者,还是对智能诊断感兴趣的爱好者,都能从中获得技术启发与应用思路。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 833

Java初始化顺序

Java初始化顺序 无继承普通类初始化顺序(同一优先级按语句先后顺序进行初始化) 1、静态属性、静态代码块 2、main方法 3、非静态属性、非静态代码块 4、构造方法(构造器) 有继承的类的初始化顺序 main方法在父类内时: 1、父类静态代码块 2、父类静态变量 3、main函数 4、子类静态代码块 5、子类静态变量 6、父类成员代码块 7、父类成员变量 8、父类构造器 9、子类代码块 10、子类成员变量 11、子类构造器 main方法在子类内时: 1、父类静态代码块 2、父类静态变量 3、子类静态代码

weixin_45826787的博客 210

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java实例化后自动执行_Java的实例化顺序(程序执行顺序)

加载/执行顺序:牢记一点:静态和非静态分开处理使用到静态加载时,静态又分为: 静态变量, 静态代码块, 其中加载顺序是按照类中书写的先后顺序加载的非静态加载顺序: 按照非静态书写顺序加载/执行静态方法,实例方法只有在调用的时候才会去执行当静态加载中遇到需要加载非静态的情况: 先加载非静态再加载静态。下面两种情况的加载顺序不涉及到父类子类的情况:1) 首先将所有静态成员变量加载进来, 但是不赋值,J...

weixin_33444829的博客 1284

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java基础--代码块执行顺序

代码块执行顺序 静态代码块—>非静态代码块—>构造函数—>main方法 举例: 例1 test类: public class test { static { System.out.println("静态代码块"); } public test() { System.out.println("构造函数"); } ...

Thetop 120

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

11-代码的执行顺序

一、代码执行顺序1、编译器编译完之后,.class 文件中就包含构造函数了。且静态成员在编译生成 .class 文件时,就已经有所属的类了(静态成员随着类的加载而存在)2、代码执行顺序:(1)当执行 java xxx 命令时,类加载进内存,开辟空间。方法区中,构造函数等非静态方法加载进方法区,静态成员加载进方法区的静态区。以上加载顺序按照代码的执行顺序。方法区中存储的是方法的代码,无论是静态的还是...

ruyu00的博客 2465

java程序执行顺序_java程序的执行顺序

其实这段代码不难以理解,只需要注意一下几点:静态变量只会初始化一次,在初始化的时候int会被赋值为0所以也就意味着在这个静态变量只会在第一次加载该类的时候运行。然后看代码:注意在main方法中该类已经第一次初始化了,也就是下面这段代码:publicstaticvoidmain(String[]args){ExeOrder1e=newExeOrder1("init");//注意,...

weixin_35066076的博客 266

Java程序初始化

文章目录一. 为什么需要主方法二. Java程序初始化的顺序 一. 为什么需要主方法 Java是面向对象的语言,即所谓的一切皆对象。我们可以吧一个Java程序想象成为一个房子,你要进入房子,必须得先开门来进入房间。房间里的所有东西,都可以抽象成对象。你要做饭,洗衣服,得通过对象(锅碗瓢盆洗衣机)来做这件事,具体怎么做,先干啥后干啥,得看具体到做什么事,也就是通过对象来调用方法。而程序的入口,就是...

iqqcode 545

java程序初始化

觉得Core Java在Java 初始化过程的总体顺序没有讲,只是说了构造器时的顺序,作者似乎认为路径很多,列出来比较混乱。我觉得还是要搞清楚它的过程比较好。所以现在结合我的学习经验写出具体过程:   过程如下:   1.在类的声明里查看有无静态元素(static element, 我姑且这么叫吧),比如:   static int x = 1,   {   //b...

a561931585的博客 139

AJPFX总结Java 程序初始化过程

觉得Core Java在Java 初始化过程的总体顺序没有讲,只是说了构造器时的顺序,作者似乎认为路径很多,列出来比较混乱。我觉得还是要搞清楚它的过程比较好。所以现在结合我的学习经验写出具体过程: 过程如下: 1.在类的声明里查看有无静态元素(static element, 我姑且这么叫吧),比如:复制内容到剪贴板代码:static int x = 1, {  //block  float sss...

AJPFX的博客 220

Java之类的实例化步骤

Java之类的实例化步骤,希望对同学们学习java开发有所帮助,首先对于java工程师来说,static非常容易在面试的时候被问到。书面上说static是静态的。其实我把它理解为“全局的”。什么叫全局的?全局的属性,全局的方法,全局的代码块。   全局属性,全局方法,比较好理解就是这个类所有的对象都共有的属性和方法。因为是整个类共有的,所以可以通过声明直接调用。我把它理解为“单例模式”的属性和方法。所谓单例模式就是指这个类声明的所有对象共享这些属性和方法。一个对象对这个属性进行了修改,所有对象再调这个属性都

qq_35970166的博客 581

代码的执行顺序

1. Test.java和Person.java编译(javac)成Test.class和Person.class,两个class文件放入方法区。 2. 执行main方法,main方法入栈。 3. 执行Person zhang=new Person();此时对象zhang进入堆,其中包括其变量和方法(若其中的变量和方法为static,则放入方法区),同时把zhang的地址值传入main方法。 4. 执行run方法,run方法入栈。 5. 执行完毕,依次出栈(先进后出),释放内存。

galaxy的博客 399

Java- 类的高级特性

文章目录1.封装2.private 关键字3.封装和private的应用4.this关键字5.构造方法6.成员变量的注意事项7.static关键字8.main方法详解9.学习使用 Java API10.代码块11.继承12.多态13. 抽象类14.接口15.包16.权限修饰符17. 内部类 1.封装 概述:隐藏对象的属性 和 实现细节,仅对外提供公共的访问方式。 原则:1.讲不需要用户访问的内容隐藏起来。 ​ 2.将属性进行隐藏,提供公共的访问方式。 优点:1.安全性高 ​ 2.独立性高 ​ 3

warmsun 577

类加载顺序

class A{ public int i = m1(); public static int j = m2(); public int k = 0; public A() { System.out.println(1); } public int m1(){ System.out...

weixin_30613727的博客 71

java静态块 非静态块 构造方法顺序

java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的static,都是最先初始化好的。结构如下:  static {  静态语句代码块  }  {  非静态语句代码块  }  异同点  相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋     值。  不同点:静态代码块

cws1214的专栏 497
上一篇: java集合的三种遍历方式以及各自优缺点分析
下一篇: MVC的理解和优缺点的总结
sunforraining
博客等级 码龄9年 13粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值