初始化和清理是涉及安全的两个问题。本章简单的介绍“垃圾回收器”及初始化知识。

第五章  初始化与清理

目录:
5.1 用构造器确保初始化
5.2 方法重载
5.3 默认构造器
5.4 this关键字
5.5 清理:终结处理和垃圾回收
5.6 成员初始化
5.7 构造器初始化
5.8 数组初始化化
5.9 枚举类型
5.10 总结

5.2 方法重载

方法重载是指在一个类中定义多个同名的方法(注意与方法重写的区别),但要求每个方法具有不同的参数的类型或参数的个数。

区分方法重载: 参数表不同,包括参数的类型、个数或者顺序。根据返回值来区分有时候是行不通的,例如

void f() {}
int f() { return 1; }
// 在int x =f()中,确实可以区分重载方法,但是直接使用f()则不行

5.4 this关键字

this可以在方法内部获取当前对象的引用。
在方法内部调用同一个类的另一个方法,就不必使用this了,直接调用即可,如下:

public class JianCheng{
private int a;
private int b;
void love(int a,int b) {
this.a = a; //this关键字使用最多的地方
this.b = b;
}
void life() { love() } //可以写this.love(),但没必要,编译器自动帮你添加
}

当需要明确指出对当前对象的引用时,才需要使用this关键字。例如:

———————————————————

注意:this添加了参数列表,则表示对某个构造器的明确调用,但以下几点容易出错

  • 在构造器方法内调用this来表示构造器,有且只能调用一次this(参数),而且必须将this(参数)至于最起始处
  • 除了构造器外,编译器禁止其他任何方法中调用构造器

static与this的关系:

static方法内不能调用this的方法。在static方法的内部不能调用非静态方法,反之可以。
static方法可以访问其他static方法和static域。

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

Java有垃圾回收器负责回收无用的对象占据的内存资源。但也有特殊情况:假定你的对象(并非使用new)获得一块特殊的内存区域(在Android 使用混合开发会用到C或C++ 这时候有没经过new出的对象),垃圾回收器只会释放那些经过new分配的内存。为了应对,finalize()闪亮登场,我还没用过它- -!

finalize():一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

使用finalize()不一定会被调用,除非“垃圾回收”发生了。但程序没有濒临存储空间用完的那一刻,垃圾回收器也不会实现自动回收,因为垃圾回收本身也有开销。

finalize()方法的执行时机:

  • 所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候
  • 显式的去调用system.gc()
  • 程序退出时为每个对象调用一次finalize方法

上面三个方法,只是建议JVM执行而不一定是马上执行,况且不保证finalize()一定被调用,也就是说,finalize()的调用是不确定的。散了吧,一般不会用它的/(ㄒoㄒ)/~~

垃圾回收器如何工作:(建议尽量理解透彻)

垃圾回收器对于提高对象的创建速度,却具有明显的效果。听起来很奇怪——存储空间的释放竟然会影响存储空间的分配,但这确实是某些Java虚拟机的工作方式。
比如:C++中堆的内存分配类似于一个院子中给每个对象分配一块地基。而java中堆的内存分配更像是一个传送带,每分配一个新对象,它就向前移动一格。之所以可以这样实现,得益于垃圾回收器的存在。通过垃圾回收器对对象重新排列,实现了一种高速的、有无限空间可供分配的堆模型。

垃圾回收技术历史发展回顾:

引用计数法
引用技术是一种简单但速度很慢的垃圾回收技术
推中的每个对象都含有一个引用计数器,当有引用连接值对象时,对象的引用计数就会加一,当引用离开作用域或者为null时,引用计数就减一。这种方法有个缺陷,当对象存在循环引用时,对象应该被回收,但引用计数不为0。常用来说明垃圾收集的工作方式,尴尬的是从未被应用与任何一种Java虚拟机中。

自适应的垃圾回收技术(停止-复制)
将可用的内存按容量划分为大小相等的两块,每次只是用其中一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后把已使用过的内存空间一次清理完。内存分配以较大的“块”为单位。如果对象较大,它会占用单独的块。有了块之后,垃圾回收器在回收的时候就可以往废弃的块里拷贝对象了。每个块都有相应的代数来纪录它是否还存活(有新生代和老年代,代数为15时,块就会进入老年代,老年代的特征是“停止复制”执行的频率低,有兴趣的可以自己查相应资料,展开讲会很长文章)。通常块再某处被引用,其代数会增加。垃圾回收器会定期进行完整的整理动作——大型对象不会被复制(只是其代数会增加),小型对象的那些块则被复制并整理。这种动作不是在后台进行的,而是该回收动作发生的同时,程序将会被暂停。缺点

  • 浪费内存空间,两个堆,然后来回折腾,从而维护就比实际需要多一倍的空间。Java虚拟机解决此问题的处理方式是,按需从堆中分配几块较大的内存,复制动作发生在这些较大的内存之间。
  • 效率低,程序进入稳定状态之后,可能只会产生少量垃圾,甚至没有垃圾。但是复制式回收器仍然会将所有内存自一处复制到另一处,十分浪费呀。Java虚拟机解决方式(自适应技术),要是没有新垃圾产生,就会转换到另一种工作模式(标记-清除模式)

图如下

自适应的垃圾回收技术(标记-清扫)
县遍历所有的对象,每当找到一个存活的对象时就会给对象一个标记,这个过程不会回收任何 的对象,只有标记完了,清理动作才会开始。没有标记的对象将被释放,不会发生任何复制动作。所以剩下的堆空间是不连续的,垃圾回收器想得到连续空间的话,就得重新整理剩下的对象。缺点:回收了被标记的对象后,由于未经过整理,所以导致很多内存碎片。同样要是堆空间出现很多碎片(自适应技术),就会切换回“停止-复制”方式。图如下

加载器之“及时”编译器的技术:

装载某个类时,编译器会先找到其。class文件,然后将该类的字节码装入内存。此时有两种方法可选择:

  • 让即使编译器编译所有代码。这样做有两个缺陷:1、加载动作散落在整个程序生命周期内,累加起来花更多时间。2、增 加可执行代码的长度,这将导致页面调度,从而降低程序速度。
  • 惰性评估。即时编译器只在必要的时候才编译代码。这样不会被执行的代码也就不会被编译器所编译。JDK中的Java HotSpot技术就采用了类似方法,代码每次执行的时候都会做一些优化,所以执行的次数越多,它的速度就越快。

 5.7 构造器初始化

静态数据的初始化:

创建了多少对象都只占用单个存储区域。
static不能应用于局部变量(内部类,方法都属于局部),只能作用于域。
初始化完静态数据后再初始化非静态的。因为静态数据会在加载类时初始化,成员变量则会在创建类的对象时才初始化。

class Test {
static {
System.out.println("静态初始化");
} {
System.out.println("不属于静态初始化");
}
public Test() {
System.out.println("Test构造器");
}
public static void main(String[] args) {
Test t = new Test();
}
}

结果:

静态初始化  //静态初始化块是类相关的,系统将在类加载时执行静态初始化块,
//而不是在创建对象时才执行,所以最先执行,比非static快
不属于静态初始化
Test构造器

注意:

第一次访问静态数据的时候,静态初始化才会进行(静态初始化只有在必要时刻才会进行)。此后静态对象不会再次被初始化。

例如如下,将上面代码改为:

class Test {
static {
System.out.println("静态初始化");
} {
System.out.println("不属于静态初始化");
}
public Test() {
System.out.println("Test构造器");
}
public static void main(String[] args) { //第一次静态初始化
Test t = new Test(); //第二次静态初始化
Test t2 = new Test(); //用于测试静态初始化只有一次。其实有三次静态初始化,但只执行一次
}
}

输出如下(亲测):只出现一次静态初始化

总结:

本章知识难点为上面几个,其他的看看即可理解,静态初始化及垃圾回收器机制这块是比较难理解的,深入的话,可以查看其他资料。

转载注明:http://www.cnblogs.com/wujiancheng/

往期:Java编程思想总结笔记The first chapter

Java编程思想总结笔记Chapter 5的更多相关文章

  1. Java编程思想总结笔记Chapter 3

    本章需要总结的不多,但细节的东西需要注意,有些很容易遗忘. 第三章 目录: 3.1 更简单的打印语句 3.2 使用Java操作符 3.3 优先级 3.4 赋值 3.5 算数操作符 3.6 自动递增和递 ...

  2. Java编程思想总结笔记Chapter 2

    本章介绍Java程序的基本组成部分,体会到Java中几乎一切都是对象. 第二章   一切都是对象 目录: 2.1 用引用操纵对象 2.2 必须由你创建所有对象 2.3 永远不需要销毁对象 2.4 创建 ...

  3. Java编程思想总结笔记The first chapter

    总觉得书中太啰嗦,看完总结后方便日后回忆,本想偷懒网上找别人的总结,无奈找不到好的,只好自食其力,尽量总结得最好. 第一章  对象导论 看到对象导论觉得这本书 目录: 1.1 抽象过程1.2 每个对象 ...

  4. Java编程思想重点笔记(Java开发必看)

    Java编程思想重点笔记(Java开发必看)   Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...

  5. JAVA编程思想读书笔记(五)--多线程

    接上篇JAVA编程思想读书笔记(四)--对象的克隆 No1: daemon Thread(守护线程) 参考http://blog.csdn.net/pony_maggie/article/detail ...

  6. JAVA编程思想读书笔记(四)--对象的克隆

    接上篇JAVA编程思想读书笔记(三)--RTTI No1: 类的克隆 public class MyObject implements Cloneable { int i; public MyObje ...

  7. JAVA编程思想读书笔记(三)--RTTI

    接上篇JAVA编程思想读书笔记(二) 第十一章 运行期类型判定 No1: 对于作为程序一部分的每个类,它们都有一个Class对象.换言之,每次写一个新类时,同时也会创建一个Class对象(更恰当的说, ...

  8. JAVA编程思想读书笔记(二)--容器

    接上篇JAVA编程思想读书笔记(一) 第八章.对象的容纳 No1: java提供了四种类型的集合类:Vector(矢量).BitSet(位集).Stack(堆栈).Hashtable(散列表) No2 ...

  9. Java编程思想读书笔记之内部类

    现在是够懒得了,放假的时候就想把这篇笔记写出来,一直拖到现在,最近在读<Java编程思想>,我想会做不止这一篇笔记,因为之前面试的时候总会问道一些内部类的问题,那这本书的笔记就从内部类开始 ...

随机推荐

  1. UML之实现图

    我们前面学过的用例图.类图.活动图.顺序图和协作图都描写叙述了逻辑和设计方面的信息.那么如今我们来学习和实现有关的两个图:构件图和部署图. 实现图用来描写叙述实现方面的信息,它从系统的层次来描写叙述下 ...

  2. Bootstrap + Font Awesome

    将Font Awesome 集成到 Bootstrap 非常容易,还可以被单独使用. 最简单的 Bootstrap + Font Awesome 集成方式 使用这种方式将 Font Awesome 集 ...

  3. Poi 操作 Excel

    http://blog.csdn.net/chenglc1612/article/details/53413445   一. POI简介              Apache POI是Apache软 ...

  4. 【SDOI 2011】染色

    [题目链接] 点击打开链接 [算法] 树链剖分 [代码] 本题,笔者求最近公共祖先并没有用树链剖分“往上跳”的方式,而是用倍增法.笔者认为这样比较好写,代码可读性 比较高 此外,笔者的线段树并没有用懒 ...

  5. 【HDU 1561】 The More,The better

    [题目链接] 点击打开链接 [算法] 树形背包 注意是一棵森林 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN ...

  6. IJ:IJ来了2-调试开发环境

    ylbtech-IJ:IJ来了2 1.返回顶部 1. 2. 3. 4. 2. 配置SVN返回顶部 1.SVN安装时,要选上command line client tools 2. 3.   4. 3. ...

  7. gerrit调试

  8. VMware 12PRO安装Mac OS X 10.10.5

      插件安装 步骤一完成后,打开任务管理器,找到服务项,选择按名称排序,将框中四项全部停止运行. 然后打开下载的插件,解压unlocker206.zip文件,找到 unlocker206\win-in ...

  9. webpack -v显示的版本与package.json的devDependencies节点显示的webpack版本不一致的问题

    最近在学习webpack,遇到个奇葩的问题.就是安装完成webpack后,查看安装的webpack版本与package.json中显示的版本不一致, webpack是局部安装的,非全局安装, 命令1: ...

  10. 点击button传递消息,但是页面不跳转的解决方法

    最近在做一个物联网的项目时遇到的问题:界面上有很多控制开/关灯的button,通过点击button来控制各个灯的亮灭.我需要将获取的不同的点击事件消息,以Socket通信的方式发送给硬件端的服务监听程 ...