【Thinking in Java, 4e】初始化与清理
【用构造器确保初始化】
【方法重载】
涉及基本类型的重载
1、如果传入的数据类型小于方法中声明的形式参数类型:实际数据类型会被提升。
2、如果传入的数据类型大于方法中声明的形式参数类型:编译器报错,应该通过类型转换来执行窄化转换。
【默认构造器】
【this关键字】
1、不要画蛇添足!!!在必要的地方写出this!!!(例如,在方法内部调用同一个类的另一个方法,就没必要写出this)遵循一种一致而直观的编程风格能节省时间和金钱。
2、this关键字的应用:a.将自身传递给外部方法。b.在构造器中调用另一个构造器(避免重写代码)c.避免参数名与数据成员重名(例如:this.name = name)
3、更全面地理解static的含义:static方法就是没有this的方法。
【清理:终结处理和垃圾回收】
要记住的三点:
1、对象可能不被垃圾回收!finalize()是随着垃圾回收事件的发生而被调用的,而垃圾回收事件在程序的整个执行过程中可能发生也可能不发生(具有不确定性),因此不该将其作为通用的清理方法。
2、垃圾回收并不等于“析构”。
3、垃圾回收只与内存有关。
finalize()的用途何在?
释放本地方法所分配的内存,本地方法是一种在Java中调用非Java代码的方法,例如调用c和c++的代码。
你必须实施清理
1、在c++中,如果对象是用new创建的,程序员一旦忘记调用delete,那么永远不会调用析构函数!
2、在Java中,所有对象都是由new创建的,由垃圾回收器追踪和清理,但是这种机制并不能完全替代析构函数。
3、垃圾回收本身也是有开销的,因此若不是内存耗尽,Jvm是不会浪费时间去执行垃圾回收恢复内存的!
终结条件:finalize中的条件语句
p89练习10:
public class Rubbish {
protected void finalize() {
System.out.println("我被回收啦!");
}
public static void main(String[] args) {
Rubbish a = new Rubbish();
// a所引用的对象最终可能没有被垃圾回收。
}
}
练习11:
public class Rubbish {
protected void finalize() {
System.out.println("我被回收啦!");
}
public static void main(String[] args) {
new Rubbish(); // 不理解的地方:如果这句是Rubbish a = new Rubbish();则最后不会输出“我被回收啦”。
System.gc();
}
}
垃圾回收机如何工作
【成员初始化】
强调一点:静态初始化动作只执行一次,在首次生成那个类的对象的时候(构造器实际也是静态的)或者首次访问那个类的静态成员的时候。
【数组初始化】
1、Java中的数组是允许直接拷贝的!a1 = a2;但实质上两个引用操控同一个对象。
2、Java中允许先创建数组引用int[] a1;之后再进行初始化。(这一点可以用来创建“全局”数组)
3、非基本类型的数组其实是引用数组,声明方式:ClassName[] a = new ClassName[10];
4、Java中的可变参数的函数:void f(ClassName... objects);实际上是用一个数组(这里的数组名叫objects)收集数量不确定的位置参数,可以通过foreach语句遍历打印objects数组中的元素。
【枚举类型】
1、枚举类型属于非常普遍的需求。
2、在Java中,你可以将enum当作其他任何类来处理。
3、在创建enum时,编译器会自动添加一些有用的特性:toString()、static value()、ordinal()等。
4、enum还有一个特性是可以在switch中使用。
4、具体实现方面,写了个简单的例子:
创建一个枚举类:
public enum Colors {
RED, YELLOW, BLUE, GREEN
}
enum的使用与特性:
public class TestColors {
public static void main(String[] args) {
Colors myColor = Colors.BLUE;
System.out.println(myColor); // toString()
// static values() & ordinal()
for (Colors c : Colors.values()) {
System.out.println(c + ", ordinal " + c.ordinal());
}
// switch
myColor = Colors.RED;
switch (myColor) {
case RED: System.out.println("My color is red!");
break;
default:
}
}
}
/* Output:
BLUE
RED, ordinal 0
YELLOW, ordinal 1
BLUE, ordinal 2
GREEN, ordinal 3
My color is red!
*/
【总结】
构造器、垃圾回收机。
【Thinking in Java, 4e】初始化与清理的更多相关文章
- Java的初始化与清理
大家都知道,Java是站在巨人的肩上成功的,它是在C&C++的基础上进一步的开发,投入面向对象开发的怀抱.Java吸取了很多以前的教训,加入自己很多独创的方式.在程序语言发展初期,许多C程序员 ...
- Chapter5_初始化与清理_用构造器初始化
接下来进入第五章,java中初始化和清理的问题,这是两个涉及安全的重要命题.初始化的功能主要是为库中的构件(或者说类中的域)初始化一些值,清理的功能主要是清除程序中不再被需要的元素,防止资源过分被垃圾 ...
- Java编程思想——初始化与清理
PS:最近一直忙于项目开发..所以一直没有写博客..趁着空闲期间来一发.. 学习内容: 1.初始化 2.清理 1.初始化 虽然自己的Java基础还是比较良好的..但是在解读编程思想的时候还是发现了 ...
- 图解 & 深入浅出Java初始化与清理:构造器必知必会
Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ...
- 浅谈Java中的初始化和清理
引言 这篇文章我们主要介绍Java初始化和清理的相关内容,这些内容虽然比较基础,但是还是在这边做一个简单的总结,方便以后查阅. 初始化过程 Java尽力保证:所有变量在使用之前都会得到恰当的初始化(对 ...
- Java编程思想学习(五)----第5章:初始化与清理
随着计算机革命的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一. C++引入了构造嚣(constructor)的概念,这是一个在创建对象时被自动调用的特殊方法.Java中也采用了构造器,并 ...
- Java 初始化和清理
初始化和清理是影响代码安全的两个重要因素. 一.初始化 1. 方法重载 构造器与类名相同,成为强制重载方法名的原因之一.重载规则:每个重载的方法必须拥有独一无二的参数类型列表.不能根据返回值来区分重载 ...
- 《Java编程思想》——初始化与清理(一)读书笔记
第一次写这个,这一章都用word写的,结果复制过来没图片....只能上传word文档了.以后改用markdown比较好 word文档地址:<Java编程思想>--初始化与清理(一)读书笔记
- java初始化与清理
初始化与清理 欢迎转载,转载烦请注明出处,谢谢. https://www.cnblogs.com/sx-wuyj/p/11177257.html 1.用构造器确保初始化 java中通过提供构造器,可以 ...
- Java编程思想之五初始化与清理
随着计算机革命的发展,"不安全"的编程方式已经逐渐称为编程代价高昂的主因之一. 初始化和清理正是涉及安全的两个问题. 5.1 用构造器确保初始化 通过提供构造器,类的设计者可确保每 ...
随机推荐
- poj_3250 单调栈
题目大意 N头牛排成一列,每头牛A都能看到它前面比它矮的牛i,若前面有一个比他高的牛X,则X之前的牛j,A都无法看到.给出N头牛的高度,求出这N头牛可以看到牛的数目的总数. 题目分析 画图之后,可以很 ...
- WEB安全番外第三篇--关于XXE
一.什么是XXE 1.XML实体简介 (1)在一段时间中,XML都是WEB信息传输的主要方法,时至今日XML在WEB中作为前后台之间传递数据的结构,依然发挥着重要的作用.在XML中有一种结构叫做实体: ...
- Egret在Chrome浏览器中的内存占用(内存泄露)
参考: 怎样查看Chrome的内存占用情况 JS内存泄漏排查方法(Chrome Profiles) chrome内存泄露(一).内存泄漏分析工具 chrome内存泄露(二).内存泄漏实例 目录: 一 ...
- DOS和BAT批量提取修改文件名
DOS命令窗口:开始-cmd-回车,进入DOS命令窗口 案例一.获取文件名 dir 1.输入"文件所在盘",回车,如: d: 2.输入"cd 文件夹位置",回车 ...
- 目前最火的php框架
1.yii 作者:宗霖链接:https://www.zhihu.com/question/25023032/answer/75085250来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...
- Spring的AOP细节理解
什么是AOP?AOP:是面向切面编程,是对面向对象编程(oop)的一种补充,为什么需要AOP?例如在我们做一个计算器,要求我们每次运行对应的功能(也就是进行运算时)都要输出日志,以便于知道程序是怎么运 ...
- Spark源码分析 – Dependency
Dependency 依赖, 用于表示RDD之间的因果关系, 一个dependency表示一个parent rdd, 所以在RDD中使用Seq[Dependency[_]]来表示所有的依赖关系 Dep ...
- flask中db.init_app(app)讲解
http://www.pythondoc.com/flask/extensiondev.html http://www.pythondoc.com/flask/extensiondev.html#fl ...
- Myeclipse下配置struts2和hibernate
最近维护一个项目,是用struts2做的,所以特意学了下struts的入门,否则代码都看不懂啊.下面记录下过程.Myeclipse 版本为2014.struts2,hibernate为4.1. 1.既 ...
- Linux上安装pip以及setuptools
毕竟丰富的第三方库是python的优势所在,为了更加方便的安装第三方库,使用pip命令,我们需要进行相应的安装. 1.安装pip前需要前置安装setuptools 命令如下: wget --no-ch ...