java学习笔记(ThinkinginJava)

上传人:宝路 文档编号:23263655 上传时间:2017-11-30 格式:DOC 页数:17 大小:88.51KB
返回 下载 相关 举报
java学习笔记(ThinkinginJava)_第1页
第1页 / 共17页
java学习笔记(ThinkinginJava)_第2页
第2页 / 共17页
java学习笔记(ThinkinginJava)_第3页
第3页 / 共17页
java学习笔记(ThinkinginJava)_第4页
第4页 / 共17页
java学习笔记(ThinkinginJava)_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《java学习笔记(ThinkinginJava)》由会员分享,可在线阅读,更多相关《java学习笔记(ThinkinginJava)(17页珍藏版)》请在金锄头文库上搜索。

1、2010/4/91. Java 中的堆和棧栈与堆都是 Java 用来在 Ram 中存放数据的地方。与 C+不同,Java 自动管理栈和堆,程序员不能直接地设置栈或堆。Java 的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过 new 指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存 的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生

2、存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(int, short, long, byte, float, double, boolean, char)和对象句柄。栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:int a = 3;int b = 3;编 译器先处理 int a = 3;首先它会在栈中创建一个变量为 a 的引用,然后查找栈中是否有 3 这个值,如果没找到,就将 3 存放进来,然后将 a 指向 3。接着处理 int b = 3;在创建完 b 的引用变量后,因为在栈中已经有 3 这个值,便将 b 直接指向 3。这样,就出现了 a 与 b 同时均

3、指向 3 的情况。这时,如果再令 a=4;那么编译器会重新搜索栈中是否有 4 值,如果没有,则将 4 存放进来,并令 a 指向 4;如果已经有了,则直接将 a 指向这个地址。因此 a 值的改变不会影响到 b 的值。要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况 a 的修改并不会影响到 b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。String 是一个特殊的包装类数据。可以用:String str = new String(“abc”);String str = “abc”;两种的形式来创

4、建,第一种是用 new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。而第二种是先在栈中创建一个对 String 类的对象引用变量 str,然后查找栈中有没有存放”abc”,如果没有,则将”abc”存放进栈,并令 str 指向”abc”,如果已经有”abc” 则直接令 str 指向“abc”。比较类里面的数值是否相等时,用 equals()方法;当测试两个包装类的引用是否指向同一个对象时,用=,下面用例子说明上面的理论。String str1 = “abc”;String str2 = “abc”;System.out.println(str1=str2); /true可以

5、看出 str1 和 str2 是指向同一个对象的。String str1 =new String (“abc”);String str2 =new String (“abc”);System.out.println(str1=str2); / false用 new 的方式是生成不同的对象。每一次生成一个。因 此用第一种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为 JVM 会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于 String str = new String(“abc”);的代

6、码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。另 一方面, 要注意: 我们在使用诸如 String str = “abc”;的格式定义类时,总是想当然地认为,创建了 String 类的对象 str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过 new()方法才能保证每次都创建一个新的对象。2. 程序运行时,我们最好对数据保存到什么地方做到心中有数。特别要注意的是内存的分配。有六个地方都可以保存数据:(1) 寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存器的数量十分

7、有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹。(2) 堆栈。驻留于常规 RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java 编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间” 。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java 数据要保存在堆栈里特别是对象句柄,但 Java 对象并不放到其中。(3

8、) 堆。一种常规用途的内存池(也在 RAM 区域) ,其中保存了 Java 对象。和堆栈不同, “内存堆”或“堆” (Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用 new 命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!(4) 静态存储。这儿的“静态” (Static)是指“位于固定位置” (尽管也在RAM 里) 。程序运行期间,静态存储的数据将随时等候调用。

9、可用 static 关键字指出一个对象的特定元素是静态的。但 Java 对象本身永远都不会置入静态存储空间。(5) 常数存储。常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数需要严格地保护,所以可考虑将它们置入只读存储器(ROM) 。(6) 非 RAM 存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。其中两个最主要的例子便是“流式对象”和“固定对象” 。对于流式对象,对象会变成字节流,通常会发给另一台机器。而对于固定对象,对象保存在磁盘中。即使程序中止运行,它们仍可保持自己的状态不变。对于这些类型的数据存储,一个特别有用的技巧

10、就是它们能存在于其他媒体中。一旦需要,甚至能将它们恢复成普通的、基于 RAM 的对象。Java 1.1 提供了对 Lightweight persistence 的支持。未来的版本甚至可能提供更完整的方案3. 向上轉型用一個派生類給一個基類類型變量賦值時,隱式實現了是向上轉型,表現為派生类型当作它的基本类型处理。向上轉型是安全的。向上轉型也是實現多態的一種方法。例如:基類 Fruit ,有一個 Public 方法 Eat();派生類有 Orange 類和 Apple 類,有自己的帶一個字符串參數的構造函數。Fruit F;F=new Orange(“橘子”);Feat();以上代碼是正確的。但

11、反過來不成立:Apple AA;AA=new Fruit();/錯誤注意:a.儘管實現向上轉型,但對象變量調用的還是派生類的方法,若派生類沒有覆蓋基類方法,則調用基類的方法;b.轉型后的變量只能調用基類所定義的方法,不能調用基類沒定義而派生類已定義的方法。 4. 兩個高精度類型:BigInteger 和 BigDecimalBigIntege 的類庫 java.math.BigInteger,用 BigInteger 要 import java.math.BigInteger;BigDecimal 的類庫 import java.math.BigInteger;另外介紹三個庫 1 java.u

12、til.Random,2 java.math.MathContext,3 java.math.RoundingMode1 是用來生成隨機數的;2 是用來精確小數的, 3 是用來確定舍位方式的:public MathContext(int setPrecision,RoundingMode setRoundingMode)Constructs a new MathContext with a specified precision and rounding mode. Parameters: setPrecision - The non-negative int precision settin

13、g. 有效位數setRoundingMode - The rounding mode to use. 舍位方式:UP DOWN CEILING FLOOR HALF_UP HALF_DOWN HALF_EVEN例如:MathContext data=new MathContext(3, RoundingMode.UP);5. 基本數據類型的默認值問題A 當基本數據類型作為类成员使用時,有默認值如下: Boolean falseChar u0000(null)byte (byte)0short (short)0int 0long 0Lfloat 0.0fdouble 0.0dB 當基本數據類型作

14、為“局部” 变量 那些变量并非一个类的字段。所以,假若在一个函数定义中写入下述代码:int x;那么 x 会得到一些随机值(这与 C 和 C+是一样的) ,不会自动初始化成零。6. 通常,我们创建类时会指出那个类的对象的外观与行为。除非用 new 创建那个类的一个对象,否则实际上并未得到任何东西。只有执行了 new 后,才会正式生成数据存储空间,并可使用相应的方法。7. 靜態成員和靜態方法,也稱類成員和類方法数据或方法不会同該类的任何对象实例联系到一起。即使從未創建對象實例,仍能調用靜態成員和靜態方法。相對所有的類實例,靜態成員只占据一个存储空间,如class StaticTest Stati

15、c int i = 47;现在,尽管我们制作了两个 StaticTest 对象,但它们仍然只占据 StaticTest.i的一个存储空间。这两个对象都共享同样的 i。请考察下述代码:StaticTest st1 = new StaticTest();StaticTest st2 = new StaticTest();此时,无论 st1.i 还是 st2.i 都有同样的值 47,因为它们引用的是同样的内存区域。有两个办法可引用一个 static 变量。正如上面展示的那样,可通过一个对象命名它,如 st2.i。亦可直接用它的类名引用,而这在非静态成员里是行不通的(最好用这个办法引用 static

16、变量,因为它强调了那个变量的 “静态” 本质) 。StaticTest.i+;2010/4/124 月 12 日(星期一)學習筆記1. 基本數據類型和引用數據類型的賦值運算“=”A对主数据类型的赋值是非常直接的。由于主类型容纳了实际的值,而且并非指向一个对象的句柄,所以在为其赋值的时候,可将来自一个地方的内容复制到另一个地方。例如,假设为主类型使用“A=B”,那么 B 处的内容就复制到 A。若接着又修改了 A,那么 B 根本不会受这种修改的影响。B对一个对象进行操作时,我们真正操作的是它的句柄。所以倘若“从一个对象到另一个对象” 赋值,实际就是将句柄从一个地方复制到另一个地方。这意味着假若为对象使用“C=D”,那么 C 和 D 最终都会指向最初只有 D 才指向的那个对象。例如:class Number int i;public class Assignment public static void main(String args) Number n1 = new Nu

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

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号