java 编程思想的学习笔记 - 第二章 一切都是对象
由于这几天工作比较忙,没顾得上学习,接着第二章学习
一切皆是对象
用引用操纵对象
Java 语言的一个特性:字符串可以用带引号的文本初始化。
String s = "asdf"; 创建一个引用的同时便进行初始化。
必须由你创建所有对象
String s = new String("asdf");
存储到什么地方 (重点!)
程序运行的时候有六个不同的地方可以存储数据:1.寄存器(处理器内部),这是最快的存储区,但是数量及其有限,所以是编译器对寄存器直接进行分配的,你不能直接控制,在程序中感觉不到
2.堆栈(位于RAM即随机访问存储器), 通常使用它的"堆栈指针" 可以从处理器那获得支持,堆栈指针若向上移动则释放那些内存,若向下移动则分配新的内存,这是一种快速有效的分配内存的方法,仅次于寄存器。创建程序时,java编译器必须知道存储在堆栈内部的数据的确切大小和生命周期。因为它必须生成相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些java数据存储在堆栈中---特别是对象引用,但是java对象并不存储在其中。
3.堆 一种通用型的内存池 ,也在RAM区,用于存放所有的java对象。堆不同于堆栈的好处是:编译器不需要知道从堆里分配多少存储区域,也不必要知道存储的数据在堆里存活了多长时间。因此在堆里分配存储有很大的灵活性,当你需要创建一个对象时,直接New 写一行简单的代码,当执行这段代码时,就会自动在堆里进行存储分配。当然这种灵活性是需要付出代价的,在堆中存储对象比堆栈中存储需要花费更多的时间。
4.静态存储,这里的静态存储是指在固定的位置 (尽管也在RAM中),静态存储里存放了程序运行中一直需要的数据,可以用Static标识一个对象的特定元素是静态的,但是java对象本身不会存储在静态存储里。
5.常量存储,常量通常直接放在程序代码内部,这样做是安全的,因为他们不会改变,有时在嵌入式系统中 ,会将常量本身和其他部分隔离开,这中情况下可以将其存放在ROM(只读存储器)中特例:基本类型(primitive type)
永远不需要销毁对象
大多数过程型语言都有作用域(scope)的概念。作用域决定了在其内定义的变量名的可见
性和生命周期。在 C、C++和 Java 中,作用域由花括号的位置决定。例如:
{
int x = 12;
// Only x available
{
int q = 96;
// Both x & q available
}
// Only x available
// q “out of scope”
}
在作用域里定义的变量只可用于作用域结束之前
对象作用域(scope of object)
假如你有下面的代码:
{
String s = new String("a string");
} // End of scope
事实证明,由 new 创建的对象,只要你需要,就会一直保留下去。
如果 Java 让对象继续存在,那么靠什么才能防止这些对象填满内存空间,进而阻塞你的程序呢?这正是 C++里可能会发生的问题。则正是 Java 神奇之所在。Java 有一个“ 垃圾回收器”,用来监视用 new 创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以便供其它新的对象使用。也就是说,你根本不必担心内存回收的问题。你只需要创建对象,一旦不再需要,它们就会自行消失。这样做就消除了这类编程问题:即所谓的“内存溢出”,即由于程序员忘记释放内存而产生的问题。
创建新的数据类型:类 class
域(field 变量吧)和方法(method)
每个对象都有用来存储它的域的空间;域不能在对象间共享,下面是一个具有某些域的类:
class DataOnly {
int i;
float f;
boolean b;
}