chapter_01 对象导论
1.1 Java语言基础Smalltalk的特性:
- 万物皆对象 可以将对象视为一种奇特的变量,它可以存储数据(成员变量),也可以在自身上执行操作(方法)。
- 程序对象的集合 它们通过发送消息告知彼此要做的事情。可以将消息视为对某个特定对象的方法的调用。
- 每个对象都拥有类型 每个对象都是某个类(class)的一个实例。类与类之间最大的区别在于“可以发送什么样的消息给他”。
- 某个特定类型的所有对象都可以接收同样的消息 这是继承的基础,能够发送给父类对象的消息一定可以发送给子类对象。
对象的描述:对象具有状态(内部数据)、行为(方法)和标识(内存中的唯一地址值)。
1.2 每个对象都有一个接口
类(class)描述了具有相同特性(数据元素/域)和行为(功能/方法)的对象集合。
每个对象都只能满足某些请求,这些请求由对象的接口所定义,决定接口的接口类型。接口定义了对象所能发出的请求和能接收的消息。
1.5 复用具体实现
一旦类被创建并测试完成,它就代表一个有用的代码单元。
代码复用是面向对象程序设计语言最了不起的优点之一。
1.6 继承
继承的简单描述:以现有类为基础,复制它,通过在副本中添加或修改来创建新类。子类复制了父类的接口,那么发送给父类对象的消息同样可以发送给子类对象。当对象接收特定的消息时,必须有某些代码被执行(对象方法处理消息请求)。
使子父类之间产生差异的方法:
- 在子类中添加新的方法
- 改变继承自父类的方法(重写/覆盖 overriding)
1.7 伴随多态的可互换对象
在处理类型层次的时候,常把对象不当作其所属的特定类型,而是将其作为基类对象来对待,这样可以编写不依赖特定对象类型的代码。但这存在一个问题,当向这些对象发送消息时,编译器无法确定到底执行哪段代码。
在OOP中,程序直到运行时才能确定代码的地址。面向对象都是采取后期绑定的机制(第8章细讲。。。)
1.9 容器
有时只有在程序运行时才能获知解决特定问题需要多少对象。
面向对象程序设计创建一种新的容器(也成集合Collection)对象,该对象持有其他对象的引用,在需要的时候可以扩充自己的容量。
参数化机制:
Java SE5之前的容器只能存储Object类型,当将对象引用置于容器中时必须向上转型为Object类型。而取出时就要向下转型,但是向下转型不一定是安全的。Java SE5 引入参数化机制,可以创建只允许存储特定类型的对象引用的容器(第15章 泛型)。
chapter_02 一切都是对象
2.1 用引用操纵对象
Java中一切都被视为对象,但操作的标识符实际上是对象的一个“引用”(reference)。
可以拥有一个引用,但不一定要与一个具体对象相关联,例如 String s ,但如果此时向s发送消息,编译器会报错。
2.2 创建对象
一旦创建了一个引用,就希望与一个新的对象相关联。关键字 new 的意思是“给我一个新对象!” (汪汪。。。)String s = new String("asdf");
Java中的存储
- 寄存器 位于cpu中,数量极少,程序不能直接控制
- 堆栈 位于RAM中,堆栈指针向下移动,分配新内存;向上移动,释放内存。Java系统中存储于堆栈内的所有相必须有确切的生命周期,以便及时释放内存资源。Java中对象引用存储在这里。
- 堆 也位于RAM区,存放所有Java对象,编译器不需要知道存储在堆中数据需要存活多长时间。
- 常量存储 存储在常量池里
2.3 永远不要销毁对象
1. 作用域(scope)决定了在其内定义的变量的可见性和生命周期,Java中作用域由花括号的位置决定。
{ int x = 12; { int q = 20; // 此处 x 和 q 都可见 } // 此处只有 x 可见, q在作用域之外 }
2. 对象的作用域 对象引用在在作用域之外就消失了(堆栈释放内存资源),但new的对象仍然存在于堆中,但是无法访问。Java用垃圾回收器来监控不会再被引用的对象。
2.4 创建新的数据类型:类
关键字class表示“我准备告诉你一种新类型的对象看起来像什么样子”。
类中可以设置两种元素:成员数据(field)和方法(method)。成员数据可以是任意类型的对象,可以通过其引用与其通信。如果成员数据是某个对象的引用,那么必须初始化该引用,以便使其与一个实际的对象相关联。
2.5 方法、参数和返回值
Java的方法决定了一个对象可以接收什么样的消息。方法的基本组成:
- 方法名
- 参数列表 给出了要传递给方法的信息的类型和名称
- 返回值类型 方法调用后返回的值
- 方法体 方法的具体实现
方法名和参数列表合称方法签名,可以唯一的标识出某个方法。方法只有通过对象才能调用,而且这个对象必须含有这个方法。
参数列表指定要传递给方法的信息。参数列表必须指定每个传递对象的类型和名字,实际上传递的是对象的引用。
return关键字的含义:首先表示方法已经结束,离开此方法;其次如果方法产生了一个值,该值就放到return后面。
2.6 构建Java程序
1. 名称的唯一性 Java设计者希望程序员反用自己的域名,这样就能保证包名的唯一性,如com.znker.homepage 包名一律小写。
2. import 指示编译器导包,使用通配符“ * ”可以导入整个包
3. static 关键字 作用于两种情形:
1) 只想为某个域分配单一的存储空间,即使不创建任何对象
2) 希望某个方法不与包含它的类的任何对象相关联,即使不创建任何对象也能调用该方法
所有,不创建任何对象的情况下也可以调用static修饰的域和static修饰的方法。
class StaticTest { static int i = 20; }
此时即使创建两个StaticTest对象,StaticTest.i 也只有一个存储空间,并且两个对象共享一个 i
引用static修饰的变量的两种方法:1)通过一个对象去调用 2)使用类名调用 (推荐)。调用static修饰的方法也是这样,推荐通过类名直接调用 ClassName.method()
static方法的重要作用就是在不创建任何对象的情况下调用,这对于mian()方法极为重要,因为这是运行程序的入口。