第一章 对象导论
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);
}
}
结果为:
为什么是8464呢?因为JVM之中规定的char就是16位,所以是(8100*8100)%(2^16),也就是(8100*8100)%65536,最后就是8464.
第四章 控制执行流程
4.8 Switch
此处书中已经过时,现在float的确还是不能作为switch的值,但是实际上String已经可以了:
第五章 初始化与清理
5.1 用构造器确保初始化
构造器本身并不返回任何值,返回值的是相应的new()表达式
为什么要有重载?
在c之中,要求为每一个方法都提供一个独立的标识符,这就意味着如果println()
用于字符串之后,就不可以再用于表示数字。
- 这样做的不好之处在于其如果类型很多,那么需要为每一个类型扩展一个方法。
- 另外在Java之中,构造器的名字必须和类名相同,这就意味着想使用多种参数来构造一个对象的时候,其必须使具有不同参数的构造器同时存在,因此就必须用到方法重载。
5.5 清理:终结处理和垃圾回收
finalize()
只是在gc 的过程之中被调用,和“内存释放”这个动作并没有必然的关联。
5.7.2 静态数据的初始化
一个类可能没有静态方法吗?
实际上是不可能的,因为一个类的 constructor 一定是静态方法(这个一定是依附于类,而不是依附于某个对象的),所以其一定具有静态方法。
一个具有静态对象的类的初始化
- 首先会查找类的路径,并且加载对应的 .class 文件
- 载入 .class ,先将其内部的所有静态属性和对象加载完成,这一步只会在载入 .class 文件的过程之中执行,所以静态初始化只会在这里执行一次。
- 为这个对象在堆上分配空间
- 这块分配的存储空间将会被清空,这一步是直接将对象上面的所有属性置为0,将所有对象引用置为 null的过程。
- 执行所有的出现在字段定义地方的初始化操作。
- 执行 constructor。这里会执行很多动作,尤其是在继承的时候。
第六章 访问权限控制
Java包的命名规则全部使用小写字母,中间的字也是如此。
Java 号称跨平台,那么就要符合各个平台的标准。在有些平台,比如 windows,大小写不敏感,但是 unix 下面大小写敏感,如果允许大写小写一起混用,可能会造成查找不到这个包的问题(比如 windows 能但是 unix 不行),为了避免这种情况发生,干脆一起统一只能小写,避免出问题。