JAVA(一)——对象导论

抽象过程

汇编语言是对底层机器的轻微抽象,紧接着一些命令时语言的出现,但是它们所作的主要抽象仍要求在解决问题时要基于计算机的结构,而不是基于所要解决的问题的结构来考虑。而OOP允许根据问题来描述问题,而不是根据运行解决方案的计算机来描述问题。
Alan Kay总结的JAVA的五个基本特性则可以表现出一种纯粹的面向对象程序设计方式:
1.万物皆对象。
2.程序是对象的集合,它们通过发送消息来告知彼此所要做的。
3.每个对象都有自己的由其他对象所构成的存储。
4.每个对象都拥有其类型。
5.某一特定类型的所有对象都可以接收到同样的消息。
而Booch对对象提出了一个更为简洁的描述:对象具有状态、行为和标识。

每个对象都有一个接口

一旦类被建立,就可以随心所欲的创建类的任意个对象,然后去操作他们。其中存在的挑战便有问题空间的元素和解空间的对象之间创建一对一的映射。怎样才能获得有用的对象呢?必须有某种方式产生对对象的请求,使对象完成各种任务。每个对象都只能满足某种请求,这些请求由对象的接口来定义,决定接口的便是类型。
比如

Light lt = new Light();
lt.on();

接口确定了对某一特定对象所能发出的请求,但是,在程序中必须有满足这些请求的代码,调用请求的代码和隐藏的数据一起构成了实现。上面的片段中类是Light,对象是lt。

每个对象都提供服务

被隐藏的具体实现

在任何相互关系中,具有关系所涉及的各方都遵守的边界是十分重要的事情。访问控制的一个存在原因就是让客户端程序员无法触及他们不应该触及的部分,第二存在的原因便是允许库设计者可以改变类内部的工作方式而不用担心会影响到客户端程序员。
三个关键字在类的内部设定边界:public、private、protected。
public表示紧随其后的所有元素对任何人都是可用的。
private除类创建者和类的内部方法外任何人都不能够访问。
protected:和private的区别是继承的类可以访问protected成员但是不可以访问private成员。
另外一种是包访问权限,也就是default,没有任何访问指定词时,默认的访问权限可以被本包的其他类所访问,但是不能够被其他包的类所访问。

复用具体实现

最简单的复用某个类就是直接使用该类的一个对象,此外也可以将哪个类的一个对象置于某个新的类中,我们成为“创建一个成员对象”。因为实在使用现有的类合成新的类,所以这种给你按被称为组合,如果组合是动态发生的,那么它通常被称为聚合,组合经常被视为has-a关系,就像我们常说的“汽车拥有引擎”一样。
由于继承的作用比较重要,所以经常被高度强调,于是程序员新手就会有这样的印象:处处都应该使用继承,这会导致难以使用并过分复杂的设计,实际上,在建立新类时,应当首先考虑组合。

继承

在创建一个类之后,即使另一个新类与其具有相似的功能,你还是得重新创建一个类,如果我们能够以现有的类为基础复制会更好。类型不仅仅只是描述了作用域一个对象集合上的约束条件,同时还有与其他类型之间的关系。两个类型可以有相同的特征和行为,但是其中一个类型可能比另一个含有更多的特性。
当继承现有类型时,也就创造了新的类型。这个新的类型不仅包括现有类型的所有成员(注意private成员被隐藏起来且不可访问),而且更重要的是它复制了基类的接口。也就是说,所有发送给基类对象的消息同时也可以发送给导出类。
有两种方法可以使基类与导出类产生差异。第一种非常直接:直接在导出类中添加新办法。这些新方法不是基类接口的一部分。第二种也是更重要的一种使导出类和基类之间产生差异的方法是改变现有基类的方法的行为,这被称之为覆盖。
对于覆盖的这种方法,会有一点争议:继承应该只覆盖基类的方法而并不添加在基类中没有的新方法吗?因为如果只有覆盖,则意味着导出类和基类是完全相同的类型,因为具有完全相同的接口。这种情况被视为纯粹替代,通常称为替代原则。在某种意义上这是一种处理继承的理想方式。我们经常将这种情况下的基类和导出类之间的关系称为is-a关系,比如:一个原型就是一个几何形状。
但是如果是第一种加第二种,也就是继承类中即有覆盖也有添加的新方法,便是is-like-a,要注意的是基类对继承类多出来功能是一无所知的。

伴随多态的可互换对象

…文字版本就区分一下前期绑定和动态绑定。前期绑定意味着编译器将产生对一个具体函数名字的调用,而运行时将这个调用解析到将要被执行的代码的绝对地址。然而在oop中,程序直到运行时才能确定代码的地址,所以当消息发送到一个泛化对象时,必须采用其他的机制。
在JAVA中,动态绑定时默认行为,不需要添加额外的关键字来实行多态。
JAVA除了static和final之外,其他所有办法都是后期绑定的。

单根继承结构

在OOP中,自C++面世以来就已变得非常瞩目的一个问题就是,是否所有的类都最终继承自单一的基类,在java中答案时yes,这个终极基类的名字就是Object。也就是单根继承。好处非常多,如java的垃圾回收器

容器

如果不知道在解决某个特定问题时需要多少个对象,或者它们存活多久,那么就不可能知道如何存储这些对象,如何才能知道需要多少空间来创建这些对象呢?答案时不可能知道,因为信息时运行时才会知道。
那么就有一种方法,建立另一种对象类型。这种对象类型持有对其他对象的引用。通常被称为容器。在任何需要的时候都可以扩充自己以容纳你置于其中的所有东西,因此不需要知道将来会有多少个对象置于容器中,只需要创建一个容器对象,然后让它处理所有的细节。
要注意的是,不同的容器提供了不同类型的接口和外部行为。
不同的容器对于某些操作具有不同的效率。
在JAVA SE5出现之前,容器存储的对象都只具有Java的通用类型:Object。
后来设计出来参数化类型机制,参数化类型就是一个编译器可以自动定制作用域特定类型上的类。例如,通过使用参数化类型,编译器可以定制一个只接纳和去除shape对象的容器。
如:

ArrayList<Shape> shapes = new ArrayList<Shape>();

对象的创建和生命期

为了追求最大的执行速度,对象的存储空间和生命周期可以在编写程序时确定,这可以通过将对象置于堆栈或静态存储区域来实现。这种方式将存储空间分配和释放置于优先考虑的位置,但是也牺牲了灵活性,因为在编写程序时知道对象确切的数量、生命周期和类型。
第二种时堆中动态的创建对象,因为存储空间是在运行时被动态管理的,所以需要大量的实践在堆中分配存储空间,这可能要远远大于在堆栈中创建存储空间的时间。

异常处理

java一开始就内置了异常处理,而且强制你必须使用它。

并发编程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值