本讲内容:面向对象的概念和发展、面向对象的特征
一、面向对象(Object Oriented)编程语言的历史
1950年有个叫做荷兰德的学生作为程序员进入IBM的时候,这个世界上的程序员只有几个而已。当时计算机很少,计算机性能也差,程序员也少,加上程序员都是天才中的天才,智商超高,所以他们用十六进制的机器编码来操纵计算机,似乎没有什么问题。
1960年,计算机性能不断提升,应用领域也不断增多,程序员的人数也在增多,程序的复杂程度也不断提高,很多程序需要好多人一起才能完成。而在此时在大型项目中由于软件的原因导致的大量问题也不断暴露出来。由此催生了结构化程序设计方法。结构化程序设计思想采取了模块分解和功能抽象的方法,把一个个复杂的问题,分解成一个个易于控制的子程序,便于开发和维护,因此结构化程序设计迅速走红,并从70年代起逐渐占据统治地位。
70年代末,随着计算机科学的发展,结构化程序设计方法也渐渐显得力不从心。于是面向对象设计思路和语言慢慢浮出水面。
1967年挪威两个科学家发布了simula语言(simulation模拟、仿真),它引入了后来所有面向对象程序设计语言都会遵循的几个基础概念:类、对象、继承。虽然因为simula比较难懂、难学,功能不完善而没有流行开来,但是它的思想却指导着计算机这数十年的编程实践。
1972年诞生的smalltalk,被公认为是历史上第二个面向对象的程序设计语言,和第一个真正的集成开发环境(IDE),smalltalk对 Java 、Objective-C 、Ruby 的诞生都起到了极大的推动作用。90年代的许多软件开发思想,如设计模式、敏捷编程和重构等也都源自于smalltalk。在smalltalk里所有的东西都是对象,15*19 会被理解成向15这个对象发送一个乘法的消息,参数是19。
1985年c++商业版本的正式发布,标志着一个面向对象领域里的王者诞生了。C++在c语言的基础上,借鉴了simula中类的概念、从algol语言中继承了运算符重载、引用以及在任何地方都可以声明变量的能力,从BCPL获得了//注释,从Ada语言中得到了模板,命名空间,从Ada、Clu和ML去取得了异常……C++是第一个广泛流行起来的面向对象的编程语言,至今魅力不减。
1995年Java诞生的故事大家都耳熟能详了,我们也知道Java是C++的语法与Smalltalk语义的结合。由此面向对象领域里又一个王者诞生了。
Java里面向对象的概念六次讲座也就可以讲完。不要怕,这些概念很好理解;不要轻视,很多深层的思想需要在实践中不断思考和分析才可以领悟。
二、类和对象的概念
1、类和对象的概念
人类自古就喜欢听故事,也喜欢写故事,我们从小也被要求写作文,为了帮助你写作文。老师还总结了一些规律,譬如记叙文六要素:时间、地点、人物、起因、经过、结果。 有了这样指导性的东西,我们写作文的时候就简单了许多。
面向对象程序语言的核心思想就是把一个事物的状态和行为封装起来作为一个整体看待。类描述的就是对象知道知道什么和执行什么。
譬如我们用面向对象的思想来看待一架飞机:
如果我们站在顾客角度看飞机,那么它的状态是名字波音777,座位数380人,飞行速度940公里每小时,它的行为就是飞行,能把你从A地送到B地。
如果站在航空公司角度看飞机,那么它的状态是名字波音777,资产编号HNHK20100321,购买价格18.7亿人民币。它的行为就是能赚钱。
我们从不同角度去看待和抽象同一架飞机它的状态和行为不相同。
再从面向对象的角度看待一个家乐福超市的员工王丽:
她在上班的时候是个收银员,那么她的状态是编号067,她的行为就是收银。她下班以后去家门口的小店买菜,那么他的身份就是顾客,她的状态是有个购物商品清单,她的行为就是付款。
我们从不同的角度和时间去看待同一个人,她的状态和行为也是不相同的,甚至看起来是相反的。
好了,我们自己尝试分析一下,电脑的状态和行为,手机的状态和行为,桌子的状态和行为,QQ的状态和行为,小狗、小猫、老虎、大象、蚊子、苍蝇…… 有一个简单的方法区别什么是状态什么是行为:就是状态是个名词,行为是个动词。
2、类和对象的关系
类是对象的蓝图,它告诉虚拟机如何创建某个类型的对象。对象是根据蓝图建造出来的实例。
譬如我们设计一个模拟WOW的格斗游戏,需要人或者怪兽来战斗吧,战斗需要武器吧。那么圣骑士就是个类,人类圣骑士“锦马超”就是一个对象。如果双手剑件是个类,那么拿在“锦马超”手里的“霜之哀伤”就是一个对象。
譬如我们要建立一个全班同学的通讯录,设计一个通讯录的格式,包括姓名、性别、手机号、QQ号、宿舍号。然后我们按照一定的格式印出来,交由每个同学填写,那么每个同学填写的那一份就叫对象,我们填写的通讯录格式本身就是类。
譬如由一个寂寞的老人需要找个伴,要求:随时都可以陪着他,还不唠叨。有人带了一条狗。那么老人提的需求就是蓝图,就是类。狗就是对类的实现,就是对象。
3、定义类,创建对象
下面我们学习如何用Java的程序代码来定义类、创建对象。
定义一个类的步骤是:定义类名,编写类的属性(状态),编写类的方法(行为)
public class Dog {
// 定义了狗的个头大小的属性
private int size;
// 定义设置个头的方法
public void setSize(int size) {
if (size > 0 && size < 10) {
this.size = size;
} else {
size = 1;
}
}
// 定义获取个头的方法
public int getSize() {
return size;
}
// 定义狗叫的方法
public void bark(){
if(size<5){
System.out.println("汪汪汪!");
}else{
System.out.println("嗷!嗷!");
}
}
//定义main方法
public static void main(String[] args) {
//创建了名字叫小黄的狗对象
Dog xiaoHang = new Dog();
//设置它的大小属性
xiaoHang.setSize(3);
//调用它的叫方法
xiaoHang.bark();
//创建了名字叫大黄的狗对象
Dog daHang = new Dog();
//设置它的大小属性
daHang.setSize(7);
//调用它的叫方法
daHang.bark();
}
}
运行程序查看运行结果:
三、面向对象的三大特性
封装、继承、多态是面向对象的三大特性。这里先让大家有个概念,通过今后漫长的学习过程不断加深对它们的理解。
封装(encapsulation):就是把属性私有化,提供公共方法访问私有对象。 这里面有两层意思,第一隐藏数据,第二把数据和对数据操作的方法绑定。
实现封装的步骤:
1 修改属性的可见性来限制对属性的访问。
2 为每个属性创建一对赋值方法和取值方法,用于对这些属性的访问。
3 在赋值和取值方法中,加入对属性的存取限制。
封装的优点:
1 隐藏类的实现细节;
2 可加入控制逻辑,限制对属性的不合理操作;
3 便于修改,增强代码的可维护性;
这里举一个智能冰箱的例子(可乐灌装工厂也可)。
public class Lesson07 {
private String 牛奶="一瓶牛奶";
public String 得到牛奶(){
System.out.println("给出了"+牛奶);
return 牛奶;
}
public void 设置牛奶(String s){
this.牛奶=s;
}
public static void main(String[] args) {
Lesson07 lesson = new Lesson07();
lesson.得到牛奶();
lesson.设置牛奶("一罐牛奶");
lesson.得到牛奶();
}
}
继承(inheritance):同类事物之间有它的共同性也有各自的独特性,我们把共同的部分抽离出来,就可以得到使用这些事物的一般性的类,我们在把那些具有特殊性的共同点再次抽象就可到了一些具有特殊性的类。而特殊类拥有一般类所具有的一般性属性和方法,也拥有自己特有的某些属性和方法。我们把特殊类和一般类之间的关系叫做继承。
举个例子:马儿都有四条腿,马儿都有会跑,我们把这些共同性抽象出来就成了马类;而其中有一些马是白色的马,还有一些是黑色的马,我们把这些特殊性也分别抽象出来,就成了白马类和黑马类。那么白马类和马类之间的关系就是继承关系。它们是父子关系,马类是夫类、白马类是子类。
继承简化了人们对事物的认识和描述,清晰的体现了相关类间的层次关系。
继承达到了功能抽象、继承促进了代码复用、继承也带来了多态性。
这里先对继承有个概念,下面还会有详细的讲解。
多态(polymorphism):多态就是“一种定义、多种实现” 。Java中可以把一个子类的对象赋给一个父类的引用,这就出现了多态。这里先对多态有个概念,下面还会有详细的讲解。
这一讲里我们迈入了对象的世界。学习了类和对象的概念,并对面向对象的特点有了初步的了解,从下一讲开始将近距离接触它们。
好,本讲就到这里。