Java程序员的日常—— 《编程思想》关于类的使用常识
Java虽然利用JVM,让程序员可以放心大胆的使用,可是仍然会出现内存泄露等问题。世上没有绝对的银弹,因此也不能完全把所有的任务都交给JVM,了解Java中的初始化与垃圾回收还是必不可少的知识。
关于构造器
在C中,如果要使用变量需要先申请内存。在Java中,如果你需要创建一个对象,也可以直接new出来,JVM会自动帮你管理。
默认的类,会自动有一个无参的构造方法,当然你也可以自己定义有参的构造方法。但是要注意,一旦自己定义了,就不再帮你自动创建无参的构造方法了。
一个类可以有多种构造方法,通过参数类型或者个数的不同,就可以实现。这就是方法的重载。甚至于参数的位置不同,都代表不同的构造方法,但是其实并没有什么意义。
不过,返回值并不能进行方法的重载!因为你编码的时候可能并不都是需要赋值给另一个对象,很有可能直接使用,比如:
class A{ public boolean isTrue(){return true;}}
A a = new A();
boolean result = a.isTrue();
//有时,你可能直接这样使用
a.isTrue()
这样编译器就无法分辨到底使用哪一个了!因此返回值是不能用来方法重载的。
另外,注意:所有的变量的初始化都会在构造器执行前进行!
static的用处
static用来声明静态方法或者静态变量,甚至是静态块。
1.如果修饰的是静态变量,那么无论这个类new了多少次,创建了多少对象,每个对象使用的都是同一个变量的引用,可以看做是类的共享变量。
2.如果修饰的是静态方法,那么你不需要创建对象,就可以直接通过类名来使用。
3.如果是静态块,那么当创建对象或者访问到静态区域的时候,就会执行一次这部分的内容,并且只会执行一次!
其实当我们创建类或者使用类的静态属性时,是这样一个步骤:
- 1 触发类的访问:可能是第一次构造类,也可能是访问了类的静态方法或者属性
- 2 加载类.class,执行静态部分
- 3 在堆上分配空间
- 4 存储空间清零(这就是为什么属性会有默认值的原因)
- 5 字段初始化
- 6 执行构造方法
关于垃圾回收
这个是老生常谈的话题了,但是还总是记不住,这里再次唠叨唠叨:
引用计数
最简单的垃圾回收方式,就是引用计数。每个对象都有一个计数器,每次引用对象,都会打一个标记;当引用null时,就会减一。这样,计数为0时,就进行垃圾回收。
缺点就是如果出现循环引用,就没办法进行清除了。
标记-清除
标记清楚,是对所有的对象进行遍历。当出现那些没有引用的对象,就进行标记。最后统一的把所有标记的对象,清除掉。
缺点,会出现大量的碎片化空间。
停止-复制
停止复制的原理,就是进行垃圾回收时,会停止应用程序的运行。把存货的对象拷贝到另一个区域,然后剩下的全部清除掉。
缺点,就是效率低。需要拷贝全部存活对象,还要维护两份区域。
目前使用的垃圾回收机制,基本上是上面的整合体。会首先进行标记清楚,然后碎片化太严重,就进行停止复制,整理地址空间。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?