首页 > 编程语言 >Java技术_基础技术(0003)_类执行顺序详解+实例(阿里面试题)+详细讲解+流程图

Java技术_基础技术(0003)_类执行顺序详解+实例(阿里面试题)+详细讲解+流程图

时间:2023-04-21 09:47:27浏览次数:47  
标签:面试题 Java 变量 0003 s1 StaticTest static 执行 赋值

一、总体原则

列出执行顺序的原则(这里本人出了简化,比较明了。可能有漏的,请帮忙补充,但应付该实例足以):

 

 ==父类先于子类;

 
 ==静态先于非静态;
 
 ==变量和块先于构造方法;
 
 ==变量声明先于执行(变量赋值、块执行);(这一点是根据数据在内存中是如何存储的得出的,基本类型、对象、String均不一样,但是总结起来应该是这样)
 
 ==变量赋值与块优先级相同;
 
 ==同优先级的从上至下执行;

二、实例

public class StaticTest {
    public static int k = 0;  // 1
    public static StaticTest s1 = new StaticTest("t1");  // 2
    public static StaticTest s2 = new StaticTest("t2");  //3
    public static int i = print("i");  //4
    public static int n = 99;   //5
    public int j = print("j");// 6

    {
        print("构造快");
    }  // 7

    static{
        print("静态块");
    }  // 8

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

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

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

三、结果

syso1 ==== 1:j i=0 n=0
syso2 ==== 2:构造快 i=1 n=1
syso3 ==== 3:t1 i=2 n=2
syso4 ==== 4:j i=3 n=3
syso5 ==== 5:构造快 i=4 n=4
syso6 ==== 6:t2 i=5 n=5
syso7 ==== 7:i i=6 n=6
syso8 ==== 8:静态块 i=7 n=99
syso9 ==== 9:j i=8 n=100
syso10 ==== 10:构造快 i=9 n=101
syso11 ==== 11:init i=10 n=102

四、说明

一步一步按照上面的原则来分析,应该比较详细了,这一部分内容在下载的代码里也有。分析如下:

/**
* ====step1====首先声明StaticTest类的static变量并给与默认值。
*
* 故,执行1、2、3、4、5变量的声明。运行后变量如下:
*
* k=0; s1=null; s2=null; i=0; n=0; j未声明;
*
* ====step1 end====
*/
/**
* ====step2====变量声明完成后,为这些static变量赋值以及执行static块(赋值和块优先级一致,在前面的先执行).
*
* 故,执行1、2、3、4、5的赋值代码,8的块代码
*
* ========step2_1====当step2执行到2时,new了一个新的StaticTest对象.
* (此时2、3、4、5的赋值、8的代码都没执行,变量k被赋值为0,其余仍与step1中一致 )
* 这时,static变量已经声明(static变量是类属性,与对象无关),所以这里直接声明非static变量并给与默认值。
*
* 故,执行6变量的声明,运行后变量如下:
*
* k=0; s1=null; s2=null; i=0; n=0; j=0(s1的);
*
* ========step2_2====变量声明完成后,为这些非static变量赋值以及执行非static块。
*
* 故,执行6变量的赋值代码(syso1====k、n、i、j均+1),7的块代码(syso2====k、n、i均+1),运行后变量如下:
*
* k=2; s1=null; s2=null; i=2; n=2; j=1(s1的);
*
* ========step2_3====变量赋值、块执行完毕后,执行构造方法。
*
* 故,执行9构造方法(syso3====k、n、i均+1),运行后变量如下:
*
* k=3; s1=StaticTest对象; s2=null; i=3; n=3; j=1(s1的);
*
* ========step2_4====s1构造完毕后,继续执行3。同样是new一个新的StaticTest对象.
* 过程与step2_1至step2_3一致。
*
* 故,执行3(syso4====k、n、i、j(j=0)均+1;syso5====k、n、i均+1;syso6====k、n、i均+1),
* 运行后变量如下:
*
* k=6; s1=StaticTest对象; s2=StaticTest对象; i=6; n=6; j=1(s2的);
*
* ========step2_5====s2构造完毕后,继续执行4、5的赋值,为i和n赋值.
*
* 故,执行4(syso7====k、n、i均+1,i被重新赋值)、5(n被重新赋值)的赋值代码,运行后变量如下:
*
* k=7; s1=StaticTest对象; s2=StaticTest对象; i=7; n=99; j未声明;
*
* ========step2_6====static变量赋值完毕后,执行8的static块。
*
* 故,执行8(syso8====k、n、i均+1),运行后变量如下:
*
* k=8; s1=StaticTest对象; s2=StaticTest对象; i=8; n=100; j未声明;
*
* ====step2 end====
*/
/**
* ====step3====static变量及块完成后,声明非static变量并给与默认值.
*
* 故,执行6变量的声明。运行后变量如下:
*
* k=8; s1=StaticTest对象; s2=StaticTest对象; i=8; n=100; j=0(main的);
*
* ====step3 end====
*/
/**
* ====step4====非static变量声明完成后,为这些变量赋值以及执行非static块(赋值和块优先级一致,在前面的先执行)。
*
* 故,执行6的赋值代码(syso9====k、n、i均+1,j=++i),7的块代码(syso10====k、n、i均+1)。运行后变量如下 :
*
* k=10; s1=StaticTest对象; s2=StaticTest对象; i=10; n=102; j=9(main的);
*
* ====step4 end====
*/
/**
* ====step5====变量赋值、块执行完毕后,执行构造方法。
*
* 故,执行9构造方法(syso11====k、n、i均+1),运行后变量如下:
*
* k=11; s1=StaticTest对象; s2=StaticTest对象; i=11; n=103; j=9(main的);
*
* ====step5 end====
*/

 

https://developer.aliyun.com/article/49257

标签:面试题,Java,变量,0003,s1,StaticTest,static,执行,赋值
From: https://www.cnblogs.com/wxdlut/p/17339178.html

相关文章

  • ABB工业控制器 UNITROL 1020 3BHE030579R0003 UNS0119A-Z,V1 3BHE030579R0001
    W;1  ⑧0③0①⑦77⑤  9ABBUNITROL10203BHE030579R0003 UNS0119A-Z,V13BHE030579R0001 DDC779BE023BHE006805R0002 XO08R21SBP260109R1001 PM866K013BSE050198R1 CI858K013BSE018135R1 PU515A3BSE032401R1 励磁控制系统的主要任务是向发电机......
  • java调用python脚本,用到tensorflow、keras等第三方库
    https://blog.csdn.net/jstlovely/article/details/121247764?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168110434116800227452800%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168110434116800227452800&......
  • 【Java基础】day16
    day16一、switch-case和if-else谁更快?switch-case在switch-case中,case的值是连续的话,会生成一个TableSwitch来进行优化,这样的情况下,只需要在表中进行判断即可。这里使用0-4的连续值来进行测试如果说多加几个Case的值,但是范围控制在比较小的范围时:这里使用0......
  • Java:谈谈线程池的使用?
    简介线程池是一种利用池化技术思想来实现的线程管理技术,主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。核心参数1、核心线程数2、最大线程数3、空闲线程最大存活时间4、时间单位5、线程等待队列5、线程工厂......
  • JavaScript学习
    JS中的注释学习一个语言,先学习一个语言的注释,因为注释是给我们自己看的,也是给开发人员看的写好一个注释,有利于我们以后阅读代码5-1单行注释一般就是用来描述下面一行代码的作用可以直接写两个/,也可以按ctrl+///我是一个单行注释//下面代码表示在浏览器里面出现一个弹出......
  • JavaScript学习笔记
    SassSASS官网世界上最成熟、最稳定、最强大的专业级CSS扩展语言!sass是一个css的预编译工具也就是能够更优雅的书写csssass写出来的东西浏览器不认识依旧是要转换成css在浏览器中运行变量定义一个变量,在后面的代码中使用使用$来定义变量//定义一个$c作为变量,值是红......
  • JAVA访问修饰符与关键字
    访问修饰符定义:Java中,可以使用访问修饰符来保护对类、变量、方法和构造方法的访问。Java支持4种不同的访问权限。分类:private:在同一类内可见。使用对象:变量、方法。注意:不能修饰类(外部类)default(即缺省,什么也不写):在同一包内可见,不使用任何修饰符。使用对象:类......
  • Java Long对象对比,用equals函数
    文章目录一、前文二、调试三、后记一、前文同事问我一个问题,我咋一看也愣住了代码:if(ObjectUtil.isNotNull(temp.getUserId())&&temp.getUserId()!=SecurityUtils.getUserId()){logger.error(temp.toString());logger.error("SecurityUtils.getUserId()="+Secur......
  • 学习JavaScript
    操作步骤开通语音识别服务在调用语音识别相关接口前,您需要进入 语音识别控制台,进行实名认证和人脸认证,认证完成后,阅读《用户协议》后勾选“我已阅读并同意《用户协议》”,然后单击【立即开通】,即可一键开通录音文件识别、实时语音识别、一句话识别、录音文件识别极速版、语......
  • JavaScript的节点操作
    目录节点概述节点层级添删等节点操作使用节点操作的示例节点概述一般来说,节点至少拥有nodeType,nodeName,nodeValue这三个基本属性1.元素节点的nodeType为12.属性节点的nodeType为23.文本节点的nodeType为3(包括换行,文字,空格)节点层级1.父节点:node.parentNode(1)paren......