[原]关于Java基础的一道题目

下面代码的结果是什么:

java 代码
  1. public class Test {
  2. private static Test test = new Test();
  3. public static int num1;
  4. public static int num2=0;
  5. private Test(){
  6. num1++;
  7. num2++;
  8. }
  9. public static Test getInstance(){
  10. return test;
  11. }
  12. public static void main(String[] args) {
  13. Test test = Test.getInstance();
  14. System.out.println(test.num1);
  15. System.out.println(test.num2);
  16. }
  17. }


这道题目咋看很简单,就是考察java初始化的顺序,但是很容易做错(我就做错了),结果应该是1、0

按照java初始化的顺序:首先静态初始化,然后定义初始化,然后是构造函数初始化,很简单吗,于是乎没张脑子般就写出了结果:1、1

分解一下这段代码执行的过程:
java 代码
  1. Test test = Test.getInstance();

java虚拟机看到需要用到Test了,于是开始满世界的找寻Test,黄天不负有心人,它终于找到了Test.class,然后开始加载......

然后要对Test打扮一番,好让她出去见人啊,于是开始初始化:

初始化顺序的总规则:

首先静态初始化,然后定义初始化,然后是构造函数初始化;

静态分为两种:
1、静态的成员变量
2、静态代码块 static{}

一般来说首先初始化静态类变量,然后初始化静态代码块。

如果某个类有父类:
那么初始化顺序是:
1、对父类进行静态初始化(初始化父类的静态成员变量或者静态代码块)
2、对子类进行静态初始化(初始化父类的静态成员变量或者静态代码块)
3、对父类进行定义初始化(初始化父类的成员变量)
4、对父类进行构造函数初始化
5、对子类进行定义初始化(初始化子类的成员变量)
6、对子类进行构造函数初始化

注意:jvm只在首次使用某个类的时候对其类变量进行一次初始化!

回到正题,jvm初始化Test的时候也是按照上面的顺序进行的:
1、ClassLoader加载Test.class,我自己理解这个时候Test.class中的三个静态变量已经被装载进内存,并分别赋予了初始值
null,0,0 (不知道这样理解对不对)
2、按照顺序对Test.class进行静态初始化,注意这里只对所有显示初始化的变量进行初始化!没有显示初始化的变量不再进行 初始化!比如num1没有被显示的初始化,不再参与这个初始化过程(不知道这个理解对不对)
所以首先初始化的是:
private static Test test = new Test();
3、初始化test变量的时候调用了Test类的构造函数,在Test构造函数中对两外两个静态变量num1、num2进行了++操作,这个 时候num1和num2的初始值应该都是默认值0!
这个时候num1和num2的值都是1
4、完成了对静态变量test的初始化后开始初始化num2,这个时候num1=1,但是num2=0!!

如果把代码改为:
java 代码
  1. public class Test {
  2. public static int num1;
  3. public static int num2 = 0;
  4. private static Test test = new Test();
  5. private Test() {
  6. num1++;
  7. num2++;
  8. }
  9. public static Test getInstance() {
  10. return test;
  11. }
  12. public static void main(String[] args) {
  13. Test test = Test.getInstance();
  14. System.out.println(test.num1);
  15. System.out.println(test.num2);
  16. }
  17. }

结果就是1、1了!
因为按照顺序,先初始化了num2,后初始化test!

1、装载Test.class
2、给类变量分配空间,赋予初始值
test = null (指向null)
num1 = 0
num2 = 0
3、开始初始化显示赋值的变量(test、num2)
1)初始化num2,将num2赋值为0
2)初始化test
(1)对类Test进行初始化,因为类变量只初始化一次,所以这里不再需要对test进行初始化了
(2)Test没有实例变量,所以不需要初始化实例变量
(3)对Test进行构造函数初始化,对num1和num2进行++操作
(4)初始化完毕,在堆区开辟内存空间存储Test的实例。
3)这个时候num1 = 1,num2 = 1

把代码改为:

java 代码
  1. public class Test {
  2. private static Test test = new Test();
  3. public int num1;
  4. public int num2 = 0;
  5. private Test() {
  6. num1++;
  7. num2++;
  8. }
  9. public static Test getInstance() {
  10. return test;
  11. }
  12. public static void main(String[] args) {
  13. Test test = Test.getInstance();
  14. System.out.println(test.num1);
  15. System.out.println(test.num2);
  16. }
  17. }

结果也是1、1

1、装载Test.class
2、给类变量分配空间,赋予初始值
test = null (指向null)
num1 = 0
num2 = 0
3、开始初始化显示赋值的变量(这里是test,因为num1和num2都不是静态的)
1)初始化test
(1)按照初始化顺序,构造Test的时候首先初始化类变量,因为类变量只初始化一次,
所以这里不再需要对test进行初始化了
(2)进行定义初始化,初始化num1 和 num2
(3)对Test进行构造函数初始化,对num1和num2进行++操作
(4)初始化完毕,在堆区开辟内存空间存储Test的实例。
3)这个时候num1 = 1,num2 = 1

参考一篇不错的文章:
http://www.ibm.com/developerworks/cn/java/j-lo-clobj-init/
基于深度学习方法(7种)的高光谱与多光谱图像融合(附代码+3个数据集获取) 其他不懂的可以把代码发给AI哦,让它给你解读。 阅读详情

相关推荐

告别卡顿!用AVPro Video在Unity 2022.3里流畅播放4K视频的保姆级配置流程

本文详细介绍了如何在Unity 2022.3中使用AVPro Video插件实现4K视频的流畅播放。从环境配置、插件选型到核心性能优化技巧,包括解码器设置、内存管理策略和多平台适配方案,帮助开发者彻底解决卡顿问题,提升视频播放体验。

weixin_32349561的博客 318

jQuery基础总结

1 :eq()和nth-child() 看下面代码: <SCRIPT LANGUAGE="JavaScript"> $(function(){ $("#selected-plays > li:eq(1)").addClass("a"); //等价于 $("#selected-plays ...

weixin_34405354的博客 140

保姆级教程:手把手教你用Python+Zemax仿真一个简易的Nd:YAG固体激光器谐振腔

本文提供了一份详细的Python与Zemax结合的Nd:YAG固体激光器谐振腔仿真教程。从基础理论到实战操作,涵盖晶体参数化、谐振腔设计、泵浦建模、动态仿真及热效应补偿等关键步骤,适合光学专业学生和工程师快速掌握激光器仿真技术。

weixin_30500473的博客 744

一道面试题 java_关于Java基础的一道面试题目

指出下面代码的结果是什么:public class Test{private static Test test = new Test();public static int num1;public static int num2=0;private Test(){num1++;num2++;}public static Test getInstance(){return test;}public ...

weixin_34902131的博客 155

Android Studio安装常见问题详解——Android Emulator Hypervisor Driver for AMD Processors installation failed.

目录一、问题描述二、解决方案2.1 开启CPU虚拟化2.2 禁用Hyper-V2.3 使用管理员命令行在驱动程序包中执行“silent_install.bat” 一、问题描述 新买的AMD轻薄本,在安装Android Studio时遇到问题: Android Emulator Hypervisor Driver for AMD Processors installation failed. 笔记本配置为: 二、解决方案 2.1 开启CPU虚拟化 设置虚拟化的步骤这里不进行详细介绍了。如果需要,可以自行百

Wendy的博客 4万+

ElementUI时间选择器(el-date-picker)输入格式的智能转换与动态适配

本文深入探讨了ElementUI时间选择器(el-date-picker)在处理用户自由格式输入时的痛点,并提出了基于Vue自定义指令的智能转换解决方案。该方案通过核心解析函数自动识别如“20231225”等连续数字输入,将其动态转换为标准时间格式,并确保与表单验证兼容,有效提升了后台管理系统的输入效率和用户体验。

weixin_29016833的博客 294

private static int num=0;

class psDemo { private static int num=0; public static void main(String[] args) { psDemo obj1=new psDemo(); obj1.num++; psDemo obj2=new psDemo(); obj2.num++; psDemo.num++; System.out.printl

autumn20080101的专栏 1600

【异常】Claude Code 在 Windows CMD 中出现重影现象的排查与解决

Windows CMD运行Claude Code时出现文字重影、乱码等问题,原因是传统CMD对现代ANSI终端控制序列支持不足。解决方案包括:1)推荐安装Windows Terminal(完全支持ANSI标准);2)使用PowerShell 7;3)优化CMD设置(启用虚拟终端、UTF-8编码);4)关闭Claude Code视觉特效。建议优先使用Windows Terminal以获得最佳体验,这是最彻底的解决方案。其他方案仅能部分改善或缓解问题。

奶爸的编程之路,也就一周冷个三天 1961

一些基础的java问题及一道简单的java题和我的回答

什么是变量? 值可以改变的量 如何声明变量、给变量赋值和使用变量? String a="变量" Java中常用的数据类型有哪些? int char double float String boolean 算术运算符中“/”和“%”的区别是什么? /是求商,%是求余数 发生自动类型转换的条件是什么? 两种类型兼容 例如:int 和 double 兼容 目标类型大于源类型

java人生 1568

【软考中级】多媒体应用设计师复习笔记第十章【free】

第10章法律法规与标准规范 行业标准 缩写的大写拼音 地方标准 DB加生代码 企业标准Q加斜线企业代号国际标准是国际标准化组织ISO和国际电工委员会IEC制定的标准 国家标准是由国务院标准化行政主管部门制定,全国范围内使用 ?强制性国家标准的代号为GB,推荐性国家标准的代号为GB/T。 ?软件开发规范GB8566-88属于强制性国家标准 在这里插入图片描述 行业标准代号由大写汉语拼音字母组成,加上斜线和T,组成推荐性行业标准,如XX/T。已经发布的行业代号有QJ(航天),SJ(电子

weixin_47120900的博客 641

倍福控制第三方伺服走CSV模式--以汇川伺服为例

在使用TwinCAT软件控制标准CiA402协议的EtherCAT伺服时使用TwinCAT软件NC自带的运动控制指令控制伺服,此时伺服驱动器一般工作在CSP/CSV/CST模式。最常见伺服驱动器工作在CSP模式,轨迹规划运行在TwinCAT软件,位置环速度环电流环运行在伺服驱动器中。该模式下速度波动较大,需要极度平稳的速度需要采用CSV模式。本文讲述的是伺服驱动器工作在CSV模式,此时轨迹规划和位置环均运行在TwinCAT软件,速度环电流环运行在伺服驱动器中。为了简化文字描述,本文采用图文结合的方式介绍伺服

weixin_41883890的博客 4848

2013-11-05 实验之密码发生器(正常逻辑题)

题目:在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全;如果设置不好记的密码,又担心自己也会忘记;如果写在纸上,担心纸张被别人发现或弄丢了...     这个程序的任务就是把一串拼音字母转换为6位数字(密码)。我们可以使用任何好记的拼音串(比如名字,王喜明,就写:wangximing)作为输入,程序输出6位数字。     变换的过程如下:

博客已搬家 862

ZYNQ通过AXI DMA实现PL发送连续大量数据到PS DDR

方案二是在PS端的MPU配置中,将DMA缓冲区所在的内存区域标记为“不缓存”(Device或Strongly Ordered类型),但这样CPU访问这些内存区的速度会大幅降低,需要根据实时性和数据正确性的需求做权衡。更妙的是,描述符链表可以做成一个环状队列,放在DDR里让DMA循环取走,从而实现持续不断的“流式”传输。用FPGA实现FFT硬件加速的系统中也是如此:PS向PL提交待处理的FFT数据,PL硬件加速计算后,DMA把结果写回DDR,全程CPU几乎只做配置调度,大量数据吞吐留给了硬件通道。

QQ_778132974的博客 175

java基础题目

java基础题目 题目: 现有如下文本:“Java语言是面向对象的,Java语言是健壮的,Java语言是安全的,Java是高性能的,Java语言是跨平台的”。请编写程序,统计该文本中"Java"一词出现的次数。 想法: 从左至右依次查找,将已查找的部分截取掉。 方法: 查找参数字符串str在调用方法的字符串中第一次出现的索引,如果不存在,返回-1 public int indexOf(String...

weixin_44705447的博客 733

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

问一道Java的泛型题目

问一道Java的泛型题目 下面的代码定义了一个媒体(Media)接口及其三个子接口:图书(Book),视频(Video)和报纸(Newspaper),library类是一个非泛型类,请用泛型重新设计改类 import java.util.List; import java.util.ArrayList; interface Media{}; interface Book extends Media...

weixin_42773709的博客 1619

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java - 一道关于Arrays.asList的题目

Arrays.asList用来将数组转化为ArrayList,对于这个API有一些我们需要了解的知识点。 传入参数为基础数据类型的数组 public class Test { public static void main(final String[] args) { final int[] test = new int[]{1,2,3,4}; final...

不积跬步,无以至千里 466

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

关于Java基础的一道题目

下面代码的结果是什么:java 代码 public class Test { private static Test test = new Test(); public static int num1; public static int num2=0; private Test(){ num1++; num2++; } public s...

程禹皓的专栏 146

(Java)小组练习题目:排他平方数!一道有点意思的算法题

题目:排他平方数 题意: 小明正看着 203879 这个数字发呆。 原来,203879 * 203879 = 41566646641 这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的, 并且它平方后的所有数位上都不出现组成它自身的数字。 具有这样特点的6位数还有一个,请你找出它! 再归纳一下筛选要求: 6位正整数 每个数位上的数字不同 其平方数的每个数位不含原数字的任何组成数位 代码如下: public static boolean Compare(int num

Charlie 487

Java基础题目

Java 基础部分 1. JAVA 的基本数据类型有哪些 ? String 是不是基本数据类型 ? Java 有 8 种基本数据类型: byte int short long double float Boolean char byte int short long 都属于整数类型. Double float 属于浮点类型. Boolean 为布尔类型 Char 为字符型 Str...

viewsky11的专栏 1431

java 矩阵题目_java练习本(原每日一练)(20190506)

名人名言昨日翻译“I never knew how to worship until I knew how to love.”——Henry Ward Beecher“在我知道如何去爱之前,我从不知道如何去崇拜。”——亨利·沃德·比彻今日名言“Every great dream begins with a dreamer. Always remember, you have within...

weixin_39517289的博客 120

一道Java面试题目——随想+心得

原题目:Java的一道面试题----静态变量初始化过程 题目如下: public class Test{ private static Test tester = new Test(); //step 1 private static int count1; //step 2 ...

difu7962的博客 202

Java入门典型题目解析

本文介绍了8个Java入门编程题目及实现代码,包括经典的Hello World程序、计算两数之和、判断素数、九九乘法表、数组排序、字符串反转、斐波那契数列等基础练习。每个题目都提供了完整的代码示例和详细解析,帮助初学者掌握Java基本语法,如变量声明、循环控制、数组操作和字符串处理等核心概念。这些典型题目适合Java新手巩固基础编程能力,为后续开发打下坚实基础。文章最后还附有参考文献和互动建议。

xuanxuan1235的博客 1172

Java基础之if语句面试题目

package test; public class Test { public static void main(String[] args) { /** * 下面的输出语句可以输出吗? * * 可以,因为if(true) System.out.println("yes"); 其实是一个语句, 而 if后面的紧跟的那一个语句是可以省略括号的。 */ if(2==2) if(true)

独狼的博客 3333

《Java核心技术 卷1 基础知识 原书第10版》

/*免责声明:全部内容都属于是段友分享,我只是属于整理。**/ /*写在前边,个人觉得****弄一个积分下载,就是在自掘坟墓。表面上看起来是可以为个人赚积分,实际砍掉分享交流的一个途径。对我就是没有积分,我就是这么理直气壮。所以每次需要东西的时候,网上一艘,全都是积分下载,虽然有的只是1分,但是不好意思我真的没有,我觉得不想分享别分享啊。到了这里,我把我有的就分享出来,我在博客上专门...

Angus 2万+

Java - 一道关于整型和字符类型相加的题目

题目 public class Test { public static void main(final String[] args) { final int a = 10; final int b = 20; System.out.println(a + '+' + b + '=' + (a + b)); } } 乍一看,可能有...

不积跬步,无以至千里 2026
上一篇: 互联网靠什么赚钱呢?
下一篇: 今天才知道java中的interface是支持多继承的
hcom
博客等级 码龄22年 14粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值