1. 用句柄操作对象
句柄,也做“引用”,例:
String s = new String("a");
s 即称为句柄,通过 s 来操作 new 出来的对象。
2. 对象的创建
(1) 特殊情况—基本数据类型
基本数据类型,书中也称作主(主要)数据类型,有以下几种:
boolean, char, byte, short, int, long, float, double
基本数据类型有各自对应的封装类。
注:BigInteger 和 BigDecimal 可以划分为封装类,但没有对应的基本数据类型。它们精度高,但是使用需要调用方法,不能直接使用运算符,并且消耗的内存较高。
(2) 存储位置
- 寄存器
由于位于处理器内部,最快的保存区域,但是寄存器的数量十分有限。
- 堆栈
位于 RAM(随机访问存储区域),存取速度仅次于寄存器。 - 堆
同样位于 RAM 中,其中保存了 Java 对象(new 出的对象),在堆内分配内存会花费较长的时间。 - 静态存储
静态指固定的存储位置(RAM 中)。在程序的运行期间,随时等待被调用。 - 常量存储
通常置于程序内部,因为是不可变的。有时候为了保护,可考虑置于只读存储器中。 - 外部存储
位于程序之外,就算程序没有运行或者被移除,外部存储依然不受影响。
3. 对象的销毁
(1) 作用域
如下面代码:
{
String s;
}
//unreached s
注:Java 中已有的全局变量命名,不可在局部变量中再次用该名称命名。
(2) 对象的销毁
{
String s = new String("a");
}
当出来作用域时,句柄 s 已经被销毁,new 的对象存放在堆中,在 Java 中被垃圾收集器来回收,查找已经 new 的对象,看哪些不再被引用就回收。
4. 新建数据类型—类
类,包含字段和方法。字段又称为数据成员(属性),方法又称为成员函数。
(1) 字段
字段可以是对象,也可以是基本数据类型。
字段有默认值,如果是对象,则默认 null,如果是基本数据类型,默认值如下:
boolean : false
char : '\u0000' (null)
byte : (byte)0
short : (short)0
int : 0
long : 0L
float : 0.0f
double : 0.0d
注:局部变量没有固定的默认值,会随机一个值。
(2) 方法
类的方法包含:返回值,方法名,自变量(参数),方法体。
这里面值得一提的是自变量,自变量如果不是基本数据类型,则传递的是句柄,指向对象的句柄,改变自变量的指向并不会改变原本数据 的变化,如以下代码:
void change(String s) {
s = new String("b");
}
在 main 函数中一段代码:
String s = new String("a");
change(s);
System.out.println(s);
此时输出的是 a,原因就是上述所说,change 方法中的 s 是新的句柄指向了 main 中的 s 指向的对象。
5. 构建 Java 程序
(1) 使用其它组件
Java 中使用其它库的文件如以下格式:
import java.util.Vector;
或者:
import java.util.*;
后者省去多次导包的麻烦。
注:Java 本身已经引入一个默认的 java.lang 包
(2) 使用 static 关键字
首先来说明 static 关键字修饰的存放在静态存储区,下面用代码来说i明:
class Test {
static int i = 1;
}
不管有几个对象句柄引用 i 这个静态变量,句柄指向的都是同一个位置,比如:
Test t1 = new Test();
Test t2 = new Test();
t1.i++;
System.out.println(t2.i);
结果是 2,因为 t1.i 和 t2.i 引用的是同样的内存区域。
static 一般用 Test.i 这样的方法来调用,这也是 static 的一个特点,不用创建新的对象就可以直接调用。
6. 其它
(1) '+' 连接符
如下:
System.out.println(3 + 5 + "7");
输出结果是87
System.out.println("3" + 5 + 7);
输出结果是357
也就是 '+' 是自动类型转换。
(2) 注释
注释方法:
- // 这是注释
- /* 这是注释 */
(3) 编码格式
例:
class BookStore() {
}
BookStore bookStore = new BookStore();
网友评论