[Thinking in JAVA] 前N章的一些小知识

记录下自己之前不太清楚或者已经忘记的知识。



(有误,protected 与private的区别不仅在于继承的累,还在于同包的类!)


protected可以在类本身、同包的子类,不同包的子类,同包的非子类 被访问
缺省的:可以在类本身,同包的子类,同包的非子类 被访问。










1.boolean类型所占存储空间的大小没有明确指定,仅定义为能够取字面值true or false.

   JAVA中没有bool类型。

   除此之外java中所有基本类型所占存储空间的大小是不变的,这种不变性是JAVA更高可移植性的原因之一。

   char 16 bit

   byte  8

   short 16

   int    32

   long  64

   float  32    

   double  64

   尤其要注意float的32位是怎么表示数据的值的。    

   float:
  1bit(符号位) 8bits(指数位) 23bits(尾数位)
  double:
  1bit(符号位) 11bits(指数位) 52bits(尾数位)
  指数位是按补码的形式来划分的。(顺带回忆下补码原码的转换:  补码是在原码的基础上取反+1)


2.BigInteger支持任意精度的整数,可以准确表示任何大小的整数而不丢失任何信息。

   BigDecimal支持任何精度的定点数,可以用来进行精确的货币计算。


3.main函数的参数args用来存储命令行参数


4. |和||,&和&&

     |和&不短路,进行所有的判断。  如果是进行位运算,返回的是数值, 布尔运算是返回true/false。


5.<<  >>   >>>

    <<低位补0,>>若符号为正高位补0,为负补1, >>>无论正负都补0


6.对象调用方法时会把自己的引用作为第一个参数传过去。


7.JAVA中的垃圾回收装置

    判断对象是否还存活的算法(两种,优缺点),回收的方法(优缺点)

   书上说的挺清楚,有篇博客也不错。http://blog.csdn.net/stypace/article/details/41441389


8.构造器初始化的顺序

    参考http://blog.csdn.net/mad1989/article/details/20793539

    1,首先会执行类中static代码块(不管代码块是否在类的开头还是末尾处),如果这个类有父类,同样会优先查找父类中的static代码块,然后是当前类的static。

     2,然后会从父类的第一行开始执行,直至代码末尾处,中间不管是有赋值还是method调用,都会按顺序一一执行(method),普通代码块{ }...

     3,其次才是父类的构造函数,执行带参数或不带参数的构造函数,依赖于实例化的类的构造函数有没有super父类的带参或不带参的构造函数,上边试验二三已经证明。

     4,然后会从子类(当前类)的第一行开始执行,直至代码末尾处,中间不管是有赋值还是method调用,都会按顺序一一执行(method),普通代码块{ }... 

     5,其次会是子类(当前类)的构造函数,按顺序执行。

     6,最后是类方法的调用执行,如果子类覆盖了父类的method,执行时会先执行子类覆盖的method,method内如果有super.method(),才会调用父类的同名method,否则不会。



9.可变参数

   如String...strings传进来的是strings[]


10.向上转型

     调用 需要父类对象作为参数的方法 时传递子类对象,  那个方法里会把子类对象的引用转换为父类对象的引用,成为向上转型。

    

11.使用final关键字

     数据、方法、类


     数据:  

              static+final: 编译时常量,编译器把值代入用到的计算式中,在编译时执行计算式,减轻运行时负担。这类常量必须是基本数据类型,定义时要赋值。

              对对象使用final时,使引用恒定不变,该引用不能被指向别的对象。但对象值可以被修改。数组也同样适用,数组也是对象。

              如果在定义时没有赋值,要在类的所有构造函数中有赋值语句。

              final参数则在方法中不能改变。

    方法:

             防止子类覆盖

            给private方法加final并没有实际意义,因为private方法本身就不能被子类覆盖。

    类: 防止被继承


12. 类的加载发生在创建类的第一个对象时,或者是访问static域/调用static方法时。定义为static的东西只能被初始化一次。



13.finalize方法

     一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

    但finalize()方法并不等于C++中的析构函数,不该将finalize()作为通用的清理方法。垃圾回收只与内存有关。使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。

    之所以要有finalize(),是因为在分配内存时可能采用了类似C语言中的做法,而非JAVA中的通常做法,这种情况主要发生在使用本地方法的情况下。(native 方法)

    如果JVM并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。而且绝对不能直接调用finalize()。 (这个我不明白为什么,对于finalize以后还要更深入的去研究)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值