Think in java 学习手记(一)

来源:互联网 发布:老友记 英语 知乎 编辑:程序博客网 时间:2024/05/01 06:53
Chap 2 万物皆对象
1、数据存储
       数据有六个存储位置:
1)寄存器registers。
2)栈Stack:位于常规内存区。Primitive变量、对象指针(refrence)就存在这里。
3)堆heap:所有对象数据。
4)静态存储:
5)固定存储:
6)非内存存储:如persistent Object 与 streamed Object。
2、primitive类型
       简单数据类型,为加快速度一般存在stack区中。注意:
       class a{
              int i;   //I默认为0,即类数据成员有默认值
              a(){
                     int j; //出错,即方法数据成员没有默认值。
              }
       }
      
3、关于变量生存期/作用域
       这段代码在C/C++中正确,但在java中不正确:
       a(){
              int x=1;
              {
                     int x=1; //出错啦!
              }
       }
 
chap 3 控制流程
1、随机数
Random类,包含在java.util包中。其nextInt(int I)方法返回[0~I)之间的随机数,其余nextFloat等方法亦然。
Math.random():静态方法,生成[0,1]之间的随机数。结果是一个double。
2、关于==与!=
要理解对于非primitive类型的对象,默认的比较操作是比较reference。一般而言可以用equals方法来实现希望进行的操作,但对自定义对象,必须自定义equals方法,因其默认比较reference.
3、方法调用:不能在静态方法中调用非静态方法。想想道理吧。
4、逻辑表达式的短接
t1 && t2 && t3这个表达式,当t1 = true;t2 = false时,t3就不再执行。可以利用这一点写出较简洁的代码来。
5、关于switch
只能对int和char进行多路选择。
6、类型转换
所有float和double转成int后,直接截去小数。例如5.9转成5.
 
Chap 4 初始化与清理
1、在构造函数里使用构造函数
       这种情况较少见。例如:
       Class A{
              Private int I;
              Private String ss = new String(“null”);
              A(){
                     This( 3, “bbb”);
              }
              A(int I, String str){
                     This.i = I;
                     Ss = str;
              }
       }
但是注意,不能连续引用两次构造函数,并且只能出现在第一行。例如this(i);this(ss);是不对的。
2、再说static
       static严格上来说,由于不需要类实例化就可以调用,不是OOP的方法。类似于全局函数。如果程序中出现多次static,就得怀疑是否需要改进程序了。
       有时,程序中会用到static块。它主要为匿名内部类提供支持。
3、理解garbage Collection (gc,垃圾收集器)
       1)在收集前,要先执行finalize()。
       2)在绝大多数情况下,程序员不需要考虑垃圾清理问题。
       3)垃圾清理的机理较复杂,幸好都是在后台自动进行的,但对系统运行速度会有一定影响。
       4)垃圾回收通常是在内存不足时才发生,所以你不知道什么时候执行回收。
4、构造函数与成员变量的初始化顺序问题
public class StackTest {
 
       /**
        * @param args
        */
       private Tag ii = new Tag( 1 );
       StackTest(){
              Tag jj = new Tag( 2 );
       }
       private Tag kk = new Tag( 3 );
       public static void main(String[] args) {
              new StackTest();          
       }
 
}
 
class Tag{
       Tag( int i ){
              System.out.println( "Tag(" + i + ")");
       }
}
输出:Tag(1) Tag(3) Tag(2)
上面这段函数很清晰地标示出:当新建一个对象时,先初始化成员变量,再初始化构造函数。
这样做显然是很有道理的,因为构造函数可能会引用成员变量。
原创粉丝点击