《Java编程思想》阅读笔记

Posted by Haiming on November 8, 2020

第一章 对象导论

Java之中的单根继承和C++之中的多重继承相比之下好在哪?

其简单的讲。如果一个类型既有父类1又有父类2,那么如果父类1和父类2都有一样名字的方法,但是实现不同,则会出现冲突。

并且在这种基础上,其interface和abstract class又进行了进一步的简化,interface之中不允许有任何的实现,然而abstract class允许,那么这种情况下就可以把一些公共的方法在abstract class之中实现,然后让具体的类继承这个abstract class.

第二章 一切都是对象

2.7 你的第一个Java程序

在我们写System.out.println的时候,实际上拆开,System是在java.lang下面的一个类,而out 是这个类之中的一个静态变量,其类型是PrintStream。最后的println()则是PrintStream之中的一个方法

第三章 操作符

3.17 操作符小结

在Java之中,实际上char也会做算术运算。而且因为char是16位,所以可以直接搞Unicode。比如:

public class charCalculation {
    public static void main(String[] args) {
        char x = 'ᾤ';
        char y = 'ᾤ';
        char res = (char)(x * y);
        System.out.println(res);
    }
}

结果为:

image-20201212175506632

为什么是8464呢?因为JVM之中规定的char就是16位,所以是(8100*8100)%(2^16),也就是(8100*8100)%65536,最后就是8464.

第四章 控制执行流程

4.8 Switch

此处书中已经过时,现在float的确还是不能作为switch的值,但是实际上String已经可以了:

image-20201214204937182

第五章 初始化与清理

5.1 用构造器确保初始化

构造器本身并不返回任何值,返回值的是相应的new()表达式

为什么要有重载?

在c之中,要求为每一个方法都提供一个独立的标识符,这就意味着如果println()用于字符串之后,就不可以再用于表示数字。

  1. 这样做的不好之处在于其如果类型很多,那么需要为每一个类型扩展一个方法。
  2. 另外在Java之中,构造器的名字必须和类名相同,这就意味着想使用多种参数来构造一个对象的时候,其必须使具有不同参数的构造器同时存在,因此就必须用到方法重载。

5.5 清理:终结处理和垃圾回收

finalize()只是在gc 的过程之中被调用,和“内存释放”这个动作并没有必然的关联。

5.7.2 静态数据的初始化

一个类可能没有静态方法吗?

实际上是不可能的,因为一个类的 constructor 一定是静态方法(这个一定是依附于类,而不是依附于某个对象的),所以其一定具有静态方法。

一个具有静态对象的类的初始化

  1. 首先会查找类的路径,并且加载对应的 .class 文件
  2. 载入 .class ,先将其内部的所有静态属性和对象加载完成,这一步只会在载入 .class 文件的过程之中执行,所以静态初始化只会在这里执行一次。
  3. 为这个对象在堆上分配空间
  4. 这块分配的存储空间将会被清空,这一步是直接将对象上面的所有属性置为0,将所有对象引用置为 null的过程。
  5. 执行所有的出现在字段定义地方的初始化操作
  6. 执行 constructor。这里会执行很多动作,尤其是在继承的时候。

第六章 访问权限控制

Java包的命名规则全部使用小写字母,中间的字也是如此。

Java 号称跨平台,那么就要符合各个平台的标准。在有些平台,比如 windows,大小写不敏感,但是 unix 下面大小写敏感,如果允许大写小写一起混用,可能会造成查找不到这个包的问题(比如 windows 能但是 unix 不行),为了避免这种情况发生,干脆一起统一只能小写,避免出问题。