Thinking in java读书笔记.docx

上传人:太** 文档编号:48737621 上传时间:2022-10-06 格式:DOCX 页数:36 大小:328.66KB
返回 下载 相关 举报
Thinking in java读书笔记.docx_第1页
第1页 / 共36页
Thinking in java读书笔记.docx_第2页
第2页 / 共36页
点击查看更多>>
资源描述

《Thinking in java读书笔记.docx》由会员分享,可在线阅读,更多相关《Thinking in java读书笔记.docx(36页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、Thinking in java 读书笔记第一章对象导论.因为类描述了具有相同特征(数据元素、静态)和行为(功能、动态)的对象集 合。public表示紧随其后的元素对任何人都是可用的,而private这个关键字表示除类 型创立者和类型的内部方法之外的任何人都不能访问的元素。Private就像你与客户端 程序之前的一堵砖墙,如果有人试图访问private成员,就会在编译时得到错误信息。 篇protected关键字与private作用相当,差异仅在于继承的类可以访问protected成 员,但是不能访问private成员。java中还有包访问权限。1 .在使用对象时,最关键的问题之一便是它们的生成

2、和销毁方式。每个对象为了生存 都需要资源,尤其是内存。在堆栈中创立存储空间和释放存储空间通常各需要一条汇 编指令即可,分别对应将栈顶指针向下移动和将栈顶指针向上移动。创立堆存储空间 的时间依赖于存储机制的设计。第二章一切都是对象用引用操纵对象(用地址指针操纵对象)1 .操纵的标识符实际上是对象的一个“引用(reference)。或者叫“地址”,句柄的东 西。2 .你拥有一个引用,并不一定需要有一个对象与它关联。如:String s;如果向s发送一个消息,就会返回一个运行时错误。一种平安的做法就是:创立一 个引用的同时便进行初始化(强烈建议)。如:String s = new String(,H

3、,);2.2必须由你创立所有对象。2.2.1 存储到什么地方1)寄存器。2)栈。位于通用RAM (随机访问存储器):一级cache,二级cache.虽然某些JAVA 数据存储在堆栈中特别是对象引用,但是JAVA对象不存储其中。3)堆(heap)。一种通用性的内存池(也存在于RAM中),用于存放所有的JAVA 对象(对象本身)。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多 少存储区域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存 储有很大的灵活性。当你需要创立一个对象的时候,只需要new写一行简单的代 码,当执行这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须

4、要付出相应的代价-用堆进行存储分配比用栈进行存储存储需要更多的时间。4)静态存储(static storage)。这里的“静态”是指“在固定的位置”。静态存储里存放 程序运行时一直存在的数据。你可用关键字static来标识一个对象的特定元素是静 态的,但JAVA对象本身从来不会存放在静态存储空间里。5)常量存储(constant storage)。常量值(final)程序代码内部,这样做是平安的, 因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他局部分割 离开,所以在这种情况下,可以选择将其放在ROM中(从硬盘加载源代码)6)非RAM存储。如果数据完全存活于程序之外,那么它可以不

5、受程序的任何控制, 在程序没有运行时也可以存在。在流对象中,对象转化成字节流。通常被发送给执行根基类的static初始化,然后是下一个派生类的static初始化,依此类推。这个顺序非常重 要,因为派生类的“static初始化”有可能要依赖基类成员的正确初始化。当所有必要的类都已经装载结束,开始执行main。方法体,并用new SubClass ()创立对象。类SubClass存在父类,那么调用父类的构造函数,你可以使用super来指定调用哪个构造函数(也就是Beetle ()构造函数所做的第一件事)。基类的构造过程以及构造顺序,同派生类的相同。首先基类中各个变量按照字面顺序进行初始化,然后执行

6、基类的构造函数的其余局部。对子类成员数据按照它们声明的顺序初始化,执行子类构造函数的其余局部。Java初始化顺序如图:峥态成效及Static块父类怖态成员及Static认执行父类普通成员初始化2续承外秦初始化块内部的顺序由定义的顺序决定普通成trt初始化 一T9构造函数调用父类构造函数I一父丁一始化=(于类普通成协初始化-j(A子类机造雨致 I了类初始2fc=清理(垃圾回收机制)L假设你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收 器只知道释放那些经由new分配的内存,所以它不知道该如何释放该对象的这块“特 殊”内存。为了应对这种情况,Java允许在类中定义一个名为fin

7、alize。的方法。5.2 构造器的初始化顺序垃圾回收机制Java从堆分配空间的速度,可以和其他语言从堆栈上分配空间的速度相媲美。1 .引用计数是一种简单但速度很慢的垃圾回收技术。每个对象都含有一个引用计数 器,当有引用连接至对象时,引用计数加L当引用离开作用域或被置为null时,引 用计数减L这种方法有一个缺陷,如果对象之间存在循环引用,可能会出现“对象 应该被回收,但引用计数却不为零”的情况。对于垃圾回收器而言,定位这样的交 互自引用的对象组所需要的工作量极大。引用计数常用来说明垃圾提供的工作方 式,但似乎从未被应用于任何一种Java虚拟机实现中。2 .自适用的、分代的、停止-复制、标记-

8、清扫”式垃圾回收器在一些更快的模式中,垃圾回收器并非基于引用计数技术。它们依据的思想是:对 于任何“活”的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的弓I用。 这个引用链会穿过数个对象层。由此,如果从堆栈和静态存储区开始,遍历所有的 引用,就能找到所有”活“的对象。对于发现的每个引用,必须追踪它所弓I用的对 象,然后是此对象包含的所有引用。如此反复进行,直到”根源于堆栈和静态存储 区的引用“所形成的网络全部被访问为止。“停止-复制“:先暂停程序的运行(所以它不属于后台回收模式),然后找到所 有存活的对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾。当对象被复 制到新堆时,它们是一个

9、个挨着的,所以新堆保持紧凑排列,然后就可以按简单、 直接地分配新空间了。当把对象从一处搬到另一处时,所有指向它的那些弓I用都必 须修正。“标记-清扫”:所依据的思路同样是从堆栈和静态存储区出发,遍历所有的引 用,进而找出所有存活的对象。每当它找到一个存活对象,就会给对象一个标记, 这个过程中不会回收任何对象。只有全部标记工作完成的时候,清理动作才会开 始。在清理过程中,没有标记的对象将被释放,不会发生任何复制动作。“自适用”:垃圾回收器将对上次回收动作之后新分配的块进行整理。这对处理大 量短命的临时对象很有帮助。垃圾回收器会定期进行完整的清理动作一大型对象任 然不会被复制(只是其代数会增加),

10、内含小型对象的那些块那么被复制并整理。 Java虚拟机会进行监视,如果所有对象都很稳定,垃圾回收器的效率降低的话,就 切换到“标记-清扫”方式;同样,Java虚拟机会跟踪“标记-清扫”效果,要是堆 空间出现很对碎片,就会切换回“停止-复制”方式。这就是“自适应”。3 .5枚举类的初始化.6本章相关概念及问题L this关键字:this关键字只能在方法内部使用,表示对“调用方法的那个对象” 的引用。如果在方法内部调用同一个类的另一个方法,就不必用this,直接调用即可。第六章访问权限控制6,1包名及import-包在工程开发时经常用到,用于为了防止名称重复而采用的一种措施。包的使用方式目7E p

11、ackage 包名;如我在开发时经常使用到包名为package edu.zut.cs.java;建议包名为“域名倒置+工程名”。这里我用了学校的域名。-假设某个类需要访问,那么此类必须声明为public.假设要访问不包package内某个public类时,我们要用到import。通过import引用其他 类;格式:import包名.类名称;-JDK常用包的有以下几个:(1) java.lang -包含 Java 语言的一些核心类,如 String、Math、Integer、System 和 Thread;(2)java,awt -包含构成抽象窗口工具集的多个类,用于构建和管理应用程序的图形用

12、户界面;(3)java.applet -包含applet运行所需要的一些类;(4) -包含执行与网络相关的操作的类;(5)java.io -包含执行与网络相关的一些类;(6万ava.util -包含一些实用工具类,如定义系统特性、与日期日历相关的方法.6.2类成员的访问控制权限-在 Java 中有 4 种访问控制权限:private,default protectedx public;其中default控制权限为方法或变量的名字为其前没有任何访问权限关键字限制。-各个访问控制权限的范围:(1) private:如果成员方法或成员变量被private修饰,其只能被这个类的内部使用;(2) def

13、ault:默认的访问控制成员可以被这个包中的其他类访问,子类不能访问在另 一个包内的父类;(3) protected:成员方法或变量被protected修饰,这个成员被同一个包中的其他类使 用,也可以被其他包的子类访问;(4) public:成员方法或变量被public修饰,其可以被所有包中的类访问;-附加一些Java的命名习惯:(1)包中的字母均为小写;(2)类名、接口名应当使用名字,每个单词首字母大写;(3)方法名、变量名第一个字母小写,其余大写;(4)常量名的每个字母大写。1 .从最大权限到最小权限依次为:public, protected,包访问权限(没有关键词) 和privateo默

14、认访问权限没有任何关键字,但通常是指包访问权限(有时也表 示成为friendly)。这就意味着当前的包中的所有其他类对那个成员都有访问权 限,但对于这个包之外的所有类,这个成员却是private。对private的使用是多 么的重要,在多线程环境中更是如此。2 .Java解释器的运行过程如下:首先,找出环境变量CLASSPATH (可以通过操作 系统来设置,有时也可通过安装程序-用来在你的机器上安装Java或者基于Java 的工具-来设置)。CLASSPATH包含一个或者多个目录,用作查找.class文件的 根目录。从根目录开始,解释器获取包的名称并将每个句点替换成反斜杠,以 从CLASSPA

15、TH根中产生一个路径名称(于是,就变成为 foobarbaz或foo/bar/baz或其他,这取决于操作系统)。得到的路径会与 CLASSPATH中的各个不同的项相连接,解释器就在这些目录中查找与你所要创 建的类名称相关的(lass文件。(解释器还会去查找某些涉及Java解释器所在 的位置的标准目录。).取得对某成员的访问权的唯一途径是:1)使该成员成为public。2)通过不加 访问权限修饰词并将其它类放置于同一个包内的方式给成员赋予包访问权。3) 继承而来的类既可以访问public成员也可以访问protected成员(但不能访问 private成员却不行)。只有在两个类都处于同一个包内时,

16、它才可以访问包访 问权限的成员。但现在不必担忧继承和protected。4)提供访问器(accessor) 和变异器(mutator)方法(也称get / set方法),以读取和改变数值03 .接口和实现:访问权限的控制常被称为是具体实现的隐藏。把数据和方法包装 进类中,以及具体实现的隐藏,常共同被称为是封装。其结果是一个同时带有 特征和行为的数据类型。4 .类的访问权限:1)每个编译单元(文件)都只能有一个public类。这表示, 每个编译单元都有单一的公共接口,用public类来实现。public类的名称必 须完全与含有该编译单元的文件名相匹配,包括大小写。3)虽然不是很常见, 但编译单元

17、内完全不带public类也是可能的。在这种情况下,可以随意对文件 命名。第七章复用类复用代码有两种方式:第一种方法非常直观:只需在新的类中产生现有类的对象。由 于新的类是由现有类的对象所组成,这种方式称为组合。第二种方式它按照现有类的 类型来创立新类。无需改变现有类的形式,采用现有类的形式并在其中添加新代码。 这种神奇的方式称为继承。第三种方式是代理:这是继承和组合之间的中庸之道。7.1 组合语法只需将对象弓I用置于新类中即可。对于非基本类型的对象,必须将其引用置于新的类 中。但可以直接定义基本类型对象。类中的域为基本类型时能够自动被初始化为零。 但是对弓I用会被初始化为null。如果想初始化

18、这些弓I用,可以在代码中的以下位置进 行:1 .在定义对象的地方。这意味着它们总是能够在构造器被调用之前被初始化Q2 .在类的构造器中Q.就在正要使用这些对象之前,这种方式称为惰性初始化。在生成对象不值得及 不必每次都生成对象的情况下,这种方式可以减少额外的负担。7.2 继承语法在继承过程中,需要先声明“新类与旧类相似”。这种声明是通过在类主体的左边花 括号之前,书写后面紧随基类名称的关键字extends而实现的。为了继承,一般的规 那么是将所有的数据成员都指定为private,将所有的方法指定为public。1 .初始化基类:继承并不只是复制基类的接口。当创立了一个导出类的对象时, 该对象包

19、含了一个基类的子对象。这个子对象与你用基类直接创立的对象是一 样的。二者的区别在于,后者来自于外部,而基类的子对象被包含在导出类对 象内部。对基类子对象的正确初始化也是至关重要的,而且也仅有一种方法来 保证这一点:在构造器中调用基类构造器来执行初始化。Java会自动在导出类 中的构造器中插入对基类构造器的调用。2 . JavaSE5新增加了Override注解,当你想要复写某个方法时,可以选择添加这 个注解。3 .向上转型:新类和基类之间的关系,这种关系可以用“新类是现有类的一种类 型”。4 .是否使用继承:一个最清晰的判断方法是问一问自己是否需要从新类向基类进 行向上转型。如果必须向上转型,

20、那么继承是必要的。7.3 final关键字final通常指:“这是无法改变的”。可能用到final的三种情况:数据、方法和类。1. final 数据数据恒定不变:1)一个永不改变的编译时常量。2)一个在运行时被初始化的值,而 你不希望它被改变。它可以在编译时执行计算。但这类常量必须是基于基本数据类 型,并且以关键字final表示。一个既是static又是final的域只占据一段不能改变的存 储空间。对于基本类型,final使数值恒定不变;而对于对象引用,final使引用恒定 不变。而对象其自身却是可以被修改的,Java并未提供使任何对象恒定不变的途径。 定义为public,那么可以被用于包之外

21、;定位为static,那么强调只有一份;定义为 final,那么说明它是一个常量。并不是某个数据是final就认为在编译时可以知道它的 值。空白final:所谓空白final是指被声明为final但又未给定初值的域。必须在 域的定义处或者每个构造器中用表达式对final进行赋值,这正是final域在使用前 总是被初始化的原因所在。final参数:Java允许在参数列表中以声明的方式将参数 指明为finale这意味着你无法在方法中更改参数引用所指向的对象。2. final 方法使用final方法可以防继承修改,又可以提高效率(但在JavaSE5/6中,应该让编译器 去处理效率)。类中的所有pri

22、vate方法都隐藏地指定为final的。3. final 类由于final类禁止继承,所有final类中所有的方法都隐式指定为是final的,因为无法 覆盖它们。4. the different of static between final?4.1 static关键字static关键字可以用来修饰类的变量,方法和内部类。static是静态的意思,也是全局的意 思它定义的东西,属于全局与类相关,不与具体实例相关。就是说它调用的时候,只是 ClassName.method。,而不是 new ClassName().method()0 new ClassName()不就是一个对象了 吗? stat

23、ic的变量和方法不可以这样调用的。它不与具体的实例有关。4.2 final关键字final关键字有三个东西可以修饰的。修饰类,方法,变量。详细解释一下:在类的声明中使用final使用了 final的类不能再派生子类,就是说不可以被继承了。有些java的面试题里 面,问String可不可以被继承。答案是不可以,因为是一个final 类。这可以保证String对象方法的调用确实运行的是String类的方法,而不是经其 子类重写后的方法。在方法声明中使用final被定义为final的方法不能被重写了,如果定义类为final的话,是所有的方法都不 能重写。而我们只需要类中的某几个方法,不可以被重写,就

24、在方法前加final To而且定义为final的方法执行效率要高的啊。在变量声明中使用final这样的变量就是常量了,在程序中这样的变量不可以被修改的。修改的话编译器会 抱错的。而且执行效率也是比普通的变量要高。final的变量如果没有赋予初值的 话,其他方法就必需给他赋值,但只能赋值一次。注意:子类不能重写父类的静态方法哦,也不能把父类不是静态的重写成静态的方法。想隐藏 父类的静态方法的话,在子类中声明和父类相同的方法就行了。5. final、finally 和 finalize 的区别?final用于声明属性,方法和类,分别表示属性不 可变,方法不可覆盖,类不可继承。finaHy是异常处理

25、语句结构的一局部,表示总是执行。finaUze是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方 法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等final一修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不 能作为父类被继承。因此一个类不能既被声明为abstract的,又被声明为final的。将变量或方法 声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而 在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。finally在异常处理时提供finally

26、块来执行任何清除操作。如果抛出一个异常,那么相匹 配的catch子句就会执行,然后控制就会进入finally块(如果有的话)。finalize一方法名。Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出 去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调 用的。它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize。方法以整理系统 资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。7.4 初始化及类的加载初次使用之处也是static初始化发生之处。所有的static对

27、象和static代码段都会 在加载时依程序中的顺序(即:定义类时的书写顺序)而依次初始化。当然,定义为 static的东西只会被初始化一次。第八章多态多态通过别离做什么和怎么做,从另一角度将接口和实现别离开来。8.1多态L多态的作用:如果有这样的一个简单方法,它仅接收基类作为参数,而不是那些特 殊的导出类。我们不管导出类的存在,编写的代码只是与基类打交道。当然,在方法 里编译器是无法识别导出类还是基类的。2 .将一个方法调用同一个方法主体关联起来被称为绑定。假设在程序执行之前进行绑 定,叫做前期绑定。后期绑定:就是在运行时根据对象的类型进行绑定。如果一种语 言能实现后期绑定,就必须具有某种机制

28、,以便在运行时能判断对象的类型,从而调 用恰当的方法。也就是说,编译器一直不知道对象的类型,但是方法调用机制能找到 正确的方法体,并加以调用。其实是在对象中安置某种“类型信息”。Java中除了 static方法和final方法(private方法属于final方法)之外,其他所有的方法都是后期 绑定。3 .域和静态方法:任何域访问都由编译器解析,因此不是多态的。只有非静态方法是 多态的,域是由编译器决定的。静态方法是与类,而并非与单个对象相关联。所以非 静态方法是不具有多态性的。4 .2构造器和多态L构造器实际上是static方法,只不过该static声明是隐式的,因此并不具有多态性。 构造器

29、有一项特殊的任务:检查对象是否被正确地构造。导出类只能访问它自己的成 员,不能访问基类中的成员。对象调用构造器要遵照下面的顺序:1)调用基类构造器。这个步骤会不断地反复递归下去。2)按声明顺序调用成员的初 始化方法。3)调用导出构造器的主体。2 .构造器内部的多态方法的行为在一般的方法内部,动态绑定的调用是运行时才决定的,因为对象无法知道它是属于 方法所在的那个类,还是属于那个类的导出类。3 .构造器初始化的过程:1)在其他任何事物发生之前,将分配给对象的存储空间初始 化为二进制的零。2)调用基类构造器。3)按照声明的顺序调用成员的初始化方法。 4)调用导出类的构造体。4 .协变返回类型:Ja

30、vaSE5中添加了协变返回类型,它表示在导出类中的被覆盖方法可 以返回基类方法的返回类型的某种导出类型。第九章接口9.1抽象类和抽象方法抽象类是普通类与接口之间的一种中庸之道。包含抽象方法的类叫做抽象类。如果一 个类包含一个或多个抽象方法,该类必须被限定为抽象的。(否那么,编译器就会报 错)。为抽象类创立对象是不平安的(为什么不平安,因为当你想调用该抽象方法 时,却没有方法体),所以我们会从编译器那里得到一条出错消息。这样编译器会确 保抽象类的纯粹性。92接口1 .接口被用来建立类与类之间的协议。如果接口不添加public关键字,那么它只具有包 访问权限,这样它就只能在同一个包内可用。接口也可

31、以包含域,但是这些域隐式地 是static和final的。只要一个方法操作的是类而非接口,那么你就只能使用这个类及 其子类。创立一个能够根据所传递的参数对象的不同而具有不同行为的方法,被称为 策略模式。策略设计模式:你可以用任何你想要的对象来调用为的方法,只要你的对 象遵循我的接口。类库是被发现而非创立的,在这种情况下,可以使用适配器设计模 式。适配器中的代码奖接受你所拥有的接口,并产生你所需要的接口。2,接口可以多重继承,也可以嵌套在类或其他接口中。3.接口中的域:因为你放入接口中的任何域都自动是static和final的。所以接口就称 为了一种很便捷的用来创立常量组的工具,但有了 Java

32、 SE5,你可以用enum代替。在 接口中定义的域不能是“空final”,但是可以被非常量表达式初始化。4.当实现某个接口时,并不需要实现嵌套在其内部的任何接口。而且,private接口不 能定义它的类之外被实现。5才妾口是实现多重继承的途径,而生成遵循某个接口的对象的典型方式就是工厂方法 设计模式。9.3多重继承将所有的接口名都置于implements关键字之后,用逗号将它们一一隔开。可以继承任 意多个接口,并可以向上转型为每个接口。因为每一个接口都是一个独立类型。第十章内部类11.1嵌套类和内部类可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种 类

33、型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套 类,也即是被称作为内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可 分为三种:其一、在一个类(外部类)中直接定义的内部类;其二、在一个方法(外部类的方法)中定义的内部类;其三、匿名内部类。public class StaticTest private static String name - njavaJohnn;private String id = X001”;static class Person private String address = swjtu,chenDu,China”;pub

34、lic String mail =josserchaiyahoo ”;内部类公有成员public void display() /System.out.println(id);/不能直接访问外部类的非静态成员System.。射.printin5Me);只能直接访问外部类的静态成员System.owZ.println(MInner H + address);/访问本内部类成员。publicvoid printlnfo。Person person = new Person();person .displ ay();“System. out. println(mail); 不可访问System.ou

35、t.println(address); 不可访 问SystemQ.println(person.address);可以访问内部类的私有成员 System.o/.println(person.mail);/可以访问内部类的公有成员在静态嵌套类内部,不能访问外部类的非静态成员,这是由Java语法中“静态方 法不能直接访问非静态成员“所限定假设想访问外部类的变量,必须通过其它方法解 决,由于这个原因,静态嵌套类使用很少。注意,外部类访问内部类的的成员有些特 别,不能直接访问,但可以通过内部类来访问,这是因为静态嵌套内的所有成员和方 法默认为静态的了。同时注意,内部静态类Person只在类Static

36、Test范围内可见,假设 在其它类中弓I用或初始化,均是错误的。在外部类中定义内部类(非静态嵌套类)对于内部类,通常在定义类的class关键字前不加public或private等限制符,假设 加了没有任何影响,同时好像这些限定符对内部类的变量和方法也没有影响(?)。 内部类和匿名内部类内部类有如下特征:1 .内部类被编译成名为OuterClassName$lnnerClassName.dass的类。2 .内部类可以引用定义在它嵌套的外部类中的数据和方法,所以不需要将外部类 对象的引用传递给内部类的构造方法,因此,内部类可以拿程序简单和简洁。3 .声明用可见性修饰符声明内部类,遵从应用于一般类成

37、员的可见性规那么。4 .可以将内部类声明为static。一个static内部类可以使用外部类的名字访问。一 个static类是不能访问外部类的非静态成员的。5 .内部类的对象经常在外部类中创立。但是也可以从另一个类中创立一个内部类 的对象。如果该内部是非静态的,就必须先创立一个外部类的实例,然后用下 面的语法创立一个内部类的对象:1. OuterClass.InnerClass innerObject = OutObject.new lnnerclass().如果内部类是静态的,那么使用下面的语法为它创立一个对象:Java代码OuterClass.InnerClass innerObject

38、= new OutObject.lnnerclass()匿名内部类是一种特殊的内部类,所以有很多方面都应把它当作内部类对待。除此之 外,它还有以下特征。1 .匿名内部类必须是扩展父类或实现接口的。但是它不能有明确的extends或 implements 语句。2 .匿名内部类必须实现父类或接口中所有的抽象方法。3 .匿名内部类总是使用父类的无参数构造方法来创立实例。如果匿名内部类实现 了接口,构造方法就是Object。.4 .匿名内部类编译为名为OuterClassName$n.class的类。如,如果外部类Test有 两个匿名类,那么它们就编译成Test$l.class和Test$2.cla

39、sso第十一章持有对象Java实现类库还提供了一套相当完整的容器类来解决这个问题,其中基本的类型是 List、Set、Queue和Map,这些对象也称为集合类。Set对于每个值都只保存一个对 象,Map是允许你将某些对象与其他一些对象关联起来的关联数组,Java容器类都可 以自动调整自己的尺寸Q 1L1基本概念LJava容器类类库的用途是“保存对象”。并划分为两个不同的概念。1) Collection。一个独立元素的序列,这些元素都服从一条或者多条规那么。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规 那么来确定对象产生的顺序(通常与它们插入的顺序相同)。2)

40、 Mapo 一组成对的“键值对”对象,允许你用键来查找值。ArrayList允 许你使用数字来查找。也被称为“关联数组”或者“字典”。2 .Arrays.asList()方法接受一个数组或是一个用逗号分隔的元素列表(使用可变参数), 并将其转换为一个List对象。Collections.addAII。方法接受一个Collection对象,以及一 个数组或是一个用逗号分割的列表,将元素添加到Collection中。3 .一共有三种风格的 Map : HashMaps TreeMap 和 LinkedHashMapo 与 HashSet一样, HashMap也提供了最快的查找技术,也没有按照任何明

41、显的顺序来保存其元素。TreeMap按照比拟结果的升序保存键,而linkedHashMap那么按照插入顺序保存键,同 时保存了 HashMap的查询速度。1.2 2 List 及 LinkedListList可使元素维持在特定的序列中,有两种基本类型的List01) 基本的ArrayList,它长于随机访问元素,但是在List的中间插入和移除元素时 较慢。2) LinkedList,它通过代价较低的在List中间进行的插入和删除操作,提供了优化 的顺序访问。LinkedList在随机访问相对较慢,但是它的特性集较ArrayList更大。1.3 3迭代器迭代器是一个对象,它的工作是遍历并选择序列

42、中的对象,而客户端程序员不必之道 或关心该序列底层的结构。Java的Iterator只能单向移动。这个Iterator只能用来: 1)使用方法iterator。要求容器返回一个lterator0 Iterator将准备好返回序列的第一个元素。2) 使用next。获得序列中的下一个元素。3) 使用hasNext。检查序列中是否还有元素。4) 使用remove。将迭代器新近返回的元素删除。1. ListiteratorListiterator是一个更加强大的Iterator的子类型,它只能用于各种List类的访问。尽管 Iterator只能向前移动,但是Listiterator可以双向移动。2.

43、Stack另外一台机器。在“持久化对象中,对象被存放于磁盘上。就速度来说,有如下关系:寄存器 堆栈(堆 其他特例:基本类型基本类型不用new来创立变量,而是创立一个并非是引用的”自动“变量。这个 变量直接存储”值 并置于栈中,因此更加高效。这里仅指八种基本类型(长度固 定)。Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字 符类型,还有一种布尔型。1、整数:包括int,short,bytejong,初始值为02、浮点型:float,double ,初始值为0.03、字符:char,初始值为空格,即”。如果输出,在Console上是看不到效果的。4、布尔:boole

44、an,初始值为false。基本型别大小最小值最大值booleanchar16-bitUnicode 0Unicode 2 16-1byte8-bit-128+127short16-bit-215+215-1int32-bit-2八31+2-31-1long64-bit-2,63+2八63-1float32-bitIEEE754IEEE754double64-bitIEEE754IEEE754void注意:表格里的人代表的是次方;java采用unicode, 2个字节来表示一个字符。所有数值类型都有正负号。byte (8bit) char,short(16bit)int(32bit)基本类型具有

45、包装类,使得可以在堆中创立一个非基本对象。用来表示基本类型。char c =x;存放在栈Character ch = new Character(x);高精度数字“栈”通常是指后进先出”的容器。LinkedList具有能够直接实现栈的所有功能的方 法,因此可以直接将LinkedList作为栈使用。3. SetSet最常用被使用的是测试归属性,你可以很容易地询问某个对象是否在某个Set中。 TreeSet将元素存储在红-黑树数据结构中,而HashSet使用的是散列函数。LinkedHashList因为查询速度的原因也使用了散列。4. Map是将对象映射到其他对象的能力。5. Queue队列是一个

46、典型的先进先出的容器。队列在并发编程中特别重要。LinkedList提供了方 法以支持队列的行为,并且它将实现Queue接口,因此LinkedList可用作Queue的一 种实现。PriotityQueue提供了典型的队列规那么。6. Foreach与迭代器:到目前为止,foreach语法主要用于数组,但是它也可以应用于 任何Collection对象。JavaSE5引入了新的被称为Iteratable的接口,该接口包含一个能 够产生Iterator的iterator。方法,并且Itearable接口被foreach用来在序列中移动。在 Java SE5中,大量的类都是Iterable类型,主要

47、包含所有的Collection类(但是不包括 各种Map) 当你有一个接口并需要另一个接口时,编写适配器就可以解决问题。7. 总结:1)数组将数字与对象联系起来。2) Collection保存单一的元素,而Map保存相关联的键值对。容器不能持有基本类 型,但是自动包装机制会仔细地执行基本类型到容器中所持有的包装类型之间的双向 转换。3)像数组一样,List也建立数字索引与对象的关联,因此,数组和List都是排序好的 容器。List能够自动扩容。4)如果要进行大量的随机访问,就使用ArrayList。如果要经常从表中间插入或删除元 素,那么应该使用LinkedListo5)各种Queue以及栈的

48、行为,由LinkedList提供支持。6) Map是一种将对象(而非数字)与对象相关联的设计。HashMap设计用来快速访 问;而TreeMap保持“键”始终处于排序状态,所以没有HashMap快。LinkedHashMap保持元素插入的顺序,但是也通过散列提供了快速访问能力。7) Set不接受重复元素。HashSet提供最快的查询速度,而TreeSet保持元素处于排序 状态。LinkedHashSet以插入顺序保存元素。8)新程序中不应该使用过时的Vector、Hashtable和Stack。j Map :* . J4 Listiterator Mi1 Produces:Set J Queue |J.,. - -_4一T List j

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 解决方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com