今天学习了thinking in java的第三四五章,下面是所有的要点:
第三章:
第三章讲的是操作符,操作符分为几种,最常见的就是赋值操作符,一般从右侧把数据传递给左边的变量。在不涉及类中数据传递时,传递的数据都存在于栈中,简单类型则传递值,引用类型则传递引用(个人感觉是数据在堆中的地址);另外函数传参也是这样,所以有时对数组和对象要慎重一些;
除了赋值操作符后,最常见的就是四则运算了。+-*/%五种操作符,有他们自己的优先级判断,再加上括号,这些都是很简单的运算;对于 n=++i 和 m=i++,他们都对i进行了+1运算,但是n的值是i+1,m的值是i;
对于random类来说,new对象时后面不提供参数则以时间为种子,每次生成不一样的随机数序列,而后面提供参数的话,每一次生成的都是一样的随机序列。用nextInt()函数生成int随机数,括号内代表随机数的范围;
按位操作符和移位操作符都不是很会用,先留个坑;
另外类型之间的转换,都是二进制位的扩展和舍弃。所以有的时候转换类型会造成值的变化,要很小心;
第四章:
控制程序流程的方式只有那几种,for、while、do-while、switch、break、continue;在java中不能使用goto语句,但可以用goto语句的标签配合break和continue来进行一波跳转;
一个for循环的变种:foreach;语法为:for( int i : sc){ print ( " number " + i ); }和python中的循环类似;这种在后面传递不定参数时很有用;
第五章:
第五章主要讲解的是类和对象初始化时的运行状态,这个很重要;
类在创建对象时用构造器(构造函数)来创建;有时可以对构造器进行重构来满足各种需求;构造器可以被其他构造器调用,但是这个构造器在代码中必须是第一个构造器,并且只能调用这一个;
this在对象的函数中可以代表该对象,在内部函数的参数和内部变量相同时可以用this来标记;
finalize()函数:在对象被消除前调用的函数,主要是进行一些毁坏前的工作,例如释放某些内存,验证该对象是否满足被释放的条件;或者是该函数调用外部代码所申请的内存,例如malloc,这样java的回收机制是不能回收这部分内存,所有我们要自己调用free函数释放;
垃圾回收的两种方式:1.标记-清扫 模式:当垃圾较少的情况下,可以直接清除;2.停止-复制 模式:这种情况下,垃圾比较多,则按照对应的引用表,把现在现存的数据移动到另一大块堆内存中整齐存放,再更新引用表,这样就可以对旧内存进行清理了;一般是两种交替使用;
在对象初始化时,若没有赋值,则它会有一个默认值,boolean为false,其他的类型全为0,引用类型为null;在类中,变量的初始化顺序是先初始化变量,再调用构造函数;
对于静态变量和静态函数,他们都只会初始化一次,不管是在创建对象时还是直接用类调用静态方法时;在需要初始化静态变量时,类中初始化数据的顺序是:静态变量/快-》普通变量/块-》构造器;
枚举类型:enum abc{1,2,3,4,5};赋值: abc x = abc.3; 可以用for(abc s : abc.values()){ print ( s + " and " s.ordinal );}其中ordinal是初始化的序号,由0开始;
对于可变参数列表,用……来实现数组长度的可变,如果再用万能类作为实参,则这个函数可以接受任何混合类型的数组;所有有的时候,由于需要进行重构,一般在开头添加一个带类型的变量,用来实现差异化完成方法重构;