1.1 抽象过程
1.万物皆对象
2.程序是对象的集合,它们通过发送消息来告知彼此所要做的。
3.每个对象都有自己的由其他对象所构成我的存储。
4.每个对象都拥有其类型。
5.某一特定类型的所有对象都可以接受同样的消息。
对象,即为某个类的实例。
在OOP中,一切事物可以抽象为对象,即所谓万物皆对象。
每个对象(类)定义有自己的方法,赋予对象发送消息的能力。
类似C的结构体,每个对象可以包涵其他对象,基础类型,进一步抽象。
多态,上下转型,赋予同类对象可以接收同样的消息。
P1.对象的创建
Light li = new light();
//new light()为类Light的新生成的一个对象(实例),li为该对象的引用。
1.3 每个对象都提供服务
在良好的面向对象设计中,每个对象都可以很好得完成一项任务,但是它并不试图做更多的事。
不要赋予一个对象太多的功能,功能不明确,不利于代码复用。
1.4 被隐藏的具体实现
java用三个关键字在类的内部设定边界:public,private,protected。
public:包内任何人可用。
private:类中可用,即除了类的创建者其余用户不可见。
protected:继承自父类的子类可以调用父类中的protected成员,private则不行。
1.6 继承
对面向对象设计的人们来说,困难之一是从开始到结束过于简单。
在对自然事物的描述中,我们可能直接建立一个类来对该事物进行抽象(比如需要圆形,我们就创建一个圆形类),并未考虑到之后可能还有三角形,正方形之类的需求。所以我们需要跟长远的考虑,例如建立几何形类,使圆类继承自该类,以便于代码的扩展,也不会让许多类看起来杂乱。
对于继承可能会引发某种争论,继承应该只覆盖基类的方法(而并不添加在基类中没有的新方法)么?
替代原则:不在子类中实现新的接口(不添加父类接口不提供的方法)。否则可能在实现了新接口后,使子类具备了更多的功能,使父类的定义不再适用于对子类的描述。
1.7 伴随多态的可互换对象
如果某个方法要让泛化几何形状绘制自己,让泛化交通工具行驶,或者让泛化的尿了移动,那么编译器在编译时是不可能知道应该执行那一段代码的。
假设存在方法action(Bird bird),在action中调用bird的move方法,Brid类存在子类Goose,Penguin,三个类存在各种不同的move方法。那么在bird传入不同类型的引用时,调用action会发生什么呢?
class Bird {
public void move() {
System.out.println("bird fly");
}
}
class Goose extends Bird{
@Override
public void move() {
System.out.println("Goose swim");
}
}
class Penguim extends Bird {
@Override
public void move() {
System.out.println("Penguim walk");
}
}
public class Demo {
public static void main(String[] args) {
Bird b = new Bird();
Goose g = new Goose();
Penguim p = new Penguim();
action(b);
action(g);
action(p);
}
private static void action(Bird bird) {
bird.move();
}
}
/*Output
bird fly
Goose swim
Penguim walk
*/
不知何故,他总是做了该做的。
前期绑定:在编译时, 方法调用已经和方法体绑定。
后期绑定:在运行时,根据存储在对象内部的信息计算方法体的地址,以完成调用。
java显然属于后者。
1.9 容器
P2 泛型存在的原因
在之前容器中只存储Object的对象,在向下转型的过程中存在安全隐患,故在建立容器的时候直接显式的定义泛型,以<>表示。例如:
Linkedlist<String>
1.10 对象的创建和生命期
在堆栈创建对象:创建,释放快,但不灵活(要提前知道对象的特性)。
在堆中动态分配内存创建对象:创建,分配慢,灵活。
P3客户端编程
在浏览器与服务器的交互中,浏览器处于被动,全权依赖于服务器返回的数据,为解决流量过多的问题,将一些客户端力所能及的处理放在客户端执行而进行的客户端编程。e.g.插件,脚本语言,java(applet)。