前言
以前一直不敢读Java编程思想这本书,第一个原因是因为从别人口中听来这是一本进阶的书,我感觉自己的水平还达不到,第二个是因为这本书太厚了,且不说七八百页,每页密密麻麻的字就让人望而却步。现如今尝试一下拜读此书,希望自己能获取什么。
该系列博客仅为个人读书笔记,所以只是为了给自己看的,想着我的网站也没多少人会看,可能网站没备案导致搜索引擎搜不到,而最重要的是自己的文章只是泛泛而谈,精华确实很少,所以准备再花一段时间提升自己然后转战到类似掘金,简书等站点。
一些乱七八糟的总结
当使用父类作为多态的时候,应充分考虑抽象性
因为如果将子类 向上转型 为基类的话,那么子类很多拓展的功能是不能使用的。例如:
1 | public void skin(Fruit fruit) { |
这个时候应该考虑到,我们操作的是水果,我们中能调用水果中的方法而不能调用子类如苹果扩展出来的新方法。
Java要确定每种 基本类型 所占存储空间的大小
因为他们的大小不像其他语言一样随着硬件架构的变化而变化。
可以使用 BigInteger 或 BigDecimal 来实现高精度。
计算机的二进制会产生精度误差,使用这两个可以避免,但是效率会低。
Java 中没有作用域隐藏
1 | { |
上述代码在 java 中是非法的编译器会告诉你 x 已经定义,而 C++ 中可以,因为它会把外面的隐藏。
方法和参数列表合起来被称为 方法签名 它们唯一标识着某个方法。
main 函数中的 String[] args代表命令行参数,就比如JVM,Tomcat等启动命令附带的参数。
equals() 方法默认行为是比较引用
Java 允许我们把任何基本数据类型转换成别的基本数据类型,但布尔型除外
如果int 和 long相乘得到的结果会变为long,也就是会往 最大的数据类型 转换。
如果两个较大的基本数据类型相加如 int ,其结果可能会溢出。
在循环外可以定义标签来解决多层循环嵌套无法跳出的情况。
1 | outer: |
对象可能不被垃圾回收,垃圾回收不等于 C++ 中的析构。
不要使用finalize() 作为通用的清理方法。
之所以有finalize 是因为给对象分配内存的时候可能采用的不是new 而是使用c或c++的方式,而释放他们需要使用free类似函数,所以需要在finalize中用本地方法调用它。
new可以被看作 static 方法,比如
1 | public class Initialization { |
总结一下对象的创建过程:
即使没有显示地使用 static 关键字,构造器也是静态方法。因此当首次类型为Dog的对象的时候,或者Dog的静态方法/静态域首次被访问时,java解释器必须查找类路径,以定位Dog.class文件。
然后载入Dog.class(创建一个Class对象) 有关静态初始化的所有动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。
当用 new Dog() 创建爱你对象的时候,首先将在堆上为Dog对象分配足够的存储空间。
这块存储空间会被清零,这就自动将Dog对象中的所有基本类型数据都设置成了默认值,而引用被设置成了null。
执行所有出现于字段定义处的初始化动作。
执行构造器。
静态块代码只有在首次生成这个类的一个对象时,或者首次访问属于那个类的 静态数据成员时会执行,如果没有则不执行。
实例化子句会在构造器执行之前执行,而且每次都会执行。
1 | public class Cat { |
可变参数其实传进去的就是一个数组,尽量少使用可变参数,因为可变参数会产生冲突,可以给产生冲突的方法都加上可变参数,但不一定解决。
switch语句和enum搭配一起使用特别实用。