Thinking in java 学习笔记(2)

来源:互联网 发布:淘宝买csgo 编辑:程序博客网 时间:2024/05/25 19:57




  1.  为了能用简便,面向对象的语法来编写代码--即“发送消息给对象”,编译器做了一些幕后工作。它暗自把“所操作对象的引用”作为第一个参数传递给被调用函数。假设有下面的语句:Banana a=new Banana();a.f();通过编译器以后,你可以把它看成:Banana.f(a);这是内部的表示形式,实际代码中并不能这么写。假设你希望在方法的内部获得对当前对象的引用。由于这个引用是由编译器偷偷传人的,所以没有标识符可用。但是,可以使用关键字:this。This关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。
  2. 当需要返回对当前对象的引用时,可以使用return this;在构造器中调用别的构造器时也可以使用this,但意义发生了改变。在构造器中如果为this添加了参数列表:这将产生符合此参数列表的某个构造函数的明确调用,这样调用其它构造器就有了直接的途径,尤其是在你想复用某个构造器的代码时。需要注意的是,除构造器之外,编译器禁止在其他任何地方调用构造器。
  3. Static方法就是没有this的方法。在static方法的内部不能调用非静态方法,反过来倒是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。它很像C语言中的全局函数。Java中禁止使用全局函数,但你在类中置入static方法就可以访问其他static方法和static字段。
  4. Java允许在类中定义一个名为finalize()的方法,它的工作原理“假定”是这样的:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以要是你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。但是要注意一下三点:1)对象可能不被垃圾回收2)垃圾回收并不等于“析构”3)垃圾回收至于内存有关。无论是“垃圾回收”还是“终结”,都不保证一定会发生。如果Java虚拟机(JVM)并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。所以对于一些必须要做的清理工作必须显示的通过调用方法来实现。finalize()方法还有一个用途就是来发现一些潜藏的bug,虽然它不是总会被调用,可以用finalize()方法来验证对象在回收前是否满足终结条件,并功过System.gc()来强制进行终结动作,来加速调试过程(虽然反复运行程序也能达到这种效果)。
  5. 垃圾回收技术:自适应的,分代的,停止-复制,标记-清扫 虚拟机加速技术:即时(Just-In-Time, JIT)编译器技术和惰性评估(lazy evaluation)