对象创建
数据存储
有5个不同的地方可以存储数据:
1、 寄存器(Registers)最快的存储区域,位于CPU内部无法直接控制;
2、 栈内存(Stack)存在于常规内存RAM(随机访问存储器,RandomAccessMemory)区域中,可通过栈指针获得处理器的直接支持栈指针下移分配内存,上移释放内存,这是一种快速有效的内存分配方法,速度仅次于寄存器创建程序时,Java系统必须准确地知道栈内保存的所有项的生命周期这种约束限制了程序的灵活性因此,虽然在栈内存上存在一些Java数据,特别是对象引用,但Java对象却是保存在堆内存的;
3、 堆内存(Heap)这是一种通用的内存池(也在RAM区域),所有Java对象都存在于其中与栈内存不同,编译器不需要知道对象必须在堆内存上停留多长时间因此,用堆内存保存数据更具灵活性创建一个对象时,只需用new命令实例化对象即可,当执行代码时,会自动在堆中进行内存分配这种灵活性是有代价的:分配和清理堆内存要比栈内存需要更多的时间随着时间的推移,Java的堆内存分配机制现在已经非常快,因此这不是一个值得关心的问题了;
4、 常量存储(Constantstorage)常量值通常直接放在程序代码中,因为它们永远不会改变;
5、 非RAM存储(Non-RAMstorage)数据完全存在于程序之外,在程序未运行以及脱离程序控制后依然存在两个主要的例子:(1)序列化对象:对象被转换为字节流,通常被发送到另一台机器;(2)持久化对象:对象被放置在磁盘上,即使程序终止,数据依然存在这些存储的方式都是将对象转存于另一个介质中,并在需要时恢复成常规的、基于RAM的对象Java为轻量级持久化提供了支持而诸如JDBC和Hibernate这些类库为使用数据库存储和检索对象信息提供了更复杂的支持;
基本类型的存储
对于基本类型的创建方法, Java 使用了和 C/C++ 一样的策略。也就是说,不是使用 new 创建变量,而是使用一个“自动”变量。 这个变量直接存储"值",并置于栈内存中,因此更加高效。
高精度数值
在Java 中有两种类型的数据可用于高精度的计算。它们是 BigInteger 和 BigDecimal。尽管它们大致可以划归为“包装类型”,但是它们并没有对应的基本类型。
BigInteger 支持任意精度的整数。可用于精确表示任意大小的整数值,同时在运算过程中不会丢失精度。 BigDecimal 支持任意精度的定点数字。例如,可用它进行精确的货币计算。
类的创建
基本类型默认值
如果类的成员变量(属性)是基本类型,那么在类初始化时,这些类型将会被赋予一个初始值。
基本类型 | 初始值 |
---|---|
boolean | false |
char | \u0000 (null) |
byte | (byte) 0 |
short | (short) 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
这种默认值的赋予并不适用于局部变量 —— 那些不属于类的属性的变量。 因此,若在方法中定义的基本类型数据,如下:
intx;
这里的变量 x 不会自动初始化为0
Java 将会提示我们“编译时错误,该变量可能尚未被初始化”。
返回类型
方法名和参数列表统称为方法签名(signature of the method)。签名作为方法的唯一标识。
调用方法的行为有时被称为向对象发送消息。面向对象编程可以总结为:向对象发送消息。
程序编写
命名可见性
为一个类库生成一个明确的名称,Java 创建者希望我们反向使用自己的网络域名,因为域名通常是唯一的。
现在整个包名都是小写的。
小试牛刀
java.lang 隐式包含在每个 Java 代码文件中,因此这些类是自动可用的。