第四章:初始化和清理
首先是构造函数,之前有学:构造函数的重载方法是通过参数而非返回类型进行区分的,当用户自定义了构造函数,系统不会再自动定义构造函数。此处对于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初始化的主要特性...
本文将深入探讨Java中的初始化过程,包括对象的构造器初始化以及类成员的初始化顺序,同时也会涉及Java的垃圾回收机制,即内存的自动清理。 首先,让我们详细了解一下Java中的构造器初始化。构造器是Java中用于初始...
在Java程序设计中,初始化和清理是至关重要的概念,它们涉及到对象的生命周期管理和资源的有效利用。...通过构造函数、函数重载、成员初始化和垃圾回收机制的合理运用,开发者能够构建出更稳定、健壮的软件系统。
在IT行业中,初始化和清理是程序开发中的关键环节,它们涉及到软件生命周期的开始和结束,确保系统的稳定性和资源的有效管理。本章“第五章 初始化与清理”可能详细探讨了这两个重要概念,特别是在软件工程和系统...
本文将深入探讨如何在WinForm应用中结合NUnit进行测试初始化和清理工作,以确保测试的准确性和可维护性。 首先,理解NUnit的基础概念至关重要。NUnit是一个开源的.NET测试框架,它提供了一套丰富的断言方法来验证...
初始化PCI设备的BAR寄存器和PCI桥的Base、Limit寄存器是为了确保PCI设备能够正确地使用PCI总线进行数据传输。具体步骤包括: 1. **确定地址空间**:系统软件使用DFS算法遍历PCI总线,确定每个PCI设备可用的地址空间...
5. PLC控制系统程序设计:系统程序设计采用模块化结构,由初始化程序、控制程序和故障报警程序组成。初始化程序负责端口和状态扫描,并根据检测结果决定后续操作;控制程序则根据垃圾存放情况调整装置状态,实现垃圾...
Java的垃圾回收(Garbage Collection, GC)是自动管理内存的一种机制,它负责识别并清理那些不再使用的对象,以释放内存资源。理解并掌握这一机制对于避免内存泄漏和提升系统性能至关重要。 首先,垃圾收集的定义是...
5. **初始化**:执行静态初始化代码块,设置静态变量的最终值。 类加载器分为三种类型: - **引导类加载器**:加载JRE核心库,如`rt.jar`。 - **扩展类加载器**:加载JRE扩展目录下的类库。 - **应用程序类加载器**...
创建对象时,如果托管堆中有足够的空间,系统会将对象的内存分配在堆上,并调用构造函数初始化该对象。对象的内存分配是通过一个指针(NextObjPtr)来管理的,该指针标记了托管堆中下一个新对象应该放置的位置。创建...
当设备初始化失败时,可能是因为系统缺乏有效的串行通信支持,而MsComm32控件能提供这个功能,使得软件能够正确识别和通信硬件。 安装MsComm32控件的过程通常包括以下步骤: 1. 下载MsComm32.ocx文件,这是控件的...
- **准备实模式下C语言环境**: 实现C语言环境的基本设置,如栈和堆的初始化。 - **实模式代码main函数**: - **复制初始化头变量**: 将初始化信息复制到适当的位置。 - **初始化堆**: 为动态内存分配准备空间。 -...
AutoGC是一个针对C++编程语言设计的简单垃圾回收器,主要特点是它采用了多线程技术以及资源获取即初始化(RAII)原则。垃圾回收(GC)通常在动态内存管理中用于自动追踪并释放不再使用的内存,以防止内存泄漏。在C++...
在实际开发中,应根据需要覆盖相应的CWinApp成员函数,以实现自定义的初始化和结束逻辑。同时,合理地利用MFC提供的机制,能够确保程序在生命周期中的各个阶段都能正确处理资源,避免内存泄漏和其他问题。
### SIM900A 初始化流程详解 #### 一、硬件初始化流程 在开始SIM900A模块的初始化过程之前,首先要确保硬件连接正确无误。...遵循这些步骤,可以有效地初始化和管理SIM900A模块,确保其稳定可靠地运行。
标题中的“PIC单片机初始化设置助手”是一个专门针对初学者设计的工具,旨在帮助他们更好地理解和操作PIC系列单片机的初始化设置。PIC单片机是由Microchip Technology公司生产的微控制器,广泛应用在各种电子设备中...
综合以上信息,我们可以了解到"VAX垃圾注册信息全自动清理器"是一个能自动扫描和修复注册表问题的实用工具,它可能包含一个试用期重置功能(Trial-Reset.exe),以及使用了微软的通用控件库(MSCOMCTL.OCX)来提供...
垃圾回收器的工作包括标记无用对象、整理内存和回收空间。现代垃圾回收器如G1、ZGC和Shenandoah通过并发和低停顿时间目标来提高性能。优化垃圾回收的目标是减少Stop-The-World事件,提高应用响应速度,同时确保内存...
【描述】"WYWZ_3.0 最好+最绝的系统垃圾清理"强调了这款软件在系统清理领域的优秀表现。它可能采用了高效算法,能快速扫描并清除系统中的临时文件、日志、缓存、无效注册表项等垃圾数据。通过这些操作,软件能显著...