水果”是类中类,是抽象之后的再抽象;是属于抽象类。这还没完,“水果”源自果树,是果树类中的一个属性。而果树又是植物类中的一个种类;植物和动物构成生物类;生物类和非生物类才到达最顶端的根――物类。你可以说“茶杯”是物,是非生物;但不能说是“水果”。从这“金字塔”看,最顶端只有一个“物”类,往下只是2个,再往下呢?植物类、动物类就多了,看你的分类角度吧。对于动物来说,简单的就是死、活动物类;复杂的你知道的。抽象类的尽头才是具体类,之后是它们的个体;一个个对象。所以,金字塔有4层,第四层:各种对象;第三层:具体类;第二层:抽象类(有多个层次);第一层:最顶层,只有一个抽象的根类。从金字塔层次看来,似乎只有单继承,其实不然的;如“水果”就不一定就是源自果树,它也可能来自植物藤类。就拿衣服类来说,衣服,春、夏、秋、冬衣服,长衫,短袖,棉衣等等都是抽象类;自然界太多的抽象类了。可以说,抽象类、具体类、个体对象充满了我们的世界。我们的语言就是对它们及相互关系的描述;计算机语言也应该如此!
在面向对象领域,抽象类主要用来进行类型隐藏。我们也可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。
抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化对象的。
1))、语法:
抽象类中除了抽象属性,还可以有抽象方法,也可以有普通方法,抽象方法只可以被声明,不能被实例化(就是不能有方法体),必须由继承该抽象类的普通类来实例化。如棉裤,茶 杯,服 装,放 大镜等等;自然界抽象类的多继承比比皆是;APO也是很自然的支持抽象类的多继承;使用Abstract 声明抽象类。
抽象类也有方法的抽象。例如动物是一个抽象类,他的移动方法还没有确定,因为有的动物是四条腿移动,有两条腿移动,有的飞,有的爬,但是他们都能移动,这样你可以把动物定义为抽象类,将动物的移动方法定义为抽象方法,强制继承它的子类去实现。而且你在动物这个类中移动虽然没有实现,但是可以调用他。
2))、接口
接口(interface)其实就是一个特殊的抽象类;是抽象类的变体。差别在于接口中的方法必须都是抽象方法,不可以有普通方法而已。既然是一种抽象类,接口就只能继承其它接口,抽象类和普通类也可以继承接口和抽象类。在APO中,抽象类可以包含接口!接口可以只是抽象类的行为部分。
接口是对具有的动作能力预定义,抽象类是对具有的动作的抽象。接口是对动作的抽象,抽象类是对根源与动作的抽象。抽象类表示的是,这个对象是什么?做什么;接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它。接口是一种规范和标准,用于约束类的行为,接口可以将方法的特征和实现分割开来。抽象类中可以加入非抽象的方法,而接口是不能的。抽象类是对象的抽象,然而接口是一种行为规范。抽象类对于提供模式、蓝图和后代类遵循的原则有用,如果遵循了蓝图的语义,后代类的行为可能按抽象类提供者和使用者所期望的那样。抽象类将事物的共性的东西提取出来,抽象成一个高层的类。子类由其继承时,也拥有了这个超类的属性和方法;---也就实现了代码的复用了。子类中也可加上自己所特有的属性和方法;----也就实现了多态。接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法等。
接口(Interface)是用来定义行为的!
APO中的抽象类(Abstract Class)是用来定义与实现行为的!
具体类()是用来执行行为的!
Interface接口表述“has a”关系,用于描述功能是用来说明它的是实现类是“做什么?”的;至于“怎么作?”,interface并不进行约束。而abstract class表述“is a”关系,它在描述功能的同时也通过具体实现部分功能的方式,来约束“怎么作?”。APO中的抽象类也可以有并不进行约束的方法,不就是放在接口上吧。
小结:APO的抽象类、接口首先是一个类;接口只是抽象类的行为部分。但接口包含的内容少,显得更抽象。
3))、实现简介
从上面看出,编译器的符号表很重要;它是电脑与人脑沟通的桥梁;它描述了类名、变量名等与机器数值的一一对应。所以,编写智能程序应该把符号表包含进去。我们人类用字符语言去描述世界,机器却是用数值去描述。从某个角度看,可以说抽象类的个体就是一个个类。而抽象类名又指向它们的派生类集;最后,构成一棵类树结构。类表是一个多树结构,表中的每一个节点都包含下一个分叉的节点数组――子类描述变量,也包含所有的上级节点数组――类继承关系变量。对于具体类还有方法表入口、属性表描述等。
(4)消息和方法
对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的进程号、对象名、发送给该对象的消息名(即对象名、方法名)。一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。
2、方法
类中操作的实现过程叫做方法,一个方法有方法名、参数、方法体。方法只有一份,供所有的同类的对象使用!而属性是每个对象一份,因为每个对象的都不一样。
方法重载:就是在同一个类中,方法的名字相同,但参数个数、参数的类型或返回值类型不同!实际上,还是调用不同的方法。
方法重写:它是指子类和父类的关系,子类重写了父类的方法,但方法名、参数类型、参数个数必须相同!覆盖==重写叫法不同罢了。实际上,父类的方法还在,只是本类的方法与父类的同名吧。
至于加载的意思,其实就是让编译器执行某段程序,可以是类可以是包可以是任何编译器能够编译的代码。
3、公有、私有
面向对象程序设计的重点是类的设计,而不是对象的设计。类可以将数据和函数封装在一起,其中函数表示了类的行为(或称服务)。类提供关键字public、protected和private 用于声明哪些数据和函数是公有的、受保护的或者是私有的。这些类型声明的具体的实现是由编译器来判断与进行的。
类是属性与方法的集合。而这些属性与方法可以被声明为私有的(private),公共的(public)或是受保护(protected)的,他们描述了对类成员的访问控制。
1)、公共的(public):公有是所有包括本类及外部类都可以调用。
2)、私有的(private):私有是只有本类可以