一、面向对象编程概述
面向对象编程(Object Oriented Programming,缩写为OOP)是当今最流行的程序设计技术,它具有代码易于维护、可扩展性好和代码可常用等优点。面向对象的设计方法的基本原理是按照人们习惯的思维方式建立问题的模型,模拟客观世界。从现实世界中客观存在的事物(也就是对象)触发,尽可能运用人类的思维方式来构造软件系统。而java就是一种面向对象的程序设计语言。
二、面向对象编程的基本概念
1、 类 (Class)
类是对某一类对象的抽象,是对象的集合。类是具有相同属性和行为的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。可以说类是对象的抽象化表示,对象是类的一个实例。
类是一种数据类型。类是面向对象程序设计的核心,它实际是一种新的数据类型,也是实现抽象类型的工具,因为类是通过抽象数据类型的方法来实现的一种数据类型。类是对某一类对象的抽象;而对象是某一种类的实例,因此,类和对象是密切相关的。没有脱离对象的类,也没有不依赖于类的对象。类是定义同一类所有对象的变量和方法的蓝图或原型。例如,可以建立一个定义包含当前档位等实例变量的自行车类。
2、对象 (Object)
对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。在面向对象的程序中,对象就是一组变量和相关方法的集合,其中变量表明对象的属性,方法表明对象所具有的行为。
3、消息 (Message)
对象之间相互联系和相互作用的方式称为消息。,一个消息只要由5个部分组成:发送消息的对象、接收消息的对象、传递消息的方法、消息的内容以及反馈信息。对象提供的服务是由对象的方法来实现,因此发送消息实际上就是调用对象的方法。通常,一个对象调用另一个对象中的方法,即完成了一次消息传递。
三、类的理解
看完以上的内容,对于第一次接触这些概念的人来说肯定很不理解 ,我们可以这样来理解,这里要特别留意上面的两句话:“面向对象的设计方法的基本原理是按照人类习惯的思维方式建立问题的模型,模拟客观世界。从现实世界中客观存在的事物(也就是对象)触发,尽可能运用人类的思维方式来构造软件系统。”
首先由理解什么是“人类习惯的思维方式”,简而言之其最重要的特点就是“抽象”,比如下面的一些词:
汽车、手机、水果、包子、学生、用户、教师、游客、电脑、书、博客、论坛、帖子、管理员
以上所有的词都是某类概念的抽象,说到这些词每个人都能理解其中包含的意思,为什么每个人都能理解呢?因为这是我们人类习惯的思维方式,也就是每个人都是如此去思考和表示问题的(或者说我们从小打到自然而然的学习和被传授按照这样理解事情),这是人类几千年来沿袭传承下来的人类思维模式,用生物学进化理论解释就是用进废退、适者生存,这种思维方式是自然选择的结果,是人类(各个国家)思维目前最优化的模式。
有了这种抽象的思维模式,将这些词和其它的一些动作组合起来,就成了句子(词→句),比如下面的语句。
- 我要买个车。
他是一个好人。
去买瓶水喝。
交通太堵了。
今天中午吃的米饭
那个小孩真可爱。再将句子组合起来就成了文章(词→句→文章),这样就能和能清晰地表达出人们的思想了。
平时我们做事说话就是诸如上面的类似的话。上面的话都有一个特点,内容基本都是“抽象”的词语组成的,但要描述更为具体详细的内容这样肯定不行,即你很难从这些话中得到具体详细的信息。
比如下以“我要买个车”,这句话为例。
我要买个车。 买货车?卡车?汽车?如果买汽车,是买国外品牌还是国内牌,如果买国内品牌是买国内合资车还是自主品牌车?买自主品牌车是买吉利还是比亚迪还是其它的品牌,买吉利是买*舰、熊猫还是别的牌子,买*舰是买低配还是买高配的?买低配的是买黑色的还是银色的?……。
诸如此类的问题课可以提出一堆,但是我们用“我要买个车”这一句话从某种意义上来说来替代了 ,这就是抽象,我们把一个具体的行为抽象出来就变成一个可以替代一系列动作和行为的概念属性。
上面主要是围绕“车”为主题展开的,因此可以抽象出一个宏观的名称为“车”的概念,那么与车有关的品牌归属地、品牌名称、型号、颜色、等就称之为 概念的“属性”、而车可以开灯、转向、行驶、播放音乐等具有 动作的行为就叫做概念的“方法”。
实际上各种抽象出的概念都可以通过其属性 和方法进行描述。
通过概念的名称、属性、方法,就可以描述概念的本质特性(也就是说使用一个概念所具备的“属性”和“方法”,能够很清晰的描述出它的本质和特殊,以便于区别于其它的概念)。
那么,人类思维的抽象性,即这些抽象概念,如何转换应用到计算机的软件开发中呢?或者说软件设计、编程中如何体现出符合人类思维习惯的程序设计模式呢?人类思维的抽象性与面向对象的程序设计方法如何对接呢?
这里接着上面对“车”的分析,前面的“车”为一个抽象出的概念,“车”具有相关的属性和方法,通过“车”这个名称、属性和方法可以将车的本质定义出来,就和其他的概念可以区别开来。同样在软件开发中,假设现在有个“汽车销售系统”,这个系统跟“车”有关,相应的我们就称呼前面各种抽象出的概念称之为 “类”,“类”有名称、属性和方法,这个类就和其它的“类”区别开了,简而言之,就是软件系统中将人类思维中的各种“概念”称之为“类”。
在jav面向对象的程序设计中,类也是一种特殊的数据类型,比如第一个程序 HelloWorld中,就建立了一个简单的类HelloWorld,你可能会有疑问,这个“类”与前面说的概念扯不上关系啊!呵呵,这个类,我们不妨称之为 “打招呼”类,这个类只有一个主方法,那就打印输出一句话。比如中国人见面经常问道“吃了吗”,而美国人见面经常说“今天天气真好!”
实际上从使用软件的用户角度来说,使用软件的核心过程抽象出来就是两个方面,即:信息的录入与保存、信息的读取与显示。而对于软件设计者来,抽象出来的过程还包括一个方面,即信息的处理。
比如使用搜索引擎的过程,对于使用者来说就是:
1、进入搜索页面,输入关键词 ,单击“搜索”按钮。这就是信息的录入。
2、页面弹出相关搜索链接,用户单击某个链接进行相关网页查看搜索内容。这就是信息的读取与显示、
对于程序设计者来说其过程是:
1、设计让用户输入搜索关键词的页面(这可以设计个“关键字”类)
2、用户单击“搜索”按钮后,根据用户输入的关键字,通过相应的搜索算法到数据库中将相应的链接信息以跟关键字符合度按照条目的方式显示在页面*用户选择。(这可以设计个“搜索”类)
3、用户单击某个链接后找到相关页面去。(这可以设计了“链接”类)
当然这是抽象出来的过程,实际的搜索引擎程序是很复杂的,但在程序设计时可以将复杂的运算和处理过程用简单的抽象语言描述出来,以方便软件的分析和设计,通过这种方法能够大大降低软件设计的难度,同时也很便于日后的维护和拓展,就如同建筑框架定好后,细节可以不断完善。
又比如“图书借阅系统”主要由那些功能呢?可以做出如下分析:1、与“图书借阅系统”相关的人员有 图书管理员、借阅者2、联系图书管理员和借阅者的就是图书。相应的至少应该有三个类:图书管理员类、借阅者类、图书类
图书管理员类包含了姓名、年龄、电话等属性,以及添加借阅者、删除借阅者等方法。 借阅者类包含了姓名、年龄、电话等属性,以及注册借阅者、注销借阅者等方法。图书类包含了书籍名称、出版时间、价格等属性,以及查阅图书、借阅图书、归还图书、注销图书等方法。在这里,分析图书借阅系统的类时,可以通过所有涉及到系统的人、物以及他们之间的关系和行为的流程进行一定的分析从而设计出类,类的属性就是系统所要处理的信息,类的行为就是如何进行信息处理的方法,类分析清楚了,软件系统基本上就成型了。四、对象的理解类是一个抽象出的概念,如同上面的图书借阅系统中的图书类,该类是一个模板。而图书有成千上万种,每一本书都是一个具体的对象,即使是相同的两本书也要有不同的图书编码,以示区别,在实际借阅图书的过程中,处理的必然是一本本图书,即具体的对象,而不是一个宏观的“图书”类(概念)。因此在实际的程序设计和处理中,当定义好了图书类后,在进行相应的处理时,比如将类实例化为对象,也就是具体的某本书,而不是图书类。因为我们不可能将每本书都建立一个类,这样反而将问题复杂化了。举例:定义一个Book类,定义类的属性
BookName,实例化类的两个对象b1、b2,并打印对象的属性值。
public class Book
{
String BookName; //定义类的属性
public static void main(String[] args)
{
Book b1=new Book(); //类的实例化对象b1
Book b2=new Book(); //类的实例化对象b2
b1.BookName="软件工程"; //为对象的属性赋值
b2.BookName="java基础";
System.out.println(b1.BookName);
System.out.println(b2.BookName);
}
} 运行程序,将输出两本书对象的书名。
以上程序可以换一种写法如下,实现的功能是一样的
public class Book
{
String BookName; //定义类的属性BookName
//定义类的方法,设置书的名称
void setBookName(String bookName)
{
this.BookName=bookName; //将传递过来的变量值bookName赋值给类的属性BookName
}
//定义类的方法,输出书的名称
void getBookName()
{
System.out.println(this.BookName);
}
public static void main(String[] args)
{
Book b1=new Book();
Book b2=new Book();
b1.setBookName("软件工程"); //调用类中定义的方法setBookName,为实例化的对象b1的属性BookName赋值
b2.setBookName("java基础");
b1.getBookName(); //调用类中定义的方法getBookName,输出对象b1的BookName值
b2.getBookName();
}
}
这个例子中就完整了设置了 类的属性、方法、实例化对象,调用类中定义的方法从而处理对象的值。
在程序设计中,首先定义了类、类的属性、类的方法,然后实例化类对象后,类对象再调用类中定义的变量和方法进行数据信息的处理,这个顺序是固定的。
把类称之为“模板”,如同定义一个“Book”类模板,这是各种各样的书中提取了其共性而设计出的模板,它不针对某一本书,而是针对所有的书,其本身是不能处理数据信息的,必须由其实例化后,每一个对象代表了一本书,从而能对该对象所代表的某本书进行数据信息的处理。这里只是模拟了一个简单的例子,实际的程序设计要复杂的多。