.栈和堆
(1) 局部变量(方法变量)驻留在栈上
(2) 对象和它的实例变量驻留在堆上
2. 字面量和基本强制转换
(1) 整形字面值可以是十进制、八进制(如:013)或十六进制(如:0x3d)
(2) Long字面量以L或l结尾
(3) float字面量以F或f结尾,double字面量以数字、D或d结尾
(4) boolean字面量为true或false
(5) char字面量是单引号内的单个字符,如:’d’
3. 作用域
(1) 作用域指变量的生存期
(2) 有4种作用域:a.只要静态变量的类存在,静态变量就存在b.只要实例变量的对象存在,实例变量就存在c.只要局部变量的方法在栈上,局部变量就存在。但,如果它的方法调用了另一个方法,它就会临时变的不可用d.块变量(如:在for或if块中的变量)会存在到块完成为止
4.基本赋值
(1) 字面整数隐含为int
(2) 整数表达式总是会导致一个int大小的结果,而永远不会导致更小的结果
(3) 浮点数隐含为double(64位)
(4) 收缩基本类型会截去高阶位
(5) 组合赋值(如:+=)执行自动强制转换
(6) 引用变量保持用于引用对象的位
(7) 引用变量可以引用所声明类型的子类,但不能引用其父类
(8) 当创建一个新对象时(如:Button b = new Button();)会发生3件事情:A.建立一个名为b的Button类型的引用变量B.创建一个新的Button对象C.将Button对象赋予引用变量b
5.使用未初始化和未赋值的变量或数组元素
(1) 当实例化一个对象数组时,该数组内的对象不会被自动实例化,但所有引用都会得到默认值null
(2) 当实例化基本类型的数组时,元素会得到它们的默认值
(3) 实例变量总是用一个默认值进行初始化
(4) 局部/自动/方法变量从不会被赋予默认值。如果试图在初始化它之前使用,则将得到编译器错误。
6. 向方法传递变量
(1) 方法能够使用基本值和/或对象引用作为变元
(2) 方法变元总是一个副本
(3) 方法变元永远不是实际的对象(它们是对象的引用)
(4) 基本值变元是与原始基本值完全分离的副本
(5) 引用变元是指向原始对象的引用的另一个副本
(6) 当两个具有不同作用域的变量共享相同的名称时,就会出现隐藏。(Notice:考题多)
7. 数组声明、构建和初始化
(1) 数组能够保存基本类型或对象类型,但数组本身就是对象
(2) 当声明数组时,方括号可以位于数组名称的左边或右边
(3) 在声明中包含数组大小永远是不合法的
(4) 当(使用new)构建数组时,必须包含其大小,除非是在创建匿名数组
(5) 对象数组中的元素不会被自动创建,尽管基本数组元素会被赋予一个默认值
(6) 若试图使用对象数组中的数组元素,而改元素没有引用一个真正的对象,则会得到NullPointerException异常
(7) 数组索引从0开始
(8) 如果使用了错误的索引值,则会得到ArrayIndexOutOfBoundsException异常
(9) 数组具有一个length变量,其值是数组中的元素的个数(int a[] = {1,2,3};int len = a.length;)
(10) 可以访问的最后一个索引值总是比其长度值小1
(11) 多维数组就是数组的数组
(12) 多维数组中的维数可以有不同的大小
(13) 基本数组可以接受能够被隐式提升为数组声明类型的任何值。如:byte变量能够放入一个int数组中
(14) 对象数组能够持有通过了该数组声明类型IS-A测试(或者instanceof测试)的任何对象。如:若Horse扩展Animal,那么Horse对象就能够放入Animal数组中
(15) 当将一个数组赋予以前声明的数组引用时,正在赋值的数组必须与被赋值的引用具有相同的维数
(16) 可以将一种类型的数组赋值给以前声明的其父类型的数组引用
8. 初始化块
(1) 首次加载类时,会运行一次静态初始化块
(2) 每当创建一个新的类实例时,都会运行实例初始化块。它们的运行发生在所有父构造函数之后,构造函数的代码运行之前
(3) 若一个类中存在多个初始化块,它们会遵循上述规则,且它们的运行顺序与它们在源文件中出现的顺序相同
9. 使用包装器
(1) 包装器类与基本类型相关
(2) 包装器具有两个主要功能:A.包装基本类型,使它们能够像对象一个被处理B.为基本类型提供实用工具方法(通常是转换)
(3) 3个最重要的方法种类是:A.xxxValue(),不带任何变元,返回基本类型B.parseXxx(),带String变元,返回基本类型。若失败,会抛出NumberFormatException异常
(4) valueOf(),带String变元,返回包装的对象。若失败,会抛出NumberFormatException异常
(5) 除了Character只能带char变元外,包装器构造函数能够带String或基本类型的变元
(6) 如果指定基数,则通常表示10以为的基数,八进制的基数为8,十六进制的基数是16
10.装箱
(1) 从JAVA5起,装箱允许在基本类型和包装器间自动装换
(2) 结合使用==与包装器的装箱是有技巧性的,具有相同的较小值(通常小于127)的包装器将是==,具有较大值则不是==
11. 高级重载
(1) 基本值的加宽使用可能的”最小”方法变元
(2) 当分别使用时,装箱与var-arg都与重载兼容
(3) 不能从一种包装类型加宽到另一种包装类型(IS-A测试失败)
(4) 不能先加宽,后装箱(int不能变成Long)
(5) 可以先装箱,后加宽(int可以通过Integer变成Object)
(6) 可以组合使用var-arg与加宽或装箱
12.垃圾收集
(1) 在Java中,垃圾收集(GC)提供自动内存管理
(2) GC的目标是查找和删除不可到达的对象
(3) 只有JVM才能决定什么时候运行垃圾收集器,你只能建议它运行
(4) 无法确切知道GC算法
(5) 在对象能够进行垃圾收集之前,它必须是符合条件的
(6) 当没有任何活线程能够到达对象时,该对象就符合垃圾收集条件
(7) 要到达对象,必须有一个指向该对象的活的、可到达的引用
(8) Java应用程序能够耗尽内存
(9) 隔离岛能够被垃圾收集,即使它们相互引也能如此
(10) 应使用System.gc()方法请求垃圾收集(只对SCJP6以前的版本才如此)
(11) Object类具有finalize()方法
(12) 在垃圾收集器删除对象之前,可以保证finalize()方法运行一次,并且只运行一次
(13) 因为垃圾收集器不会做出任何保证,所以finalize()方法可能从不运行
(14) 在finalize()方法内可以让对象不符合垃圾收集条件