最近重新拿起《Java编程思想》这本书,想起好久没有写过博客了,趁着自己想学习,重新开写吧!
1.抽象过程:所有编程语言都提供抽象机制,人们能够解决问题的复杂性直接取决于抽象的类型和质量。
2.java的五个基本特性:
(1)万物皆是对象;
(2)程序是对象的集合(容器),他们通过发送消息来告诉彼此所要做的;
(3)每个对象都有自己的由其他对象所构成的存储;
(4)每个对象都拥有起类型;
(5)每个特定类型的所有对象都可以接收同样的消息。
3.每个对象都有一个接口:
一个类就是一个数据类型;每个对象都只能满足某些请求,这些请求由对象的接口定义,决定接口的便是类型。
4.每个对象都提供服务。
5.被隐藏的具体实现:
Java用三个关键字在累的内部设定边界:public、private、protected。
public:表示紧随气候的元素对任何人都是可用的。
private:标识除类型创建者和类型的内部方法之外的任何人都不能访问的元素。
protected:与private相当,差别在于继承的类可以访问protected成员,不能访问private成员。
6.复用具体实现:
最简单的复用某个类的方式就是直接试用该类的一个对象,也可以将那个类的一个对象置于某个新的类中。这就是创建一个成员对象,新的类可以由任意数量、任意类型的其他对象以任何可以实现新的类中想要的功能的方式所组成,这就是组合。组合带来的极大的灵活性。
7.继承:
当继承现有类型时,也就创建了新的类。
子类和父类具有相同的类型。
如果我们只是继承了父类,在父类中只重写方法而不创建新的方法,我们可以称之为纯粹替代(代替原则)。有时必须在子类中添加新的接口元素,这样就扩展了接口,这个新的类型仍然可以代替基类,但是不完美,基类无法访问新添加的方法。
8.伴随多态的可互换对象:
在处理类型的层次结构时,经常想把一个对象不当作它所属的特定类型来对待,而是将其当作基类的对象来对待。这使得人们可以编写出不依赖于特定类型的代码。
但是,在试图将导出类型的对象当作其泛化基类型对象来看待时(把圆形看作是几何形,把自行车看作是交通工具),仍然存在一个问题。如果某个方法要让泛化几何形状绘制自己、让泛化交通工具行驶,或者让泛化的鸟类移动,那么编译器在编译时是不可能知道应该执行哪一段代码的。这就是关键所在:当发送这样的消息时,程序员并不想知道哪一段代码将被执行;绘图方法可以被等同地应用于圆形、正文形、三角形,而对象会依据自身的具体类型来执行恰当的代码。
OOP中,程序直到运行时才能确定代码的地址,所以当消息发送到一个泛化对象时,必须采用其他机制。
为了解决这个问题,面向对象程序设计语言使用了后期绑定的概念。当向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查(无法提供此类保证的语言被称为是弱类型的),但是并不知道将被执行的确切代码。
为了执行后期绑定,Java使用一小段特殊的代码来替代绝对地址调用。这段代码使用在对象中存储的信息来计算方法体的地址。这样,根据这一小段代码的内容,每一个对象都可以具有不同的行为表现。当向一个对象发送消息时,该对象就能够知道对这条消息应该做些什么。
而在Java中,动态绑定是默认行为,不需要添加额外的关键字来实现多态。
把将导出类看做是它的基类的过程称为向上转型(upcasting)。
转型(cast)这个名称的灵感来自于模型铸造的塑模动作,而向上(up)这个词来源于继承图的典型布局方式,通常基类在顶部,而导出类在其下部散开。因此,转型为一个基类就是在继承图中向上移动,即“向上转型”。
9.单根继承结构:
在java中,所有的类最终都继承于单一的基类,这个基类就是Object。事实证明,单根继承结构带来了很多好处。单根继承使得垃圾回收器的实现变得容易的多。由于所有对象都保证具有其类型信息,因此不会因无法确定对象的类型而陷入僵局。
10.容器:
如果不知道在解决某个特定问题时需要多少个对象,或者它们将存活多久,那么就不可能知道如何存储这些对象。如何才能知道需要多少空间来创建这些对象呢?答案是你不可能知道,因为这类信息只有在运行时才能获得。
Java解决方案:创建另一种对象类型。这种新的对象类型持有对其它对象的引用。
这个对象类型通常被称为容器(也称为集合),这个新的对象可以在任何需要的时候扩充自己以容纳放置在其中的所有东西。因此不需要知道将来会有多少个对象置于容器中,只需要创建一个容器对象,然后让它处理所有细节。
从设计的观点来看,真正需要的只是一个可以被操作,从而解决问题的序列。
如果单一类型的容器可以满足所有需求,那么就没有理由设计不同种类的序列了。
然而还是需要对容器有所选择,这里有两个原因:不同容器提供了不同类型的接口和外部行为;不同容器对于某些操作具有不同的效率。
11.对象的创建和生命周期:
在被称为堆(heap)的内存池中动态地创建对象。运行时才知道需要多少对象,它们的生命周期如何,以及它们的具体类型是什么。
如果需要一个新对象,可以在需要的时刻直接在堆中创建。因为存储空间是在运行时被动态管理的,所以需要大量的时间在堆中分配存储空间,这可能要远远大于堆栈中创建存储空间的时间。
12.异常处理:
java一开始就内置了异常处理,而且强制你必须使用它。
13.并发编程:
在计算机编程中有一个概念,就是在同一时刻处理多个任务的思想。