您的位置:首页 > 编程语言 > Java开发

java笔记(2)

2016-05-13 11:38 330 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/yuxiangzju/article/details/51393991

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
} ///:~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: