Java基础恶补——Assignments

[SCJP Sun Certified Programmer for Java 6 Study Guide (Exam 310-065)]  chapter3

 

一. 栈和堆
1. 本地变量(方法变量)存于栈中;对象和实例的变量存于堆中。

 

二. Literals and Primitive Casting

1. 整型可以是10进制、8进制、或16进制。

2. 长整型以L或l结尾。

3. 浮点型以F或f结尾,双精度浮点型以D或d结尾。

4. boolean值是true或false。

5. chars值以单引号+单个字符表示。

 

三. Scope

1. Scope指的是1个变量的生命周期。

2. 有4种基本作用域:

1) Static 变量与它所在的类的生命周期一样长;

2) 实例变量与它所在的对象的生命周期一样长;

3) 本地变量与它所在的方法的生命周期一样长,如果该方法被另一个方法所调用,则本地变量已不可被访问;

4) Block变量的作用范围在它所在的块中。

 

四. Basic Assignments

1. Literal integers are implicitly ints.

2. Integer 表达式总是得到1个int-sized的结果,从不会变小。

3. Floating-point numbers are implicitly doubles (64 bits).

4. Narrowing a primitive truncates the high order bits.

5. Compound assignments (e.g. +=), perform an automatic cast.

6. A reference variable holds the bits that are used to refer to an object.

7. 1个引用变量可以指向所声明类型的子类型对象。

8. 当new1个对象(如Button b = new Button();)时,发生以下3件事:

1) 生成1个名为b、类型为Button的引用变量;

2) 创建1个Button类型的对象;

3) 分配这个Button对象给引用变量b。

 

五. 使用未初始化和未分配的1个变量或数组元素

1. 当1个对象数组实例化时,数组里的对象并不会自动实例化,而是自动默认值null。

2. 当1个原子类型数组实例化时,数组里的元素将自动默认值。

3. 实例变量初始化时永远会被赋以默认值。

4. Local/automatic/method 变量不会被赋以默认值。如果试图在初始化前使用它们,会有编译错误。

 

六. 向方法传递变量

1. 方法的参数可以是原子类型或对象引用。

2. 方法参数永远是copies.

3. 方法参数从来都不是实际的对象(只是对象的引用)。

4. 1个原子类型的参数是原始原子类型的unattached copy.

5. 1个引用类型的参数是原始对象引用的另一个copy.

6. Shadowing 发生在2个不同scope的变量具有相同的名称时。这将引起hard-to-find bugs 和 hard-to-answer exam questions.

 

七. 数组声明、构造、实例化

1. 数组可以存放原子类型或对象,数组本身是1个对象。

2. 声明1个数组时,[]可以在名称的左边或右边。

3. 声明1个数组时包含数组大小是不合法的。

4. 构造1个数组对象时必须指定数组大小,除非创建的是匿名数组。

5. 数组中的元素不会被自动创建,即使原子类型的元素会被赋以默认值。

6. 试图使用1个未指向任何实际对象的数组元素时,将引发 NullPointerException.

7. 数组有1个length变量,用于表示数组的元素个数。

8. 数组索引从0开始;当使用bad索引时,将引发 ArrayIndexOutOfBoundsException, 所能访问的最大索引总是=length-1.

9. 多维数组是存放数组的数组。

10. The dimensions in a multidimensional array can have different lengths.

11. 1个原子类型的数组可以接受任何可以转化为声明类型的值,如int数组可以接受byte值。

12. 1个对象类型的数组可以接受声明类型的子类型对象。

13. If you assign an array to a previously declared array reference, the array you're
assigning must be the same dimension as the reference you're assigning it to.

14. You can assign an array of one type to a previously declared array reference of
one of its supertypes.

 

八. 初始化块

1. 静态初始化块在类首次加载时执行1次。

2. 实例初始化块在每个实例创建时执行,在所有该类的所有父类构造函数执行之后、该类的构造函数执行之前执行。

3. 如果存在多个初始化块,则按代码的编写顺序执行。

 

九. 使用包装类

1. 包装类关联原子类型。

2. 包装类有2个作用:

1) 包装原子类型,使它们可以被作为对象进行处理;

2) 提供对原子类型有用(如类型转换)的方法。

3. 3个最重要的方法:

1) xxxValue() 没有参数,返回原子类型;

2) parseXxx() 接受String类型,返回原子类型,throws NFE;

3) valueOf() 接受String类型,返回包装类型,throws NFE;

4. 包装类的构造函数可以接受String类型或原子类型(Character除外,它只能接受char)。

5. Radix refers to bases (typically) other than 10; octal is radix = 8, hex = 16.

 

十. Boxing

1. 从Java5开始,boxing允许原子类型和包装类型之间的自动转换。

2. Using == with wrappers created through boxing is tricky; those with the same
small values (typically lower than 127), will be ==, larger values will not be ==.

 

十一. Advanced Overloading

1. Primitive widening uses the "smallest" method argument possible.

2. Used individually, boxing and var-args are compatible with overloading.

3. You CANNOT widen from one wrapper type to another. (IS-A fails.)

4. You CANNOT widen and then box. (An int can't become a Long.)

5. You can box and then widen. (An int can become an Object, via an Integer.)

6. You can combine var-args with either widening or boxing.

 

十二. 垃圾回收

1. Java中,GC提供自动内存管理。

2. GC的目的是删除不可达的对象。

3. 只有JVM决定什么时候运行GC。

4. GC的算法很难被确切知道。

5. 符合条件的对象才会被垃圾回收,这个条件是指1个对象已经没有被任何live thread所使用。

6. To reach an object, you must have a live, reachable reference to that object.

7. Java applications can run out of memory.

8. Islands of objects can be GCed, even though they refer to each other.

9. Request garbage collection with System.gc(); (only before the SCJP 6).

10. Object类有1个finalize()方法,finalize()方法在垃圾回收之前执行,只会执行1次。

11. The garbage collector makes no guarantees, finalize() may never run.

12. You can uneligibilize an object for GC from within finalize().

 

你可能感兴趣的:(java基础)