前面我们简单介绍了面向对象和面向过程的思维方式不同,简单理解就是面向过程方式主要关心的是流程化,而面向对象方式主要是找参与者,也就是找类,类是面向对象中最基本的概念,是面向对象分析OOA和面向对象设计OOD的基石,另一个基石是对象。
类和对象其实分不开的关系,就像鸡和蛋的关系,无法具体知道哪个先产生。只是我们设计类的时候先定义类,所以我们先介绍类的概念。
一、类
类是对象的模板,但是什么对象呢?这个我们留个花絮,在介绍对象之前我们先给类一个通俗的定义吧!
那就是多个相似事物的通称,是不是还有点难理解,那我就一个词一个词的解释一下。
这个词容易理解,就是有很多事物;单个事物不能形成类;
代表有相同的特征,但是也有不同的地方,比如: 张继科和林丹,他俩必定有相同的特征,都有鼻子眼睛嘴等等。但是也有不同的地方,比如他俩的身高体重等不一定完全相同, 他俩还有各自的功能,张继科打乒乓球的,林丹打羽毛球的。
这就是我们说相似而不是相同;
也比较好理解,还拿张继科和林丹举例子,他俩都可以统称为人类,但是不能说统称为张继科,张继科那就是具体的人了。按照上面的理解知道什么是类了吧。奥迪和宝马是不是一类呢,他俩都属于车,所以就是一个车类。
再比如波音和空机都统称为飞机,所以就是一个飞机类。我们再想一个问题,飞机和车是不是一个类呢,它俩都有发动机,可以统称为交通工具。说到这就有答案了,飞机和车是一个交通工具类。
说到这你可能就想到了所有的事物最终都可以有大的统称。那为啥还分那么多类呢,就设计一个大类呗。这就失去了面向对象思想的一个好处,可扩展性,举一个例子,如果只设计一个交通工具类,原先的需求就有飞机和汽车。
某天需要添加个轮船类呢,就要修改类的结构。反之只需要添加轮船类就好。通过上面的介绍,都知道类到底是个啥,设计类的时候按照具体的需求就好,需求和观察角度不同,设计出来的类可能都不同。
比如:设计一个交通工具类和设计一个汽车类都不一样。
我们上面是拿文字大概介绍的,拿张继科和林丹举例子他俩都有静态特性,是一个名词,比如年龄、性别等等。也还有动态的功能,是一个动词,比如都能打球、训练等等。
张继科和林丹不是类,是具体的个体,所以就需要抽取共同的部分抽取成人类。
可是对应到面向对象中咋设计一个类呢,分别用属性和方法表示,就是指静态特性,就是指动态的功能;简单判断标准就是名词是属性,动词是方法。我们用一个程序看一下。
/**
* 人类
*/
public class Person {
//属性,人具有的特征
String name; //名字
int age; //年龄
float height; //身高
float weight; //体重
String gender; //性别
//方法,人具有的功能
//方法可以访问属性
public String getName() {
return name;
}
public void playBall(){
System.out.println("打球!");
}
public void train(){
System.out.println("训练!");
}
}
上面的代码写出来我们并不能运行,一个类不能做事情,就比如一个人类能打球吗,显然不能,都是某个人能打球,所以我们需要一个类的实体来做事情。
二、对象
接下来我们该介绍什么是对象了,上面我们说过类是对象的模板,类都知道是什么了。对应的模板都知道是什么吧,一个使物体成固定型状的模具;
比如做蛋糕,你可以拿一个模具,然后把做好的面糊倒在里面放入入微波炉制作,制作完成之后模具中就有了一个具体的蛋糕。这个蛋糕和模具的形状基本就是相同的。
对应到面向对象思想中,这个做出来的每个蛋糕就是一个个对象,这每个蛋糕放在一起就是一个统称蛋糕,这其实就是一个蛋糕类。
蛋糕类是抽象的,也就是没有具体的实体,只是通过这个蛋糕模板可以知道大概的形状而已,通过微波炉制作的过程对应程序中就是实例化。
另外对象和类其实是相对的概念,上面谈过观察角度不同,类的设计不同,这样的话对应的对象也不同。比如以车作为参照标准来说,车是一个类,具体的奥迪就是一个车的对象,它是一个车的具体品牌。
ok说到这我们要说一下类和对象的联系:现实对象(归纳概括)--->现实类(抽象模拟)--->软件类(实例化)--->软件对象--->程序
现实类和对象就是我们现实世界能看到的东西吗,软件类和软件对象就是软件设计和运行中产生的
我们对上面的类进行一下实例化,创建具体的对象,先用图展示一下
/**
* 创建一个张继科的对象
*/
public class TestPerson {
public static void main(String[] args) {
//先创建一个具体的空人,也就是空对象
Person person=new Person();
person.name="张继科"; //设置名字为张继科
person.play();//调用人类的方法,这个名字为张继科在打球
}
}
通过上面的介绍也就可以理解说:类是对象的抽象,对象是类的实例化了。那抽象是什么呢?抽象其实就是把像的部分抽取出来 ,而抽象的作用就是:隔离关注点,降低复杂度。就比如设计交通工具类,不划分类别的话,都集中在一起的话,那么我们的程序得多复杂凌乱。