0%

ThinkingInJava-1

前言

准备开始阅读《Thinking in Java(第四版)》,这是Java的经典书籍,看了下目录,基本涵盖了Java编程的所有知识点。
本章先从第一,二章开始记录。

对象导论

作为本书的第一章,对象导论围绕面向对象,简述了其思想,设计以及相关的概念。

对象

Java是面向对象的编程语言,那么对象,究竟如何理解与定义?

先看看面向对象语言的鼻祖-smalltakl的五个特性:

 1. 万物皆对象
 2. 程序是对象的集合,他们通过发送消息(可以理解为方法的调用)来告知彼此要做什么
 3. 每个对象都有自己的由其他对象所构成的存储(可以理解成类的聚合和组合关系)
 4. 每个对象都拥有类型即每个对象都是某个类(class)的一个实例
 5. 某一特定类型的所有对象都可以接手同样的消息(继承)

关于对象,还有这么一个简单的描述:

对象具有状态,行为和标识 —Booch

 1. 状态:对象拥有的内部数据(属性)
 2. 行为:对象的方法
 3. 标识:区分对象的唯一的地址(书中解释到这一点有些过于受限,当对象被存储在不同的机器和地址空间或者
            硬盘上时,标识就应该是内存地址之外的其他东西)

对象,是遵照一定规则对实际问题的抽象或者说描述。比如:老鹰,新建一个老鹰的类型,它的属性有性别,年龄等,它的行为有飞行,捕食等。
而将属性具体化后,就得到一个对象。通过执行对象的行为来完成对实际问题的描述,例如调用他的飞行方法描述飞翔的过程。

面向对象

面向对象的思想其实很好理解,他即是将现实事物转为程序语言去处理。抽象出现实事务的属性和行为作为一个类型,然后创建对应的对象完成对现实问题的描述(可以理解为业务逻辑的完成)。

这是一种更灵活更强有力的语言抽象

这句话应该很好的概括了面向对象的优势。

那么谈到面向对象,肯定逃不开抽象,继承,封装,多态:

1. 抽象,对事务公共属性,行为的归纳提取,创建一个类型。
2. 继承,基于现有抽象的新的抽象。即在保留相同属性,行为的基础上建立一个新的类型。而新类型的行为可
   以有自己单独的实现方式,而且保留父类的属性行为基础上,还可以增加新的属性和行为
   例如:鸟类的飞行行为,继承鸟类的老鹰和麻雀都拥有同样的飞行行为,但两者可飞行的高度不同。而对老
   鹰可以增加对其他动物的捕食行为
   继承一方面提高了代码的复用性,另一方面也是建立了类与类间的关系,体现了对实际事务的描述
3. 封装,目的是隐藏一些没必要被开发者知晓的信息,减少操作带来的bug。是为了程序安全性的一种措施。通
   常借助代码的访问控制达成(public,private,protected)
4. 多态,基于继承的关系,在编译期可以将一个对象当作他的父类对待,直到运行期才确定他的类型。这种特
   性可以提高代码的扩展性,例如:一个方法的入参可以用父类定义,而传参时选择不同的子类以完成不同的
   逻辑处理

一切都是对象

本书第二章从对象的创建谈起,逐步讲述了怎样构建一个简单的Java程序,包括编码规范,注释,javadoc标签等。因为是比较基础的内容,所以就摘一些我比较感兴趣的记录一下。

引用

Java中对对象的控制是用引用完成的,例如

ClassA a = new ClassA();

这里初始化一个类型ClassA的对象a,a只是对象的一个引用,是一个地址值,指向堆中实际数据存储的地方。
这也是在参数传递的时候时常容易忽略的问题。
参数如果是对象,传递的是对象的引用值,那么方法内的操作就会反馈到同一对象的所有引用上。
参数如果是基本类型,基本类型存储的是数据本身,这时传递的就是数据的值,所以不影响方法外的基本类型的值。
这里举个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
ClassB b = new ClassB(1);
int c = 1;
updateB(b,c);

// b的value属性会改变,而c的值不变

public void updateB(ClassB param1, int param2){
param1.value = 2;
param2 = 2
}

static

static关键字是常用的关键字之一。他开辟独属于类的存储空间,不依赖于对象的创建,是所有对象公有的。
当类第一次加载时,static修饰的方法,属性,代码块就会随之加载,且只会加载这一次。
因此我们可以将一些类的初始化操作(设置默认值等),常量,公用方法用static修饰处理,因为只会加载一次,所以一方面提升效率,另一方面保证数据不可变。

小结

  书的第一章,第二章比较基础,介绍了面向对象的思想,Java的基础概念。算是温故了一些知识点,不过对
面向对象及对象的一些概念的阐述感觉让自己的认知更加清晰了。

下一章 <ThinkingInJava-2>