用引用操纵对象
Sting s;
这里所创建的只是引用 并不是对象
创建一个引用的同时便进行初始化
String s = “asdf”;
字符串可以用带引号的文本初始化
必须由你创建所有对象
String s = new String(“asdf”);
new关键字的意思是 给我一个新对象
它不仅表示 给我一个新的字符串 而且通过提供一个初始字符串 给出了怎样产生这个String的信息
存储到什么地方
- 寄存器 这是最快的存储区 因为它位于不同于其他存储区的地方——处理器内部 但是寄存器的数量极其有限 所以寄存器根据需求进行分配 你不能直接控制 也不能在程序中感觉到寄存器存在的任何迹象(另一方面 C和C++允许您向编译器建议寄存器的分配方式)
- 堆栈 位于通用RAM(随机访问存储器)中 但通过堆栈指针可以从处理器那里获得直接支持 堆栈指针若向下移动 则分配新的内存 若向上移动 则释放那些内存 这是一种快速有效的分配存储方法 仅次于寄存器 创建程序时 Java系统必须知道存储在堆栈内所有项的确切生命周期 以便上下移动堆栈指针 这一约束限制了程序的灵活性 所以虽然某些Java数据存储于堆栈中——特别是对象引用 但是Java对象并不存储于其中
- 堆 一种通用的内存池(也位于RAM区) 用于存放所有的Java对象 堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间 因此 在堆里分配存储有很大的灵活性 当需要一个对象时 只需用new写一行简单的代码 当执行这行代码时 会自动在堆里进行存储分配 当然 为这种灵活性必须要付出相应的代价:用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间(如果确实可以在Java中像在C++中一样在栈中创建对象)
- 常量存储 常量值通常直接存放在程序代码内部 这样做是安全的 因为它们永远不会被改变 有时 在嵌入式系统中 常量本身会和其他部分隔离开 所以在这种情况下 可以选择将其存放在ROM(只读存储器)中
- 非RAM存储 如果数据完全存活于程序之外 那么它可以不受程序的任何控制 在程序没有运行时也可以存在 其中两个基本的例子是流对象和持久化对象 在流对象中 对象转化成字节流 通常被发送给另一台机器 在 持久化对象 中 对象被存放于磁盘上 因此 即使程序终止 它们仍可以保持自己的状态 这种存储方式的技巧在于:把对象转化成可以存放在其他媒介上的事物 在需要时 可恢复成常规的 基于RAM的对象 Java提供了对轻量级持久化的支持 而诸如JDBC和Hibernate这样的机制提供了更加复杂的对在数据库中存储和读取对象信息的支持
特例:基本类型
不用new来创建变量 而是创建一个并非是引用的 自动 变量 这个变量直接存储 值 并置于堆栈中 因此更加高效
高精度数字
BigInteger和BigDecimal没有对应的基本类型 运算速度会比较慢 以速度换取了精度 可以用它进行精确的货币计算
Java中的数组
当创建一个数组对象时 实际上就是创建了一个引用数组 并且每个引用都会自动被初始化为一个特定值 该值拥有自己的关键字null 一旦Java看到null 就知道这个引用还没有指向某个对象 在使用任何引用前 必须为其指定一个对象 如果试图使用一个还是null的引用 在运行时将会报错
还可以创建用来存放基本数据类型的数组 同样 编译器也能确保这种数组的初始化 因为它会将这种数组所占的内存全部置零
永远不需要销毁对象
作用域
作用域由花括号的位置决定
在作用域里定义的变量只可用于作用域结束之前
以下代码在C和C++中是合法的 但是在Java中却不能这样书写
对象的作用域
Java对象不具备和基本类型一样的生命周期 当用new创建一个Java对象时 它可以存活于作用域之外
引用s在作用域终点就消失了 然而 s指向的String对象仍继续占据内存空间 在这一小段代码中 我们无法在这个作用域之后访问这个对象 因为对它唯一的引用已超出了作用域的范围
创建新的数据类型:类
字段和方法
字段可以是任何类型的对象 可以通过其引用与其进行通信 也可以是基本类型中的一种 如果字段是对某个对象的引用那么必须初始化该引用 以便使其与一个实际的对象相关联
基本成员默认值
当变量作为类的成员使用时 Java才确保给定其默认值 以确保那些是基本类型的成员变量得到初始化(C++没有此功能) 防止产生程序错误
局部变量不会被自动初始化为零 在使用时应先对其赋一个适当的值
方法 参数和返回值
方法的基本组成部分包括:名称 参数 返回值和方法体
方法名和参数列表(它们合起来被称为 方法签名)唯一地标识出某个方法
参数列表
在参数列表中传递的实际上是对象的引用 基本类型例外
构建一个Java程序
static关键字
当声明一个事物是static时 就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起 所以 即使从未创建某个类的任何对象 也可以调用其static方法或访问其static域
即使创建了两个StaticTest对象 StaticTest.i也只有一份存储空间 这两个对象共享同一个i
使用类名是引用static变量的首选方式
static方法的一个重要用法就是在不创建任何对象的前提下就可以调用它