java笔记(2)
1.单根结构
在面向对象的程序设计中,由于 C++的引入而显得尤为突出的一个问题是:所有类最终是否都应从单独一个
基础类继承。在 Java 中(与其他几乎所有 OOP 语言一样),对这个问题的答案都是肯定的,而且这个终级基
础类的名字很简单,就是一个“Object”。这种“单根结构”具有许多方面的优点。
单根结构中的所有对象都有一个通用接口,所以它们最终都属于相同的类型
2.句柄操纵对象
String s;
但这里创建的只是句柄,并不是对象。若此时向 s 发送一条消息,就会获得一个错误(运行期)。这是由于
s 实际并未与任何东西连接(即“没有电视机”)。因此,一种更安全的做法是:创建一个句柄时,记住无
论如何都进行初始化:
String s = “asdf”;
然而,这里采用的是一种特殊类型:字串可用加引号的文字初始化。通常,必须为对象使用一种更通用的初
始化类型。
创建句柄时,我们希望它同一个新对象连接。通常用 new 关键字达到这一目的。 new 的意思是:“把我变成
这些对象的一种新类型”。所以在上面的例子中,可以说:
String s = new String(“asdf”);
创建对象数组时,实际创建的是一个句柄数组。而且每个句柄都会自动初始化成一个特殊值,并带有自己的
关键字: null (空)。一旦 Java 看到 null ,就知道该句柄并未指向一个对象。正式使用前,必须为每个句
柄都分配一个对象。若试图使用依然为 null 的一个句柄,就会在运行期报告问题。因此,典型的数组错误在
Java 里就得到了避免。
3.保存到什么地方
(1) 寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存
器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的
程序里找到寄存器存在的任何踪迹。
(2) 堆栈。驻留于常规 RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆
栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存
方式,仅次于寄存器。创建程序时, Java 编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存
在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活
性,所以尽管有些 Java 数据要保存在堆栈里——特别是对象句柄,但 Java 对象并不放到其中。
(3) 堆。一种常规用途的内存池(也在 RAM 区域),其中保存了 Java 对象。和堆栈不同,“内存堆”或
“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要
在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用 new 命
令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然
会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!
(4) 静态存储。这儿的“静态”( Static)是指“位于固定位置”(尽管也在 RAM 里)。程序运行期间,静
态存储的数据将随时等候调用。可用 static 关键字指出一个对象的特定元素是静态的。但 Java 对象本身永
远都不会置入静态存储空间。
(5) 常数存储。常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数
需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。
(6) 非 RAM 存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。
其中两个最主要的例子便是“流式对象”和“固定对象”。对于流式对象,对象会变成字节流,通常会发给
另一台机器。而对于固定对象,对象保存在磁盘中。即使程序中止运行,它们仍可保持自己的状态不变。对
于这些类型的数据存储,一个特别有用的技巧就是它们能存在于其他媒体中。一旦需要,甚至能将它们恢复
成普通的、基于 RAM 的对象。 Java 1.1 提供了对 Lightweight persistence 的支持。未来的版本甚至可能提
供更完整的方案。
boolean 1 位 - - Boolean char 16 位 Unicode 0 Unicode 2 的 16 次方-1 Character byte 8 位 -128 +127 Byte (注释①) short 16 位 -2 的 15 次方 +2 的 15 次方-1 Short(注释①) int 32 位 -2 的 31 次方 +2 的 31 次方-1 Integer long 64 位 -2 的 63 次方 +2 的 63 次方-1 Long float 32 位 IEEE754 IEEE754 Float double 64 位 IEEE754 IEEE754 D ouble
高精度的计算: BigInteger 和 BigDecimal
4.static关键字
通常,我们创建类时会指出那个类的对象的外观与行为。除非用 new 创建那个类的一个对象,否则实际上并
未得到任何东西。只有执行了 new 后,才会正式生成数据存储空间,并可使用相应的方法。
但在两种特殊的情形下,上述方法并不堪用。一种情形是只想用一个存储区域来保存一个特定的数据——无
论要创建多少个对象,甚至根本不创建对象。另一种情形是我们需要一个特殊的方法,它没有与这个类的任
何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。为满足这两方面的要求,可使用
static(静态)关键字。一旦将什么东西设为 static,数据或方法就不会同那个类的任何对象实例联系到一
起。所以尽管从未创建那个类的一个对象,仍能调用一个 static 方法,或访问一些 static 数据。
为了将数据成员或方法设为 static,只需在定义前置和这个关键字即可。例如,下述代码能生成一个 static
数据成员,并对其初始化:
< 3ff7 code class=" hljs php">class StaticTest { Static int i = 47; }
现在,尽管我们制作了两个 StaticTest 对象,但它们仍然只占据 StaticTest.i 的一个存储空间。这两个对
象都共享同样的 i 。请考察下述代码:
StaticTest st1 = new StaticTest(); StaticTest st2 = new StaticTest();
此时,无论 st1.i 还是 st2.i 都有同样的值 47,因为它们引用的是同样的内存区域。
5.注释例子
//: Property.java import java.util.*; /** The first Thinking in Java example program. * Lists system information on current machine. * @author Bruce Eckel * @author http://www.BruceEckel.com * @version 1.0 */ public class Property { /** Sole entry point to class & application * @param args array of string arguments * @return No return value * @exception exceptions No exceptions thrown */ public static void main(String[] args) { System.out.println(new Date()); Properties p = System.getProperties(); p.list(System.out); System.out.println("--- Memory Usage:"); Runtime rt = Runtime.getRuntime(); System.out.println("Total Memory = " + rt.totalMemory() + " Free Memory = " + rt.freeMemory()); } 59 } ///:~
- 我的Thinking in Java学习笔记(七)
- Java培训总结笔记(四)
- 【JAVA IO】_内存操作流笔记
- java线程学习笔记
- Java基础笔记-String类
- Java基础知识强化之集合框架笔记26:LinkedList的特有功能
- [Java] JSP笔记 - Java Bean
- java微信公众号开发学习笔记(二)——安装eclipse 及token验证
- 【JAVA学习笔记】21 内部类
- java 笔记
- Java学习笔记_26_泛型概述
- java程序设计基础篇 复习笔记 第四单元
- 黑马程序员_java基础笔记(05)...String类
- Java学习笔记1——关于Scanner类中nextDouble、nextInt、……等方法与nextLine方法联用的问题
- 数据结构与算法分析笔记与总结(java实现)--字符串9:拼接最小字典序练习题
- java学习笔记之: spring-aop
- 复习《Thinking in Java》笔记二:第九、十章笔记
- 【黑马程序员】 java笔记——线程通信
- 黑马程序员 java笔记之字符串
- 学习笔记_Java_day10_response发送状态码(3)