Thinking in Java第四章阅读小结

第四章 初始化与清理

4.1用构造器确保初始化:构造器是一种特殊类型的方法,没有返回值,这与返回值是空明显不同。

4.2方法重载:

      1.区分重载方法:每个重载方法都必须有一个独一无二的参数列表。可以是参数个数不同,参数类型不同,甚至可以是参数顺序不同。

       2.涉及基本类型的重载:基本类型能从一个“较小”的类型自动提升到一个“较大”的类型,此过程一旦牵涉到重载,可能会造成一些混淆。

           如果传给函数的基本类型小于参数类型,则数据类型自动提升,规则如下:byte->short->int->long->float->double           char->int

            如果传入的基本类型大于参数类型,则需要在括号里写上类型名称,做窄化转换。

        3.缺省构造器:如果你没有写,则编译器自动帮你创建一个,如果你写了,则编译器就不会帮你创建缺省的构造器了

        4.This关键字:假如希望在方法内部获得对当前对象的引用,由于这个引用是由编译器偷偷传入的,所以没有标识符可用,但是有个关键字this。this只能在方法内部使用,表示对“调用该方法的对象”的引用。注意在方法内部调用同类的另一个方法时,不必使用this,直接调用即可。当需要返回对当前对象的引用时,就常常return this

         在构造器中可以调用另外定义的构造器:使用this,并添加参数列表,产生对符合此参数列表的某个构造器的明确调用。this只能调用一个构造器,不能调用两个,而且必须将调用语句置于最起始处,否则编译出错。除构造器外,编译器禁止在其他任何方法中调用构造器。

        static的含义:属于类,不属于对象,没有this,在static方法内部不能调用非静态方法。static方法不是面向对象的,类似C语言中全局的意思,如果代码中出现大量的static,就该重新考虑自己的设计。

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

     1.finalize()的用途:对象可能不被垃圾回收,垃圾回收不等于析构,垃圾回收只与内存有关。不该将finalize作为通用的清理方法,它的真正用途是:在内存分配时采用了类似C语言中的做法,这种情况主要发生在使用“本地方法”的情况下,本地方法是一种在Java中调用非Java代码的方式。

         例如:在非Java代码中,也许会调用C的malloc()函数来分配存储空间,所以需要在finalize中用本地方法调用free()函数来释放。不要过多的使用finalize(),它无法预料,常常是危险的。

     2.你必须实施清理:如果希望进行除释放空间之外的清理工作,还是得明确调用某个恰当的Java方法,这就等同于使用析构,只是没有它方便。

        无论是垃圾回收还是finalize,都不敢保证一定会发生,如果JVM并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。

   3.终结条件:可以用finalize来验证终结条件是否正确。

      System.gc()用语强制执行终结动作。

   4.垃圾回收器如何工作:一般构造函数里只做基本的内存初始化,另外再写一个Open或Init函数来做内存以外其他东西的初始化,然后对应的来个close或cleanup之类的函数专门用来做文件句柄,网络端口这类东西的清除。

4.4成员初始化:

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

   2.明确进行的静态初始化

      Java允许将多个静态初始化动作组成一个特殊的静态块。实际上是一段跟在statica关键字后面的代码。与其他静态初始化动作一样,这段代码在首次生成这个类的一个对象时,或者首次访问属于这个类的静态成员时(即便从未生成过那个类的对象),仅仅被执行一次

   3.非静态实例初始化:类似静态块,只是少了static关键字,用来初始化每个对象的非静态变量。

 4.5 数组初始化:

       所有的数组都有一个length成员,用来表示该数组内包含了多少个元素,不能对其修改。

      (1)如果数组元素是基本类型:int[] a = new int[20]; 或者 int[] a = {1,2,3,4,5};

      (2)如果数组元素不是基本数据类型,那么必须使用new,创建的数组里的每个元素都是一个引用,即便使用new创建数组后,它还只是一个引用数组,并且直到通过创建新的Integer对象,并把对象赋值给引用,初始化才算结束。如下:Integer[] a = new Integer[20];a[i] = new Integer(rand.nextInt(400));如果忘记了创建对象,并且试图使用数组中的空引用,则在运行时会产生异常。

                 也可以使用花括号:Integer[] a = (new Integer(1),new Integer(2),);

                 或者:Integer[] a = new Integer[] {new Integer(1),new Integer(2),}

     (3)多维数组:一维的扩展。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值