网络编程 (Java)第四讲(初始化和清除)_第1页
网络编程 (Java)第四讲(初始化和清除)_第2页
网络编程 (Java)第四讲(初始化和清除)_第3页
网络编程 (Java)第四讲(初始化和清除)_第4页
网络编程 (Java)第四讲(初始化和清除)_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第4章: 初始化和清除初始化和清除 湖南大学 软件学院 柳杨4.1 以构造器确保初始化C+引入了“构造器(constructor)”的概念。这是一个在创建对象时被自动调用的特殊方法.Java中也采用了构造器. 构造器采用与类相同的名称. import com.bruceeckel.simpletest.*; class Rock Rock() / This is the constructor System.out.println(Creating Rock); 在创建对象时:new Rock(); 将会为对象分配存储空间. 湖南大学 软件学院 柳杨4.2 方法重载(method overlo

2、ading) 相同的词可以表达多种不同的含义它们被“重载”了.所谓方法是给某个动作取的名字. 方法重载(method overloading)与方法重写(method overriding)的区别.想用多种方式创建一个对象该怎么办呢? 构造器必须有相同的名字,即类名.为了让方法名相同而形式参数不同的构造器同时存在,必须用到“方法重载”.湖南大学 软件学院 柳杨4.2.1 区分重载方法 每个重载的方法都必须有一个独一无二的参数类型列表.参数类型列表可以不同在:l参数类型l参数数量 l参数顺序Note: 重载方法不能只是返回类型不同.public void print (int x, int y,

3、 Circle c)public void print (double x, double y, Circle c)public void print (Circle c)public void print (Circle c, int x, int y)湖南大学 软件学院 柳杨4.2.2 涉及基本类型的重载 基本类型能从一个“较小”的类型自动提升至一个“较大”的类型,此过程一旦牵涉到重载,可能会造成一些混淆.如果传入的实际参数“较大”,就需要做类型转换. 示例initialization.PrimitiveOverloading.java、initialization.Demotion.ja

4、va湖南大学 软件学院 柳杨4.2.3 缺省构造器(无参构造器) 如果你写的类中没有构造器,则编译器会自动帮你创建一个缺省构造器. 如果你已经定义了一个构造器(无论是否有参数),编译器就不会帮你自动创建缺省构造器. class Hat Hat (int i) Hat (double d) new Hat(); 湖南大学 软件学院 柳杨4.2.4 this关键字 假设希望在方法的内部获得对当前对象的引用,可以使用this关键字this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用. 湖南大学 软件学院 柳杨4.2.4 this关键字 示例initialization.Leaf.ja

5、vapublic class Leaf int i = 0; Leaf increment() i+; return this; void print() System.out.println(i = + i); public static void main(String args) Leaf x = new Leaf(); x.increment().increment().increment().print(); 湖南大学 软件学院 柳杨4.2.4.1 在构造器中调用构造器在构造器中,如果为this添加了参数列表,那么就有了不同的含义:这将产生对符合此参数列表的某个构造器的明确调用.使用

6、 this.memberDataname来引用类中的数据成员. Note: 除构造器之外,编译器禁止在其他任何方法中调用构造器. 示例initialization.Flower.java湖南大学 软件学院 柳杨4.2.4.2 static的含义静态方法就是没有this的方法.可以在没有创建任何对象的前提下,仅仅通过类本身来调用静态方法. 在类中置入的静态方法可以访问其它静态方法和静态字段. 湖南大学 软件学院 柳杨Java有垃圾回收器来回收无用对象占据的内存资源. 垃圾回收器只知道释放那些经由new分配的内存.一个名为finalize( )的方法用于回收不是由new分配的内存.一旦垃圾回收器准

7、备好释放对象占用的存储空间,将首先调用其finalize( )方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存. 湖南大学 软件学院 柳杨4.3 清除: 终结(finalization)和垃圾回收4.3.1 finalize( )用途何在? 之所以要有finalize(),是由于可能在分配内存时,采用了类似C语言中的做法而非Java中的通常做法. 这种情况主要发生在使用“本地方法”(native)的情况下,它是在Java中调用非Java代码的一种方式. finalize()不是进行普通的清除工作的合适场所. 湖南大学 软件学院 柳杨4.3.2 你必须执行清除垃圾回收器会帮助释放

8、存储空间. 如果希望进行除释放存储空间之外的清除工作,你还是得明确调用某个恰当的Java方法(并非finalize方法). 无论是“垃圾回收”还是“终结”,都不保证一定会发生. 湖南大学 软件学院 柳杨4.3.2.1 终结条件 当你对某个对象不再感兴趣,也就是它可以被清除时,这个对象应该处于某种状态,使它占用的内存可以被安全地释放. l例如,要是对象代表了一个打开的文件,在对象被回收前程序员应该关闭这个文件. 此时”文件关闭”就是一个终结条件.lfinalize( )的价值在于可以用来最终发现这种情况,尽管它并不总是会被调用. 示例initialization.TerminationCondi

9、tion.javaNote: System.gc( )用于强制终结动作的进行. 湖南大学 软件学院 柳杨4.3.2.2 垃圾回收器如何工作“引用记数(reference counting)”是一种简单但速度很慢的垃圾回收技术. 这种方法有个缺陷,如果对象之间存在循环引用,可能会出现“对象应该被回收,但引用计数却不为零”的情况. 对垃圾回收器而言,定位这样存在交互引用的对象组所需的工作量极大. Java虚拟机采用一种“自适应”的垃圾回收技术.至于如何处理找到的存活对象,取决于不同的Java虚拟机实现. 湖南大学 软件学院 柳杨4.4 成员初始化 一个类的所有基本类型数据成员都会保证有一个初始值.

10、在类里定义一个对象引用时,如果不将其初始化,此引用就会获得一个特殊值null. 定义于方法内部的局部变量必须明确初始化. 示例initialization.InitialValues.java湖南大学 软件学院 柳杨4.4.1 指定初始化 变量初始化的两种方式:l在定义类成员变量的时候赋值:class InitialValues boolean b = true; char c = x; Depth d = new Depth(); /l调用某个方法来提供初值,如该方法带有参数,这些参数必须是已经初始化了的:示例initialization.MethodInit.java、initializa

11、tion.MethodInit2.java、initialization.MethodInit3.java湖南大学 软件学院 柳杨4.4.2 构造器初始化 可以用构造器来进行初始化.无法屏蔽自动初始化的进行,它将在构造器被调用之前发生, 例如:class Counter int i; Counter() i = 7; / . . . i首先被初始化为0,然后再为7. 湖南大学 软件学院 柳杨4.4.3 初始化顺序 在类的内部,变量定义的先后顺序决定了初始化的顺序. 即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化. 示例initialization.Ord

12、erOfInitialization.java湖南大学 软件学院 柳杨4.4.4 静态数据的初始化 当数据是静态的:如果它是一个基本类型,就获得基本类型的标准初值. 如果它是一个对象引用,那么除非新创建一个对象,并指派给该引用,否则它就是空值(null). 示例initialization.StaticInitialization.java湖南大学 软件学院 柳杨创建名为Dog的类的过程: l1 当首次创建类型为Dog的对象时(构造器可以看成静态方法),或者Dog类的静态方法静态域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件。 l2 然后载入Dog.class(后面

13、会学到,这将创建一个Class对象),有关静态初始化的动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。 l3 当你用new Dog( )创建对象的时候,首先将在堆上为Dog对象分配足够的存储空间。 l4 这块存储空间会被清零,就自动地将Dog中的所有基本类型数据设置成了默认值(对数字来说就是0,对布尔型和字符型也相同),而引用则被设置成了null。 l5 执行所有出现于字段定义处的初始化动作。 l6 执行构造器。湖南大学 软件学院 柳杨4.4.4 静态数据的初始化4.4.5 显式的静态初始化 Java允许将多个静态初始化动作组织成一个特殊的“静态子句”(有时也叫作“静态

14、块”).就像下面一样:class Spoon static int i; static i = 47; / . . . 尽管上面的代码看起来象个方法,但它实际只是一段跟在static关键字后面的代码。与其他静态初始化动作一样,这段代码仅执行一次:当首次生成这个类的一个对象时,或者首次访问属于那个类的一个静态成员时(即便从未生成过那个类的对象). 湖南大学 软件学院 柳杨4.4.6 非静态实例初始化 Java中也有类似的语法用来初始化每一个对象的非静态变量: public class Mugs Mug c1; Mug c2; c1 = new Mug(1); c2 = new Mug(2); S

15、ystem.out.println(c1 & c2 initialized); / Note: 这种语法对于支持“匿名内部类”的初始化是必须的. 示例initialization.Mugs.java湖南大学 软件学院 柳杨4.4.7 数组初始化 数组只是相同类型的、用一个标识符名称封装到一起的一个对象序列或基本类型数据序列. 编译器不允许指定数组的大小. int a1; int a1; 一个数组可以像下面一样进行初始化,也可以将一个数组赋值给另外一个数组,实际上对复制了一个引用:int a1 = 1, 2, 3, 4, 5 ; a2 = a1; 通过数组的成员length可以知道在数组

16、中包含了多少个元素. 示例initialization.ArraysOfPrimitives.java湖南大学 软件学院 柳杨4.5 多维数组 Java也很容易创建多维数组:int a1 = 1, 2, 3, , 4, 5, 6, , ; int a3 = new intrand.nextInt(7); for(int i = 0; i a3.length; i+) a3i = new intrand.nextInt(5); for(int j = 0; j a3i.length; j+) a3ij = new intrand.nextInt(5); Note: 如果没有明确初始化,数组的值会自动初始化为0、false或者null.湖南大学 软件学院 柳杨总结构造器,这种精巧的初始化机制,应该给了你很强的暗示:初始化在Java中占有至关重要的地位.Java的垃圾回收器可以极大简化编程工作,而且在处理内存的时候也更安全.ExercisesExercise 4 and Exercise 9 in part of “

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论