第四章:初始化和清理
首先是构造函数,之前有学:构造函数的重载方法是通过参数而非返回类型进行区分的,当用户自定义了构造函数,系统不会再自动定义构造函数。此处对于this这个关键字有了一定的了解:this是对当前对象的引用,它就是个引用。它能用在某个对象的方法中,表示该对象,this在构造函数中使用相当于调用一个符合参数列表的构造函数staitc方法中不存在
this,所以它不能调用非静态的方法或者变量,因为没有对应的引用去指向这些方法和变量。
测试如下:
package com.cedric.thinkingInJava.test;
//?new 返回一个对象的引用,怎么看new的底层运行机制
class Chapter4 {
public Chapter4() {
this(5);
System.out.println("empty");
}
public Chapter4(int i) {
System.out.println(i);
}
int i = 0;
Chapter4
getThis() {
i++;
return this;
}
}
public class
Chapter4Test {
public static void main(String[] args) {
Chapter4
c1 = null;
c1
= new
Chapter4();
System.out.println(c1.getThis().i);
}
}
运行结果为:
5
empty
1
其次是清理,理论性的认识了java一直吹捧的垃圾回收功能。除了垃圾回收,另一个清理方式是“终结”操作(finalize())。终结操作存在的原因是:1)对象可能不被垃圾回收2)垃圾回收并不等于“析构”,即垃圾回收只有在JVM内存将要耗尽时才执行,如果需要进行对象的消除,必须自己动手执行清理工作。3)垃圾回收只与内存有关(java中存在一些并非属于java的代码,可能会用到C的malloc()等,所以finalize()不适合普通的清理)。这里主要是对垃圾回收做了一个了解:
首先明确:只有当JVM面临内存耗尽时才会去执行“垃圾回收”或者“终结”操作。
对象存在于内存中,要消除不用的对象就是对内存的一个操作。JVM中的堆像是一个传送带,每分配一个对象就向前移动一格,“对指针”每次只要指向未分配的区域就行,这样效率会极高。以上只是理想状态,因为要做到堆能够像传送带一样,把已分配的和未分配的完全整理好需要极大的内存页面调度。
为了解决以上问题,就引入了垃圾回收器,它能够在一面回收空间的同时一面使堆中的对象紧凑的排列。
垃圾回收器(GC):简单的理解是每个对象都被分配一个“引用计数”,当给对象添加一个引用时,对应的对象中的“引用计数”就加1,反之就减1,如果“引用计数”为0时,则认为对象不再被使用,将视为垃圾进行释放。这是一个简单的理解,但实际并不会运用该技术,因为当对象之间存在嵌套时,会出现对象不再使用,但是“引用计数”不为0的情况
Dog dog=new Dog()
Tail tail=new Tail();
dog.tail=tail;
Tail.dog=dog;
要消除dog必须先消除tail,但是要消除tail必须先消除dog。
实际并不会运用“引用计数”的方式,而是做以下操作:从堆栈中找到所有的引用,对于每一个引用,追踪它引用的对象,然后追踪这个对象的所有引用,如此反复,直到所有引用全部被访问为止,这就解决了上述交互引用的问题。
当GC找到对象,并确认它是“活”的,那么会用一种叫“停止-复制”的方法来处理对象:先暂停程序,然后将活的对象全部整齐的复制到另一个堆中,没有复制的就被视为垃圾,被复制的则整齐的排列在了一起。这种方法需要所有引用在复制时都需要进行修正,而且需要两个堆,所以效率会较低。当垃圾很少或者没有的时候,这种方式就不实用了,另一种名为“标记--清扫”的方法则会被使用。它的工作原理就是从堆栈中遍历所有的引用,对每个引用,如果存在活的对象就进行标记,最后没有被标记的就视为垃圾处理,这样会导致堆控件的不连续,但是在没有垃圾或者少量垃圾的前提下是一种高效的方式。两种方式会在JVM中“智能”的切换使用。
最后是初始化。对于以下这个类
class VariableInit{
int i=0;
static int j=0;
VariableInit(){
i=10;
j=20;
}
}
在首次使用该类的静态变量j或者创建该类时,java解释器会先找到VariableInit.class。然后载入VariableInit.class,此时,有关静态的初始化会被执行,且就在加载时执行一次。new VariableInit()这个操作会在堆上分配足够的存储空间,此时存储空间会被自动清零(相当于缺省值的初始化),再会执行所有变量的定义,最后执行构造函数。
所以以上类在创建对象时,首先对静态变量j初始化(如果之前没有调用过j的话),然后执行i的定义,最后执行构造函数。
测试:
System.out.println(VariableInit.j);
VariableInit variableInit=new VariableInit();
System.out.println(variableInit.j);
输出结果:
0
10 20
分享到:
相关推荐
初始化和清理是编程中至关重要的概念,特别是...总之,初始化和清理是Java编程中必不可少的环节,包括正确使用构造器初始化对象、理解对象创建过程、掌握垃圾回收机制及其原理,这些都对编写高效、稳定的代码至关重要。
Java初始化和清理是Java语言中非常重要的两个过程,它们确保了Java程序的正确运行和资源的有效管理。Java的初始化包括类的加载、连接和初始化三个过程,而清理则主要指垃圾回收机制。 首先,Java初始化的主要特性...
本文将深入探讨如何在WinForm应用中结合NUnit进行测试初始化和清理工作,以确保测试的准确性和可维护性。 首先,理解NUnit的基础概念至关重要。NUnit是一个开源的.NET测试框架,它提供了一套丰富的断言方法来验证...
初始化PCI设备的BAR寄存器和PCI桥的Base、Limit寄存器是为了确保PCI设备能够正确地使用PCI总线进行数据传输。具体步骤包括: 1. **确定地址空间**:系统软件使用DFS算法遍历PCI总线,确定每个PCI设备可用的地址空间...
5. **初始化**:执行静态初始化代码块,设置静态变量的最终值。 类加载器分为三种类型: - **引导类加载器**:加载JRE核心库,如`rt.jar`。 - **扩展类加载器**:加载JRE扩展目录下的类库。 - **应用程序类加载器**...
创建对象时,如果托管堆中有足够的空间,系统会将对象的内存分配在堆上,并调用构造函数初始化该对象。对象的内存分配是通过一个指针(NextObjPtr)来管理的,该指针标记了托管堆中下一个新对象应该放置的位置。创建...
fortran编写的logistic映射的混沌程序,用于一般智能优化算法的初始化种群。
这个阶段可以是并行的,也可以是并发的,取决于区域的类型和回收策略。 关于G1的参数设置,以下是一些重要的选项: - `-XX:+UseG1GC`:启用G1垃圾回收器。 - `-Xms` 和 `-Xmx`:分别设置JVM的初始堆大小和最大堆...
### SIM900A 初始化流程详解 #### 一、硬件初始化流程 在开始SIM900A模块的初始化过程之前,首先要确保硬件连接正确无误。...遵循这些步骤,可以有效地初始化和管理SIM900A模块,确保其稳定可靠地运行。
综合以上信息,我们可以了解到"VAX垃圾注册信息全自动清理器"是一个能自动扫描和修复注册表问题的实用工具,它可能包含一个试用期重置功能(Trial-Reset.exe),以及使用了微软的通用控件库(MSCOMCTL.OCX)来提供...
标题中的“PIC单片机初始化设置助手”是一个专门针对初学者设计的工具,旨在帮助他们更好地理解和操作PIC系列单片机的初始化设置。PIC单片机是由Microchip Technology公司生产的微控制器,广泛应用在各种电子设备中...
垃圾回收器的工作包括标记无用对象、整理内存和回收空间。现代垃圾回收器如G1、ZGC和Shenandoah通过并发和低停顿时间目标来提高性能。优化垃圾回收的目标是减少Stop-The-World事件,提高应用响应速度,同时确保内存...
例如,可能会有一个`gc_init()`函数用于初始化垃圾回收器,一个`gc_collect()`函数执行垃圾收集,以及一系列的`gc_malloc()`、`gc_free()`等函数用于内存的申请和释放。 `test.c`文件是用来测试迷你垃圾回收器功能...
例如,通过设置新生代和老年代的比例、设置初始堆大小和最大堆大小等,可以控制垃圾回收的频率和效果。 总的来说,理解Java的垃圾回收机制对于编写高效、稳定的Java应用程序至关重要。开发者应关注内存管理,避免...
2. 类加载机制解释了类的加载、链接和初始化过程,包括双亲委派模型和自定义类加载器的实现。 3. 垃圾回收算法介绍了标记清除、复制、标记整理等垃圾回收算法,并详细分析了CMS和G1垃圾收集器的工作原理。 4. JVM...
在Java虚拟机的配置方面,有许多参数可以用来调整垃圾回收的行为,例如 `-Xms` 和 `-Xmx` 分别设置JVM初始堆大小和最大堆大小,`-XX:NewRatio` 控制新生代和老年代的比例,`-XX:SurvivorRatio` 设置Eden区与Survivor...
AURIX TC27X系列启动和初始化,详细介绍了TC27X系列上电BMI配置,初始化步骤,TC27xC TriCore™ AURIX™ 微控器初始化过程, 包括以下步骤: ⇒ 初始化 CPU0 的 C 运行环境( Cstart 程序), AURIX 复位后, CPU0 ...
然而,为了确保IC卡在这些系统中的安全和顺利运行,往往需要进行一系列的初始化操作。因此,“捷顺富士IC卡解密软件初始化软件”应运而生,它为维护这些智能卡系统的安全与效率提供了一个专业的解决方案。 首先,...
Activiti 6 mysql5.7初始化数据库
7. **网络依赖**:初始化和升级过程中,稳定的网络连接至关重要。如果网络不稳定或中断,可能会导致升级失败,用户需要确保设备在整个过程中都能连上互联网。 8. **技术支持**:尽管有了这个初始化应用包,但若在...