面向对象的总结

发表于: arch/management | 作者: | 日期: 2008/11/07 04:11
标签:

1:如果一种编程语言是真正的面向对象的语言,它必须支持以下的特点:
封装–隐藏实现细节
多态–将同一个消息发送给不同的对象并使各个对象以预定的方式对消息做出响能力
继承–拓展现存的类来生成专有类继承原来类的状态和行为的能力

有的资料上也会跳到以下的东西,但上面的三条是面向对象必不可少的因素;
动态绑定–在编程时不必知道对象的具体类型就能向它们发送消息的能力

2:对象简介
对象是代表现实生活中的实物的软件编程实体,比如说银行帐号,计算机用户,用户介面上的按钮,窗口菜单等等.对象是由它们的状态和行为定义的.例如,一个银行帐号拥有一种状态,诸如当前的收支状况,账户的所有人,允许的最小交易额,等等,而它的行为则包括提取,存入,收支平衡等.

一个对象的状态是由只有对象自己知道的变量定义的.Java把这些变量称为数据域或者成员变量.数据域对对象来说是私有的除非显式的使用关键字来定义它们的作用域,使它们对其它类可见.我们将在以后讨论变量作用域的问题.

一个对象的行为是由它上面的操作定义的.在Java中,这些操作被叫做方法.方法可以改变一个对象的状态,创建新对象,实现实用的功能等.


类是一个实体,它定义了一个对象的运行方式以及在对象被创建或者说实例化的时候所包含的数据.类的作用就象一个模板,一个或者多个对象可以依照它来创建.

3:多态简介:

多态的解释1:
多态是一种机制、一种能力,它在类的继承中得以实现,在类的方法调用中得以体现。
MSDN里给出的定义:
Through inheritance, a class can be used as more than one type; it can be used as its own type, any base types, or any interface type if it implements interfaces. This is called polymorphism. In C#, every type is polymorphic. Types can be used as their own type or as a Object instance, because any type automatically treats Object as a base type.
译文:通过继承,一个类可以被当作不止一个数据类型(type)使用,它可以被用做自身代表的数据类型(这是最常用的),还可以被当作它的任意基类所代表的数据类型,乃至任意接口类型——前提是这个类实现了这个接口。这一机制称为“多态”。在C#中,所有的数据类型都是多态的。任意一个数据类型都可以被当作自身来使用,也可以当作Object类型来使用(我怀疑原文有问题,那个instance可能是原作者的笔误),因为任何数据类型都自动以Object为自己的基类。

多态的解释2:
Java语言的多态是指程序中同名的不同方法共存的情况。多态是面向对象程序设计的又一个特性。
我们知道,面向过程的程序设计中,过程或函数各具有一定的功能它们之间是不允许重名的;而面向对象程序设计中,则要利用这种多态来提高程序的抽象性,突出Java语言的继承性。如前面分析的方法的继承与覆盖。
Java语言可通过两种方式实现多态。
(1)通过子类对父类方法的覆盖实现多态;
(2)利用重载在同一个类中定义多个同名的不同方法来实现多态。
通过子类对父类方法的覆盖实现多态,这是一种很重要的多态方式。前面电话卡类“拨打电话”的四种方法,虽然操作的内容不同,但却共享相同的名字—“performDial”。 这种子类对继承自父类的方法的重新定义就称为方法的覆盖,就是一个典型的、多态例子。
利用重载来实现多态是在同一个类中定义多个同名的不同方法来实现多态。之所以同一个类中要定义多个同名的不同方法,是由于它们在完成同一个功能时,可能要遇到不同的具体情况,因此,需要定义含有不同的具体操作的方法,来代表多种具体的实现形式。 例如:一个类需要具有打印的功能,而打印是一个很广泛的操作,对应具体的需要,要有不同的操作,如实数打印、整数打印、字符打印、分行

多态解释3:
什么是多态?
简单来说,多态是具有表现多种形态的能力的特征,在OO中是指,语言具有根据对象的类型以不同方式处理之,特别是重载方法和继承类这种形式,的能力。多态被认为是面向对象语言的必备特性。
多态有多种分类,通过了解这些分类可以更丰满对其认识,在这里就不再罗列,请各位参考 wiki大百科 和 javaworld .

多态与泛型(generic)
多态实际上就是泛型。

所谓泛型就是指我们不为特定的类型进行专门编码,而采用对不同类型进行通用编码的方式,无论是数据结果还是算法。

传统的泛型是指类似以Template function的方式使参数一般化,典型的应用是C++ STL,比如List、Vector以及algorithm。

而OO已能通过接口(Interface)和抽象类(Abstract Class)进行真正意义上的泛型了。在我看来,这就是OO最精彩的地方,也就是多态的威力。而对于传统意义上的Generic,我始终觉得其作用已经今不如昔了。

多态和继承(Inheritance)
严格来说,多态与继承、重载并不是孤立的,他们之间存在着紧密的联系,多态是建立在这两者的基础之上的(实际上继承就有用重载这一特性)。

传统的多态实际上就是由虚函数(Virtual Function)利用虚表(Virtual Table)实现的(早期C模拟OO特性时使用最多,C++的实现也是,后来的技术未作研究,是否使用VT不得而知),自然是离不开继承,换句话说多态实际上覆盖了继承。
正是由于继承与多态的紧密联系,使得我们很容易张冠李戴,那么如何区别呢?
举个常用的例子:
Abstract Class Sharp implement IHaveSide {
public bool isSharp(){
return true;
}
public abstract int getSides();
}
Class Triangle extends Sharp {
public override int getSides() {
return 3;
}
}
Class Rectangle extends Sharp {
pubilc override int getSides() {
return 4;
}
}
那么这种类的关系叫做继承,下面这种使用方式也是继承所带来的:
Triangel tri = new Triangle();
println(“Triangle is a type of sharp? ” + tri.isSharp());
而这种方式则是多态:
Sharp sharp = new Rectangle();
println(“My sharp has ” + sharp.getSides() + ” sides.”);
这两者区别在哪?很显然,继承是子类使用父类的方法,而多态则是父类使用子类的方法。
其技术上的区别是绑定时期,晚期绑定一定是多态。
这里介绍区别并不是想说茴字有几种写法,而是只有清楚的认识到技术的显著特点后才能更好的使用它。

现代软件设计
现代软件大量的使用框架、模式(非特指Deisgn Pattern),也就是将软件开发的一些共性进行抽象,提出普遍适用的软件结构。

无论是框架还是模式,他们都有一些明显的共同点 — 使用xml配置对象,大量使用接口采用所谓面向接口的方法,利用反射实现。
为什么要接口?因为需要抽象,需要将未知的对象在已有的框架中表现。

如何实现接口?多态!所谓反射,实际上就是一种晚期绑定的技术,这个技术实质上表现出来的就是多态这一特征。
面向方面开发(Aspect Oriented Programming)是一个热点,也是现代软件发展的趋势。定制、组件装配的软件开发方式在应用越来越复杂、需求变化越来越快的今天显得日趋重要。那么如何才能使今天的软件能够适应明天需要呢?如何使我开发速度更快?如何能更容易的修改应用?AOP则是解决这些问题的有效手段。

让我们看看框架容器的主要模式,Inversion of Control Containers(IoC)/Dependency Injection(包括setter injection, construct injection, interface injection等),其主要好处就是类之间的依赖,通过运行期的查找来进行绑定。那么他的基础是什么呢?还是多态!

我们可以看到,在现代软件的开发中,无数的思想象火花一样跳动。其中一类很重要的思想就是建立在多态这样一个很基本的特性,甚至可以说是一个语言概念之上的。在这里希望通过这篇文章抛砖引玉,引起更多的对与当今软件发展发向的思考,同时探究其根源。

4: java语言的接口:

java语言的接口是用来实现类间多重继承功能的结构。它定义了若干个抽象方法和常量用以实现多重继成乘的功能。
Java语言不支持多重继承,只支持单重继承(只有一个直接父类)。然而在解决实际问题的程序设计中仅靠单重继承尚不能更复杂的问题。为了使Java程序的类层次结构更加合理,更符合实际问题的需要,我们把用于完成特定功能的若干属性组织成相对独立的属性集合。这种属性的集合就是接口。

⑴ 定义接口与定义类非常相似:由接口定义不 n难看出,可以认为接口是一种特殊的类,它是由 n常量和抽象方法组成的特殊类。一个类只能有一 n个父类,但可以同时实现若干个接口。 n⑵ interface 是接口定义的关键字。与类定义 n相似,需要说明接口的访问属性,而接口的访问 n修饰符仅有public-公共接口,没有public修饰 n的接口则只能被同一个包中的其它类和接口利用
⑶接口也有继承性。n定义接口时可以通过关键字 extends 说明 n当前定义的接口与哪个接口具有继承关系, n当前接口将继承父接口所有的属性和方法。 n在此一个接口可以有多个父接口,它们之 n间用逗号分隔,形成父借口列表。 n⑷ 接口体的定义很重要,接口体由两部分 n组成,即域的定义和方法的定义两部分
接口中的域是用 final 修饰的常量,接口中的方法是用 abstract 修饰的抽象方法。 在接口中只能给出抽象方法的方法名、返 n回值和参数列表,而不能定义方法体。 n⑸ 系统默认:接口中的域都必须是public nstastic final;接口中的方法都必须是public nabstract .接口中的方法体可以由Java语言 n书写,也可以由其他语言书写,只是这时 n接口方法应由 native (本地方法)修饰。

5:在java里面,关于跨类引用,有两条规则应该记住:
1. 如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类。
2. 如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。

  所以,根据这两个规则,我们就不难理解例子中的A a2 = b1是什么意思了。

  困惑2:

  A a2 = b1是可以的,但是为什么b1=a1却是不行? 在这里,我们依然可以套用上面的两条规则,我们可以看到,b1是类B的一个引用,a1既不是类B的实例,也不是类B的子类的实例,所以直接b1=a1就出现了编译错误.
如果确实需要进行这样的转化,我们可以这样作:b1=(B)a1; 进行强制转化,也就是下溯造型. 在java里面,上溯造型是自动进行的,但是下溯造型却不是,需要我们自己定义强制进行.

: https://blog.darkmi.com/2008/11/07/399.html

本文相关评论 - 1条评论都没有呢
Post a comment now » 本文目前不可评论

No comments yet.

Sorry, the comment form is closed at this time.