Java编程思想,读书笔记三(第5章 初始化与清理)

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/u010882234/article/details/79167470

       第5章 初始化与清理

       随着计算机革命的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一,初始化和清理正是设计安全的两个问题。Java中用构造器保证初始化,并提供了“垃圾回收器”自动回收释放不需要的内存资源。

       构造器是一种特殊类型的方法,名称必须与类名相同。在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化。不接受任何参数的构造器称为默认构造器,如果类里面没有显示的构造器,则默认有一个无参构造器,即编译时会自动帮你创造一个默认构造器。

        方法重载,方法名相同而形参不同。类里面可以存在多个构造器,名称为类名,形参不同,在创建对象时可以根据需要调用不同的构造器。

        this关键字。this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。this的用法和其他对象的引用并无不同。this关键字对于将当前对象传递给其他方法也很有用。this可以使构造器做到,在构造器里调用构造器。通常写this的时候,都是指“这个对象”或“当前对象”,而且它本身表示对当前对象的引用。在构造器中,如果为this添加了参数列表,将产生对符合此参数列表的某个构造器的明确调用。但是,只能用this调用一个构造器,且必须置于最起始处,否则编译器将会报错。另外,用this.数据成员,也是表示数据成员的一种常用方式。

       static的含义。static,静态,static方法就是没有this的方法,可以直接通过类名引用。在static方法的内部不能调用非静态方法,反之可以。

       清理:终结处理和垃圾回收。垃圾回收只与内存有关,Java垃圾回收机制会自动回收释放内存。通过某种创建对象方式以外的方式为对象分配了存储空间,如调用“本地方法,C语言的malloc()”,从而造成内存泄漏,则需要在finalize()中用本地方法调用释放内存的方法。

      垃圾回收器如何工作?Java中所有对象(基本类型除外)都在堆上分配空间,Java从堆分配空间的速度,可以和其他语言从堆栈上分配空间的速度相媲美。垃圾回收器会定期进行完整的清理动作--大型对象仍然不会被复制(只是其代数增加),内含小型对象的那些块则被复制并整理。Java虚拟机会进行监视,如果对象都很稳定,垃圾回收器的效率降低的话,就切换到“标记-清扫”方式;同意,Java虚拟机会跟踪“标记-清扫”的效果,要是堆空间出现很多碎片,就会切换回“停止-复制”的形式。这就是“自适应”技术,“自适应的、分代的、停止-复制、标记-清扫”式垃圾回收机制。Java虚拟机中有许多附加技术用以提升速度,尤其是与加载器相关的,被称为“即时”(JIT)编译器的技术。代码每次被执行的时候都会做一些优化,执行次数越多速度就越快。

       成员初始化。Java尽量保证,所有变量在使用前都能得到恰当的初始化。对于方法的局部变量,Java以编译时错误的形式来贯彻这种保证。要是类的数据成员(即字段)是基本类型,都会有一个默认的初始值。如果在定义成员变量的时候对其赋值,则该类的所有对象都具有相同的初值。

       构造器初始化。在类的内部,定义变量的先后顺序决定了初始化的顺序,变量首先得到初始化,在任何方法(包括构造器)之前。在用new创建对象时,会先对类的成员变量(即字段)初始化,之后才会调用构造器创建对象。成员变量之间的初始化顺序,与变量定义的先后顺序一致。构造器内部的变量和方法,也是按顺序执行。

        静态初始化,只有在必要的时候才进行。对于static修饰的静态数据成员,只有在第一次被访问时才会初始化,之后不再初始化。并且,对于类的成员变量(字段),静态成员变量先于普通成员变量初始化,先静态对象后“非静态”对象。静态对象只有在Class对象首次加载的时候进行一次。对于static显示声明的代码块(形如static{}),称为静态初始化,在类初始化时,仅初始化一次。针对没有static修饰的代码块(形如{}),称为实例初始化,用来初始化每一个对象的非静态变量。它的初始化优先于构造器,保证无论调用哪个构造器某些操作都会发生,但每次调用都会执行一次。

        数组初始化。数组只是相同类型的、用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。编译器不允许指定数组的大小。所有数组都有一个固有成员,可以通过它获取数组内包含了多少个元素,但不能对其修改,即length。在Java中,数组访问时一旦超过length-1,就会在运行时出现错误,即数组下标越界异常。对于数组,初始化动作可以出现在代码的任何位置,但也可以使用一种特殊的初始化表达式,它必须在创建数组的地方出现。这种特殊的初始化是由一对花括号括起来的值组成的。在这种情况下,存储空间的分配(等价于使用new)将由编译器负责。另一种是直接用new在数组里创建元素。尽可能的在数组定义的同时进行初始化。即便使用new创建数组之后,它还只是一个引用数组,直到创建新的对象并赋值给引用,初始化进程才算结束。如果忘记了创建对象,并且试图使用数组中的空引用,就会在运行时产生异常(空指针异常)。可变参数列表,Object... args,有了可变参数,就可以不用显式的编写数组语法了,当你指定参数时,编译器实际上会为你去填充数组。可变参数列表使得重载过程变得复杂了,你应该总是只在重载方法的一个版本上使用可变参数列表,或者压根就不去用它。

       枚举类型。enum关键字,表示枚举,类似于class(类)、interface(接口),用enum定义枚举,并设置成员变量。枚举类型的实例是常量,因此按照命名惯例它们都用大写字母表示,如果一个名字中有多个单词,用下划线将它们隔开。为了使用枚举,需要创建一个该类型的引用,并将其赋值给某个实例。当你创建枚举时,编译器会自动添加一些有用的特性,如创建toString()方法、ordinal()方法(表示某个特定常量的声明顺序),以及static values()方法,用来按照enum常量的声明顺序,产生由这些常量构成的数组。enum有一个很实用的特性,可以在switch语句内使用。

      下一篇:Java编程思想,读书笔记四(第6章 访问权限控制) - CSDN博客  

猜你喜欢

转载自blog.csdn.net/u010882234/article/details/79167470
今日推荐