`

第五章 初始化与清理

 
阅读更多
用构造器确保初始化

注意,由于构造器的名称必须与类名完全相同,所以“每个方法首字母小写”的编码风格并不适合于构造器。

区分重载方法

参数顺序不同也足以区分两个方法。不过一般情况下不要这么做。

设计基本类型的重载

如果传入方法内部的数据类型小于方法中声明的形式参数类型,实际数据类型就会被提升。Char类型略有不同,如果无法找到恰好接受char类型的参数,它就会把char提升到int类型。

如果方法接受较小的基本类型作为参数。如果传入的实际参数较大,就得通过类型转换来执行窄化转换。如果不这样做编译器就会报错。

在构造器中调用构造器

构造器Flower表明:尽管可以用this调用一个构造器,但却不能调用两个。此外将构造器调用置于最起始处,否则编译器会报错。
Flower(String s, int p) {
    This(p);
    //this();   这个不可以调用了,因为已经有一次了。
}


清理:终结处理和垃圾回收

Java允许在类中定义一个名为finalize()的方法。它的工作原理“假定”是这样的:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用finalize方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以要是你打算用finalize,就能在垃圾回收时刻做一些重要的清理工作。
对象可能不被垃圾回收
垃圾回收并不等于析构。
也许你会发现,只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放。程序退出了,资源自然也就还给了系统。

finalize的用途何在

垃圾回收只与内存有关
比如java调用了本地方法,一般这些方法都是C或者C++编的,当这些方法调用如,malloc的方法分配内存。此时我们需要在finalize()中用本地方法调用它。

你必须实施清理

无论是“垃圾回收”还是“终结”,都不保证一定会发生。如果java虚拟机并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。

终结条件
class Book {
protected void finalize() {
    if(checkout)
      System.out.println(“error”)
}
void checkIn() {
   checkout = false;
}
}

本例的终结条件是:所有的Book对象在被当做垃圾回收前都应该被签入。但在main方法中,由于程序员的错误,有一本书没有被签入。要是没有finalize来验证终结条件,将很难发现这种缺陷。

构造器初始化

无法阻止自动初始化的进行,它将在构造器被调用之前发生。
public class Counter {
    int i;
    Counter() {
        i = 8;
    }
}
那么i首先会被赋值为0,然后变成8。


初始化顺序

在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化。例如:
class Window {
Window(int marker) {
    System.out.println(“Window(”+marker+”)”);
}
}
class House {
Window w1 = new Window(1);
House() {
    print(“House”);
    w3 = new Window(33);
}
Window w2 = new Window(2);
Void f() {
    print(“f()”);
}
Window w3 = new Window(3);
}
public class Test() {
   public static void main(String[] args) {
       House h = new House();
       h.f();
}
}
Out put:
Window(1);
Window(2);
Window(3);
House()
Window(3);
f()

静态数据的初始化

初始化的顺序是先静态对象(如果它们尚未因前面的对象创建过程而被初始化),而后是非静态变量。从输出结果看,要执行这个静态方法,就必须加载这个W类,然后其静态域W1被初始化,这将导致它们对应的类也被初始化。

总结一下对象的创建过程,假如有个名为Doc的类:
1.即使没有显示第使用static关键字,构造器实际上也是静态方法。因此,当首次创建类型为Dog的对象时,或者Dog类的静态方法/静态域首次被访问时,java解释器必须查找类路径,以定位Dog.class文件。
2.然后载入Dog.class(后面会学到,这将创建一个class对象),有关静态初始化的所有动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。
3.当用new Dog()创建对象的时候,首先将在堆上为Dog对象分配足够的存储空间。
4.这块存储空间会被清零,这就自动地将Dog对象中的所有基本类型数据都设置成了默认值(对数字来说就是0,布尔型和字符型也相同),而引用则被设置成了null。
5.执行所有出现于字段定义出的初始化动作。
6.执行构造器。

可变参数列表
static void g(int... args) {
		System.out.println(args.getClass());
		System.out.println(args.length);
		for(int i: args) {
			System.out.println(i);
		}
}

传入参数的个数无所谓。同时有自动装箱等功能。

枚举类型

几个小例子:

创建一个enum
public enum Spiciness {
	NOT, MULD, MEDIUM, HOT
}


使用enum:
public class Test {
	public static void main(String[] args) {
		Spiceness hot = Spiceness.MEDIUM;
		System.out.println(hot);
	}
}

Enum还有一些方法,ordinal方法,用来表示某个特定enum常量的声明顺序。Static values方法,用来按照enum常量的声明顺序,产生由这些常量值构成的数组

for(Spiciness s : Spiciness.values()) {
			System.out.println(s + "ordinal" + s.ordinal());
}


分享到:
评论

相关推荐

    Java编程思想第05章初始化与清理.ppt

    《Java编程思想》第五章主要讨论的是对象的初始化与清理,包括构造器的使用、方法重载以及默认构造器的概念。下面将详细阐述这些知识点。 ### 一、构造器确保初始化 1. **为什么要引入构造器**:在Java中,构造器...

    C++编程思想--第4章 初始化与清除

    C++通过引入构造函数和析构函数来解决这个问题,以确保对象在创建和销毁时能够正确地进行初始化和清理。 构造函数是C++中一种特殊的成员函数,它的主要任务是在对象创建时执行初始化操作。构造函数的名称与类名相同...

    编程思想下篇

    第5章 初始化与清理 5.1 用构造器确保初始化 5.2 方法重载 5.2.1 区分重载方法 5.2.2 涉及基本类型的重载 5.2.3 以返回值区分重载方法 5.3 缺省构造器 5.4 this关键字 5.4.1 在构造器中调用构造器 5.4.2 static的...

    Thinking in java4(中文高清版)-java的'圣经'

    4.4 Foreach语法 4.5 return 4.6 break和 continue 4.7 臭名昭著的“goto” 4.8 switch 4.9 总结 第5章 初始化与清理 5.1 用构造器确保初始化 5.2 方法重载 5.2.1 区分重载方法 5.2.2 涉及基本类型的重载 5.2.3 以...

    java基础补足和thinking In Java学习.rar

    第五章 初始化与清理 5.1 用构造器确保初始化 1.构造器命名必须与类名相同 2.构造器也是方法,满足方法的各种特征,无参数的构造器称为默认构造器,默认构造方法或者无参构造器。在没有其他构造方法的时候可以...

    《Java编程思想》学习笔记1(操作符、控制语句、对象、初始化与清理).doc

    ### Java编程思想学习笔记知识点...以上是《Java编程思想》学习笔记中关于操作符、控制语句、对象、初始化与清理等关键知识点的总结。通过理解这些基础概念和技术细节,可以更好地掌握 Java 编程的核心原理和技术实践。

    Linux系统初始化相关脚本分析

    `rc.sysinit`是Linux系统初始化的核心脚本,通常位于/etc目录下,它是系统引导过程中的第一步。这个脚本主要负责进行一些系统级别的设置和初始化工作,例如: 1. **硬件检测**:对系统硬件进行检测,包括磁盘、内存...

    3DsMaxReset1.3初始化插件

    《3DsMaxReset1.3初始化插件:深入解析与应用》 3DsMax是一款广泛应用于游戏开发、影视特效、建筑可视化等领域的三维建模和动画软件。其强大的功能和丰富的自定义性使得用户能够根据自己的需求进行各种复杂的操作。...

    Swift 初始化语法糖,更简介的语法实现组件初始化.zip

    虽然不是初始化的一部分,但与初始化过程紧密相关。析构函数在对象即将被销毁时执行,提供了清理资源的机会。在Swift中,使用`deinit`关键字定义。 5. **类型别名(Type Aliases)** 通过类型别名,我们可以为...

    数据库初始化/清除/备份/恢复工具包

    本工具包专注于数据库的初始化、清除、备份与恢复功能,对于任何依赖于数据库的应用来说,这些都是核心的操作需求。以下是对这些关键知识点的详细阐述: 1. **数据库初始化**:数据库初始化是指在新安装或重新配置...

    DLL初始化.rar

    5. **易语言DLL初始化**:易语言是一种中文编程语言,它的DLL开发允许程序员用易语言编写函数库,供其他程序调用。在易语言中,创建DLL时,同样需要定义一个类似`DllMain`的入口点函数,来处理DLL的加载和卸载事件。...

    C++Primer第五章习题答案

    第五章主要涉及C++的基础语法和编程技巧,包括类的使用、对象的创建与初始化、成员函数、友元、构造函数与析构函数等核心主题。下面,我们将对这些习题答案中的知识点进行详细阐述。 1. **类与对象**:C++中,类是...

    易语言源码易语言DLL初始化源码.rar

    6. **注销函数**:与初始化相对应,DLL卸载时通常会调用一个注销函数。在易语言中,这个函数用于释放初始化时分配的资源,关闭打开的文件等,确保程序退出时不会留下任何残留。 7. **调用约定**:在易语言中,我们...

    Vxworks BSP文件对串口及时钟初始化流程

    `usrKernelInit()`配置Wind内核,`kernelInit()`初始化多任务环境,而`usrRoot()`则作为系统的第一个任务运行,负责初始化I/O系统,安装驱动,创建设备,以及初始化网络系统。 关于串口和时钟的初始化,具体流程...

    JBPM3.2 表初始化,流程发布第一课

    4. 数据清理与重建:在升级或调试过程中,可能需要清空已有数据并重新初始化。此时,应谨慎操作,确保不会丢失重要信息,或者在测试环境中进行此类操作。 二、流程发布 1. 设计流程模型:使用JBPMSuite提供的GPD...

    tcp\ip初始化

    TCP/IP初始化是一个重要的网络配置过程,它涉及到计算机与网络之间的通信协议设置。TCP/IP(Transmission Control Protocol/Internet Protocol)是互联网上最广泛使用的通信协议栈,由多个协议组成,包括TCP、IP以及...

    thinkinjava源码-Thinking-in-Java:ThinkingInJava源代码和练习题

    初始化与清理(18年6月) 第6章 访问权限控制(18年6月) 第7章 复用类(18年6月) 第8章 多态(18年7月) 第9章 接口(18年10月) 第10章 内部类 第11章 持有对象 第12章 通过异常处理错误 第13章 字符串 第14章 类型信息 第...

    凉山州烟叶收购一卡通卡片初始化工具

    卡片初始化是这个过程中的第一步,它确保每张卡片在使用前都处于未分配状态,且所有必要的数据区都被清零或填充了预设信息。 卡片初始化通常涉及以下几个步骤: 1. **身份登记**:首先,需要将烟农的个人信息录入...

    北大青鸟C#第六章 初始继承和多态参考答案.zip

    5. 构造函数(Constructor)和析构函数(Destructor):构造函数用于初始化类的新实例,而析构函数则在对象生命周期结束时自动调用,通常用于资源的清理。C#中的构造函数可以通过`this`关键字调用其他构造函数,而析...

Global site tag (gtag.js) - Google Analytics