------------用引用操纵对象
》》在java中,一切都被视为对象。尽管一切都看作对象,但操纵的标识符实际上
是对象的一个“引用”。
》》一种安全的做法:创建一个引用的同时便进行初始化。
------------必须由你创建所有对象
》》使用 new 关键字来创建新的对象。
》》数据存储到什么地方?
------(1)、寄存器。
这是最快的存储区,因为它位于不同于其他存储区的地方----处理器
内部。 但是寄存器的数量极其有限。所以寄存器根据需求进行分配。你
不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。
------(2)、堆栈。
位于通用 RAM (随机访问存储器)中,但通过堆栈指针可以从处理
器那里获得直接支持。堆栈指针若向下移动,则分配新的内存;若向上
移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄
存器。Java 系统必须知道存储在堆栈内所有项的确切生命周期,以便上
下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些 java数
据存储于堆栈中----特别是对象的引用,但是java 的对象并不存储于其
中。
------(3)、堆。
一种通用的内存池(也位于RAM 区),用于存放所有的 Java 对象。堆不
同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间。因
此,在堆里分配存储有很大的灵活性。当需要一个对象时,只需用 new 写
一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。当然,
为这种灵活性必须要付出相应的代价:用堆进行存储分配和清理可能比用
堆栈进行存储分配需要更多的时间。
------(4)、常量存储。
常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会
被改变。有时,在嵌入式系统中,常量本身会和其他部分隔离开,所以在这种情
况下,可以选择将其存放在 ROM(只读存储器)中。
------(5)、非RAM 存储。
如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序
没有运行时也可以存在。其中的两个基本的例子是流对象和持久化对象。
*** 流对象: 在流对象中,对象转化成字节流,通常被发送给另一个机器。
*** 持久化对象:在持久化对象中,对象存放于磁盘上,因此,即使程序
终止执行,它们仍然可以保持自己的状态。
这种存储方式的技巧在于:把对象转化成可以存放在其他媒介上的事物,
在需要时,可恢复成常规的、基于RAM 的对象。Java 还提供了对轻量级持久化
的支持,而诸如 JDBC 和 Hibernate 这样的机制提供了更加复杂的对在数据库中
存储和读取对象信息的支持。
》》基本类型:------->包装类
(1)、boolean ------>Boolean
char ------> Character
byte ------> Byte
short ------> Short
int -------> Integer
long -------> Long
float -------->Float
double -------->Double
void -------->Void
(2)、基本类型的变量,都是“自动变量”不是“引用”变量。自动变量直接存储“值”
并置于堆栈中,因此更加高效。
(3)、所有数值类型都有正负号,所以不要去寻找无符号的数值类型。
(4)、boolean 类型所占的存储空间大小没有明确指定,仅定义为能够取字面值
true 或 false 。
(5)、基本类型具有的包装类,使得可以在堆中创建一个非基本对象,用来表示对应
的基本类型。
(6)、高精度数字:
*** Java 提供了两个用于计算的类:BigInteger 和 BigDecimal 。
***以上两个类提供的操作与对基本类型所能执行的操作相似。也就是说,
能作用于 int 或 float的操作,也同样能作用于 BigInteger 或 BigDecimal 。
只不过必须
以方法调用方式取代运算
符来实现。
*** BigInteger该类支持任何精度的整数。也就是说,在运算中,可以准确地表示
任何大小的整数值,而不 会丢失任何信息
*** BigDecimal支持任何精度的定点数,例如,可以用它进行精确的货币计算。
》》Java 中的数组:
****Java 确保数组会被初始化,而且不能在它的范围之外被访问。这种范围检查,
是以每个数组上少量的内存开销及运行时的下标检查为代价的。但由此换来的是
安全性和效率的提高,因此付出的代价是值得的(并且Java有时可以优化这些操
作)。
**** 当创建一个数组对象时,
实际上就是创建了一个引用数组,并且每个引用都
会自动被初始化为一个特定值,该值拥有自己的关键字 null 。一旦 java 看到
null ,就知道这个引用还没有指向某个对象。在使用任何引用前,必须为其指定
一个对象;如果试图使用一个还是 null 的引用,在运行时将会报错。
**** 还可以创建用来存放基本数据类型的数组。同样,编译器也能确保这种数组的
初始化,因为它会将这种数据所占的内存全部置为 零。
----------------------永远不需要销毁对象
》》作用域:
**** 作用域决定了在其内定义的变量名的可见性和生命周期。
**** 在作用域里定义的变量只可用于作用域结束之前。
**** 任何位于“//” 之后到行末的文字都是注释。
》》对象的作用域:
**** java 对象不具备和基本类型一样的生命周期。当用
new 创建一个 java 对象
时,它可以存活于作用域之外。
**** 由 new 创建的对象,只要你需要,就会一直保留下去。
****
java 有一个垃圾回收器,用来监视用 new 创建的所有对象,并辨别那些不会
再被利用的对象。随后,释放这些对象的内存空间,以便供其他新的对象使用。
也就是说,你根本不必担心内存回收的问题。你只需要创建对象,一旦不再需
要,它们就会自行消失。这样做就消除了这类编程问题(即“
内存泄露”),这是
由于程序员忘记释放内存而产生的问题。
------------------------创建新的数据类型:类
****
class 关键字
》》字段和方法:
**** 字段可以是任何类型的对象,可以通过其引用与其进行通信;也可以是基本类型的
一种。
如果字段是某个对象的引用,那么必须初始化该引用,以便使其与一个实际的对象
(new 创建的)相关联。
**** 每个对象都有用来存储其字段的空间;普通字段不能在对象间共享。
****可以给字段赋值,具体的实现为:对象的引用. 对象内部的成员名称
**** 若类的某个成员是基本数据类型,即使没有进行初始化,java 也会确保它获得一个
默认值。但是,这些初始值对你的程序来说,可能是不正确的,甚至是不合法的,
所以最好明确地对变量进行初始化。
**** 基本数据类型的变量,是类的成员时,java才会确保给定其默认值;
如果基本数据类型的变量是在
局部(某个方法内部)中时,必须要给定其初始值,
否则在 编译时会返回一个错误。
----------------------方法、参数和返回值
**** Java 的方法决定了一个对象能够接收什么样的消息。方法的基本组成部分包括:
名称、参数、返回值和方法体。
****
方法名和
参数列表唯一地标识出某个方法。
****Java 中的方法只能作为类的一部分来创建。方法只有通过对象才能被调用,且这个
对象必须能执行这个方法调用。
通过对象来调用方法的具体实现:对象名.方法名(参数)
**** 调用方法的行为通常被称为:
发送消息给对象。
》》参数列表:
**** 方法的参数列表指定要传递给方法什么样的信息。
**** 在参数列表中必须指定每个所传递对象的类型及名字。像 Java 中任何传递对象的场合
一样,这里传递的实际上也是引用,并且引用的类型必须正确。
****return 关键字:
包括两方面,首先,它代表“已经做玩完,离开此方法”;其次,如果此方法产生一个值,
这个值要放在 return 语句后面。
**** 若返回类型是 void ,return 关键字的作用只是用来退出方法。因此,没有必要到方法结束
时才离开,可在任何地方返回。但如果返回类型不是 void ,那么无论在何处返回,编译器
都会强制返回一个正确类型的返回值。