Java tips

// 程序1
class Singleton {
private static Singleton obj = new Singleton();
public static int counter1;
public static int counter2 = 0;
private Singleton() {
counter1++;
counter2++;
}
public static Singleton getInstance() {
return obj;
}
}

// 程序2
public class MyMain {
public static void main(String[] args) {
Singleton obj = Singleton.getInstance();
System.out.println("obj.counter1=="+obj.counter1);
System.out.println("obj.counter2=="+obj.counter2);
}
}

执行结果是:
obj.counter1==1
obj.counter2==0

你有没有被此结果吓一跳?乍看程序代码,你很可能会认为counter1和counter2的值一定会相等,但执行结果显然不是如此。其实,程序1被编译后的程序应该等同于下面的程序3:

// 程序3
class Singleton {
private static Singleton obj;
public static int counter1;
public static int counter2;
static { // 这就是class constructor
// 在进入此class constructor之前,class已经被JVM
// 配置好内存,所有的static field都会被先设定为0,
// 所以此时counter1和counter2都已经是0,且singleton为null
obj = new Singleton(); // 问题皆由此行程序产生
// counter1不会在此被设定为0
counter2 = 0; // counter2再被设定一次0(其实是多此一举)
}
private Singleton() { // 这是instance constructor
counter1++;
counter2++;
}
public static Singleton getInstance() {
return obj;
}
}

这是因为:当class具有static field,且直接在宣告处透过「=...」的方式设定其值时,编译器会自动将这些叙述依序搬到class constructor内。同样地,当class具有instance field,且直接在宣告处透过「=...」的方式设定其值时,编译器会自动将这些叙述依序搬到instance constructor内。

此程序在class constructor内,还未将static field初始化时(这时候,counter1和counter2都是0),就呼叫instance constructor,而instance constructor竟然还会去更动static field的值,使得counter1和counter2都变成1。然后instance constructor执行完,回到class constructor,再把counter2的值设为0(但是
counter1维持不变)。最后的结果:counter1等于1,counter2等于0。

欲改正程序1,方法有三:

-方法一:将singleton field的宣告调到counter1与counter2 field之后。
这是最好的作法。
-方法二:将counter2=0的宣告中,「=0」的部分删除。这种作法只有在希望
-方法三:将初始化的动作搬到class constructors内,自行撰写,而不依赖
编译器产生。这是最保险的作法。
Pure Persuit算法基础 Pure Persuit算法本身的原理不难理解,它主要基于几何原理进行的设备控制,本身不考虑太多的运动学约束。同时机器人的路径跟踪效果应该会比较依赖于预瞄点。对于曲线部分而言,如果曲率很小而预瞄点很远的话,对于曲线的跟随性应该会很差。对于直线而言,如果设备在开始时与轨迹有横向偏差,则在运动过程中机器人会逐渐收敛到曲线,但是收敛速度取决于预瞄点距离。 阅读详情

相关推荐

ArcGISPro小白必看:5分钟搞定3D地形图制作(附免费数据源)

本文为ArcGISPro初学者提供5步制作专业3D地形图的完整指南,涵盖免费数据获取、项目初始化、数据预处理、3D场景构建和成果输出等关键步骤。特别推荐使用NASA的SRTM高程数据和吉林一号卫星影像,帮助用户快速掌握3D地形图制作技巧,适用于教学演示和科研分析。

weixin_28314575的博客 238

Java技巧宝典:基于hellokaton/java-tips的探索之旅

Java技巧宝典:基于hellokaton/java-tips的探索之旅 项目介绍 Java Tips 是一个由 hellokaton 维护的开源项目,旨在汇集Java编程中的实用技巧和最佳实践。这个仓库对于任何层次的Java开发者都非常宝贵,从基础的语法糖到进阶的设计模式,它都力求通过简洁明了的例子让你的编码技能更上一层楼。通过深入浅出的示例,该项目帮助开发者掌握提升效率的秘诀,无论是日常开发还...

gitblog_00299的博客 397

Jaspersoft Studio安装与配置全攻略:从下载到首个报表生成

本文提供Jaspersoft Studio从下载、安装到创建首个报表的完整实战指南。详细介绍了如何获取安装包、配置工作空间,并通过可视化设计器创建报表模板、添加参数与字段,最终实现数据预览与PDF导出。帮助Java开发者快速掌握这一强大的开源报表工具,提升报表开发效率。

weixin_28826521的博客 702

Java Tips 项目教程

Java Tips 项目教程 1. 项目的目录结构及介绍 java-tips/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ ├── com/ │ │ │ │ ├── example/ │ │ │ │ │ ├── tips/ │ │ │ │ │ │ ├── Tip1.java │...

gitblog_00847的博客 392

OK3588-C开发板Forlinx Desktop系统烧录与多媒体功能实战

本文详细介绍了OK3588-C开发板Forlinx Desktop系统的烧录步骤与多媒体功能实战。从硬件准备到软件工具配置,逐步解析RKDevTool烧录技巧,并深入测试摄像头、视频编解码及音频功能,帮助开发者快速掌握RK3588芯片的强大性能与Ubuntu系统的优化应用。

weixin_29190169的博客 417

5分钟搞定PaddleOCR PP-OCRv5环境搭建:从安装到第一个识别Demo

本文提供了一份详细的PaddleOCR PP-OCRv5环境搭建与快速入门指南。通过清晰的步骤,指导读者在5分钟内完成从创建Python虚拟环境、安装PaddlePaddle框架和PaddleOCR库,到编写并运行第一个OCR识别Demo的全过程,帮助开发者快速体验最新的PP-OCRv5模型的文字识别能力。

sprite的博客 1266

Java练习:tips.Print

在学习Java时和《编程导论(Java)》中,大量使用了重载的System.out.println()等类似的输出语句。特别是书籍中,一行语句中包括System.out.println会显得太长,超过一行代码40个字符的限制,因而请静态引入tips.Print并使用相应方法代替它们。通常以 p替代System.out.print。pln替代System.out.prin...

aoe41606的博客 254

VASP计算层错能(SFE)全攻略2

本文介绍了使用VASP计算纯镍(Ni)层错能(SFE)的具体步骤。首先构建Ni的FCC单胞并扩展为超胞,通过修改原子位置引入堆垛层错;随后分别计算完美晶体和含层错结构的能量;最后通过能量差与层错面积之比求得SFE值。计算需注意k点网格、截断能和超胞尺寸的收敛性测试,并推荐使用PAW赝势和ASE等工具辅助结构构建。

weixin_50519490的博客 1986

java tips_Java编程Tips

最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了。下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方。1. 尽量在合适的场合使用单例使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:控制资源的...

weixin_39718173的博客 140

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》标准解读

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》针对智能网联汽车的自动驾驶数据记录系统进行了全面规范。标准要求我们记录车辆在自动驾驶模式下的所有关键操作数据,如:1. 车辆状态数据,如速度、加速度、转向角度、制动状态等;2. 环境感知数据,如周围物体的位置、速度、类型等;3. 驾驶决策数据,如路径规划、避障决策、紧急制动指令等;4. 系统状态数据,如软件版本、硬件状态、系统警告信息等。在数据存储方面,标准强调了数据的安全性和可靠性。

daopuyun的博客 2666

Camera metadata

Camera metadata

weixin_42136255的博客 2527

java tips_Java tips

●字符串类型String转换成整数int1). int i = Integer.parseInt([String]); 或i = Integer.parseInt([String],[int radix]);2). int i = Integer.valueOf(my_str).intValue();注: 字符串转成 Double, Float, Long 的方法大同小异.●如何将整数 int 转...

weixin_32458131的博客 186

使用 SAP 自家的 AI 工具 Joule 辅助 SAP Fiori 应用开发

SAP Joule 不请自答,解释说标记了接口的 UI Component,具备进行异步内容创建的能力,比如其通过 rootView 分配的视图,在运行时可以异步创建。目前 SAP Business Application Studio 里的 SAP Joule 支持下面这八种上下文,绝大部分都和 SAP UI5 开发相关,剩下的则是代码仓库和 SAP 帮助文档的搜索。SAP Joule 回答的大意是:我只负责回答 SAP UI5 开发相关的问题,不要和我扯其他有的没的。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1093

java tips_Java Tips

1.Java会确保每个字符串常量只有一个,不会产生多个副本。意思就是只要字符串长得一样,那么所有的变量都引用一块内存,如:1234String s0 = “helloworld”String s1 = “helloworld”String s2 = “hello” + “world”s0=s1=s22. break不仅可以跳出本层循环,也可以跳出指定循环,通过java的标识符来实现,如:12345...

weixin_39727005的博客 185

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java tips_使用Java的一些tips

不断更新中...stream操作使用stream把List转换为ListList names = persons.stream().map(Person::getName).collect(Collectors.toList());使用stream 把list 转 mapMap result =choices.stream().collect(Collectors.toMap(Choice::ge...

weixin_30969479的博客 279

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java 编程tips

T1:变量定义放在哪里? 老版c语言变量定义必须放在一个方法的最前面。但是c99之后就没有这个限制了。而java没有限制,java核心技术这本书中推荐将定义放到第一次使用之前,不要过早定义。 但是这个毕竟是建议 变量全部在开头定义有人觉得看起来舒服,代码层次清晰。 变量放在第一次使用之前定义,有一个可能的好处就是可以避免系统为变量开辟空间的开销。 例如以下伪代码 Address a =

shengshiqing的专栏 680

温度PID控制PLC程序

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

Java Performance Tips

Every little things add up. The overall performance of an application depends on the individual performance of its components. Here we list some of the Java programming tips to help your application

LikeSetaria的专栏 673

java tips_java tips

getWriter() has already been called for this responsereason:getWriter和getOutputStream(chain.doFilter(request, response);) 二者只能选其一,调用了其中一个就不能调用另一个了3 ways to cut out a stringsplit(using RegEx, not KMP ...

weixin_39559559的博客 109

java 实现tips

读取resources 放在与java 目录平级的resources 下的资源,可以通过以下方法获取 String path = this.getClass().getClassLoader().getResource(name).getPath(); BufferedReader in = new BufferedReader(new FileReader(path)); String str; String content = ""; while ((str = in.readLine()) != nu

kevin_darkelf的专栏 193

Java Tips

1、对象本身已知的事物称为实例biangl

QC的博客 1225

Java小Tips

关于 “==”,equals,hashCode String、StringBuffer与StringBuilder的区别

旧城落叶的小笔记 8145

Java 编程中Tips积累

1、 remove与迭代同时进行出错 找到List中为“6.”的数并删除,如果使用 for循环进行边迭代边删除,会出错。改为迭代器,如下 List<String> subjects = ["6.023","6.02","6.9","8"]; Iterator<String> iter = subjects.iterator(); while(iter,hasNext()...

weixin_44357667的博客 196

学习Java的小tips

学习/Java好习惯 在各个行业中能做的比较优秀的人都有自己的好习惯,所以学习这事养成一个好的习惯真的太重要了,一个好的学习习惯可以让你超越绝大多数同行的人。就我自己的经历来看,最开始的时候这方面走了不少弯路,很多好习惯也都是后来慢慢自己悟到的,就觉得以前浪费了很多时间,所以为了避免大家走更多的弯路,把这些经验分享给你们。 选择一个适合自己的视频教学>>> java 新手入门视频教学 正确提问 这个问题几乎所有学习Java的人都存在,问问题的时候不会问,也会给被提问者制造很多.

m0_53877764的博客 184

Java Tips

 class A { private int i=1; public A() { int i=2; //构造函数里面的是局部变量,不会输出 } public String print(String a) { System.out.p

wjjdlove的专栏 864

Java学习小tips

1、static为什么一般与final一起用? static和final的意义是不同的, static修饰的时候代表对象是静态的,而final修饰的时候代表对象只能赋值一次, 他们连用的时候是因为定义的那个对象既要它是静态的,也要求它的值不能再被修改。 举例说明: static int a=1; static final b=1; 这里a和b的区别在于,a在程序里可以被重新赋值为2或3或等等的整数,而b在程序里不能被重新赋值,b永远都为1,也就是说b是一个常量。 final int c=1; static

m0_51412875的博客 199

java-tips

我真的佩服,英语为什么有这么准确的表达力 https://www.remwebdevelopment.com/blog/can-you-instantiate-an-interface-in-java-373.html java中可以实例化一个接口吗?答案是不可以的。 Can you instantiate an interface in Java? The answer is no, but y...

叶子常常随风而落,分享博主日常学习和使用的一些技术 377
上一篇: Java Connect Pool
下一篇: SQL Server Temp Table
chenaaron
博客等级 码龄23年 4粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值