1.1 抽象过程
程序员必须建立在机器模型(位于“解空间”内,这是你对问题建模的地方,例如计算机)和实际待解决问题的模型(位于“问题空间”内,这是问题存在的地方,例如一项业务)之间的关联。而这时面向对象程序设计的挑战之一。
一个成功的面向对象、同时也是Java语言所拥有的特性,这些特性表现了一中纯粹的面向对象程序设计方式:
1)万物皆为对象
2)程序是对象的集合,他们通过发送信息来告知彼此要做的事情。
3)每个对象都有自己的由其他对象所构成的存储——可以通过创建包含现有对象的包的方式来创建新类型的对象。
4)每个对象都拥有其类型——每个对象都是某个类的一个实例。
5)某一特定类型的所有对象都可以接受同样的信息——体现了可替代性,这是OOP中最强有力的概念之一。
1.2 每个对象都是一个接口
类的概念:具有相同特性(数据元素)和行为(功能)的集合。
1.3每个对象都提供服务
1.4 被隐藏的具体实现
将程序员按照角色分为类创建者和客户端程序员。类创建者根据具体情况创建客户程序员所需要的类,客户程序员使用这些类的方法。
通过设置访问控制来保护在相互关系中所遵守的边界规律,设置访问控制的必要性:
1)让客户端程序员无法触及他们不应该触及的部分;
2)允许库设计者可以改变类内部的工作方式而不用担心会影响到客户端程序员。
1.5 复用具体实现:代码复用是面向对象程序设计语言所提供的最了不起的优点之一。
复用某个类的方式:1)直接使用该类的一个对象;2)将该类的对象至于新的类中。
组合:使用现有的类合成新的类,这种方式称为组合。
聚合:如果组合是动态发生的,通常被称为聚合。
1.6 继承:通过基类导出子类,基类中有的功能在子类中都有,而且在子类中可以增加新的方法。
可以创建一个基类型来表示系统中某些对象的核心概念,从基类中导出其他类型,来表示此核心可以被实现的各种不同方式。
有两种方式可以是基类与导出类产生差异:1)直接在导出类中添加新方法;2)改变现有基类的方法,这种行为被称为覆盖。
“是一个”与“像是一个”的关系:
is-a(是一个):基类和导出类具有完全相同的方法和接口,结果可以用一个导出类的对象完全替代一个基类对象。
is-like-a(像是一个):在导出类中添加新的接口,新类型具有旧类型的接口,但是新类型还包含其他方法。
1.7 伴随多态的可交互对象
未解决多态的的问题,面向对象程序设计语言使用了后期绑定的概念。当向对象发送信息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查,但是并不知道执行的确切代码。为了执行后期绑定,Java使用一小段特殊的代码来代替绝对地址调用。这段代码使用在对象中存储的信息来计算方法体的地址。这样,根据这一小段代码的内容,每一个对象都可以具有不同的行为表现。当向一个对象发送信息时,该对象就能够知道这条信息应该做些什么。
具体实例如下:
<pre name="code" class="java"> void doSomething(Shape shape){
shape.erase();
//.......
shape.draw();
}
这个方法可以与任何Shape对话,因此它是独立于任何它要绘制和擦除的对象的具体类型的。如果程序中使用了doSomething()方法:
Circle circle = new Circle();
Triangle triangle= new Triangle();
Line line = new Line();
doSomething(circle);
doSomething(triangle);
doSomething(line);
对doSomething()的调用会自动的正确处理,而不管对象的确切类型。把将导出类看成是他的基类的过程称为向上转型。
1.8 单根继承机制:在Java中所有的类最终都继承自单一的基类:Object。
1)在单根继承结构中的所有对象都具有一个共有接口,所以他们归根结底都是相同的基本类型。
2)单继承结构保证所有对象都具有某些功能。
3)单继承结构使垃圾回收器变得容易很多。
1.9 容器
对容器需要选择的原因:1)不同容器具有不同的功能;2)不同容器处理问题的效率不同。
参数化类型机制就是编译器可以自动定制作用于特定类型上的类,在Java中被称为范型。
ArrayList<Shape> shapes=new ArrayList<Shape>();
1.10 对象的创建和生命周期
1.对象的创建方法:
1)将对象置于堆栈中(他们有时被称为自动变量)或限域变量或静态存储区域内实现。这种方式将存储空间分配和释放置于优先考虑的位置,某些情况下这样控制非常有价值,但是,也牺牲了灵活性,因为必须在编写程序是对象确切的数量、生命周期和类型。
2)在堆的内存池中动态地创建对象。在这种方式中,直到运行时才知道需要多少对象,他们的生命周期如何,以及他们的具体类型是什么。这些问题的答案只有在程序运行时相关代码被执行的那一刻才知道。如果需要一个新对象,可以在需要的时刻直接在堆中创建。Java完全采用了动态内存分配方式。每当要创建新对象时,就要使用new关键字来构建此对象的动态实例。
2.对象的生命周期
对于允许在堆栈上创建对象的语言,编译器可以知道对象存活的时间,并可以自动销毁。如果在堆上创建对象,编译器完全不知道对象的生命周期,例如c++语言就是这样的,这样有可能会导致内存泄露。Java提供了被称为“垃圾回收器"的机制,它可以自动发现对象何时不再被使用,并且销毁它。这一点同所有对象都是继承自单根基类Object以及只能以一种方式创建对象(在堆上创建)这两个特性结合起来。垃圾回收器减少了所必须考虑的议题和必须编写的代码。
1,11 异常处理:处理错误
Java 一开始就内置了异常处理机制,而且强制你必须使用它。
1.12 并发编程
并发编程使得程序执行速度变快了好多,而且程序员不用操心机器上是单处理器还是多处理器。但是有一个隐患:共享资源问题。如果多个并发执行的任务都要访问同一项资源,那么他就会出现问题。解决办法是:某个任务锁定某项资源,完成其任务,然后释放资源锁,使其他任务可以使用这项资源。
1.13 Java与Internet:Java解决了万维网上程序设计问题。
1.web是什么?
1)客户/服务端计算机技术
2)web就是一台巨型的服务器。
2.客户端编程
3.服务器端编程