面向对象程序设计的思想
在思考问题的解的时候, 抽象的思路不是局限于计算机的结构, 而是基于问题本身.- 万物皆为对象
- 程序是对象的集合, 通过发送消息告诉彼此要做的
- 每个对象都有自己的存储, 其中可以存储其他对象, 即一个对象可以由其他对象组成
- 每个对象都拥有其类型. 类型的本质, 就是可以接受什么样的消息
- 某一个特定类型的所有对象都可以接受相同的消息, 这其中还包含有层级关系, 一个圆形也应该能够接受发送给几何形对象的消息.
在创建新类的时候, 首先考虑组合, 而不是继承.
继承与多态
继承就是创建一个新的类型, 这个新的类型包含了现有类型(被继承类型)的所有成员(也包含private成员, 但是不可访问, 因为不是一个类型), 更重要的是复制了基类的接口. 由于本质上, 类由所能接受的消息而确定, 因此本质上, 继承类和基类是具有相同的类型, 这是一种继承等价性. (认识到这个等价性和两个对象的具体类型不相同并不矛盾, 因为几何形是几何形, 圆形既是圆形也是几何形) 如果只是全部继承包括方法, 那没有必要, 一般要使基类与继承类产生差异, 产生差异的方法有两种:- 一是添加新方法
- 二是覆盖基类中的方法
一切皆对象的理念
对象的标识符, 实际上是一个引用(不用管底层是什么, 可以理解成一个指针), 对象的标识符并不一定有一个具体的对象与之关联. 所以其他语言里的仅声明不赋值, 到了Java这里, 就是创建一个引用. new 关键字(操作符)用来创建新的对象. 一切皆对象的特例是基本类型, 这些类型由于创建对象开销太大, 实际上是与C系列语言一样, 将变量放置在堆栈中(还记得参数准备区吗). 所以对于基本类型的标识符, 并不是一个引用, 而是类似于C语言其中的声明, 让编译器为该参数分配空间. 基本类型的包装器, 则可以在堆中创建一个非基本对象, 用来表示对应的基本类型. Java可以自动的在基本类型的标识符和基本类型的包装类型的标识符之间自动转换. 用于高精度计算的类 BigInteger(任意精度整数), BigDecimal(任意精度定点数), 这两个类用方法代替了直接运算符, 用速度换取了精度. Java的数组也特别注意, 如果创建非基本类型的数组, 实际上是一个引用数组, 每个引用都是null. 如果创建基本类型的数组, 则都被初始化成0. (这一点和C系是一样的, 声明的数组位于BSS区, 会被匿名页面关联所以初始化为0).类基础知识
类其中有两种元素: 字段(数据成员) 和 方法(成员函数). 如果字段是基本类型, 会被初始化为0. 方法的局部变量则不会初始化(可见Java的一个类很像C程序的一个模块). 字段类似于全局变量, 而方法就是函数的局部变量.import java.util.*; public class HelloDate { public static void main(String[] args) { System.out.println("Hello, it's "); System.out.println(new Date()); } }
操作符
操作符要注意的点:- 基本类型赋值是复制一份, 引用类型赋值是指向对象(就是复制指针啦), 方法传入基本类型会复制值, 传入对象引用可以操作对象(就是传入指针啦)
- 前缀增加和减少, 先进行自增和自减, 再生成值. 后缀增加和减少, 先生成值(原来的值), 再进行自增和自减
- 基本类型可以使用 == 和 != 进行判断相等与否, 因为本质上都是直接判断二进制数. 对象则要使用equals, 如果自定义的话必须要覆盖.
- 整数不能够当成布尔值来用
- Java的移位普通移位都是有符号移位, >>>是无符号移位, 即在高位插入0. 如果对char, byte 和short移位, 都会变成int类型的值. 要移动多少位, 只有右侧的5位才有用. long则是6位.
控制执行流程
关于比较少用到的跳转标签:label1:
outer-iteration {
inner-iteration {
break; //以当前状态跳出内层循环
continue; //控制权移交到内层循环开始处, 循环控制变量被更新
continue label1; //跳到外层循环, 继续外层循环的下一次迭代
break label1; //回到label处, 但不再执行其后的外层和内层循环, 等于执行下一条语句去了
}
}
这里尤其要注意的是break+标签, 标签的位置令人迷惑, 其实际作用是结束所有循环, 直接执行下边的语句.
书里是Java5, 当时还只能用int和char, 现在可以用枚举, String类和其他整数的包装类型了.