这一章我将介绍以下的内容:
- 对象与类关系的理解
- 对象和类的主要特性
- 引出三大特性和面向对象的软件开发的生命周期
类与对象的概念
什么是类?什么是对象
引用《Java核心思想》中的一句话:“类是构造对象的模板或蓝图。”
简单地说,类是一系列具有相同或相似特征的对象的一种抽象概括。我想用两个世界来描述:一是我们所处的真实的世界,一是面向对象的语言的世界。面向对象世界中对应的“类”的概念在真实世界中并没有具象的体现。而对象是有具象的体现的:你正在浏览的显示器,你的鼠标,甚至你自己都是对象。对象是现实生活中真实存在的个体。
而“类”则是一个模板,一个概念,是人类大脑进行抽象的结果。譬如:生活中有猫对象,鸟对象,狗对象,人类经过抽象的思考,发现他们都有一些共同的特征,比如都能对外界的反应做出移动,捕食其他生物等,我们把这些特征进行抽象总结,形成一个模板:称为“动物类”。
描述一下现实生活中软件开发的过程
- 程序员观察整个现实世界,在现实世界中寻找对象
- 在观察了n个对象之后,发现对象的共同特征
- 程序员在脑中形成一个【模板】——类
- java程序员通过java代码来描述一个类
- java中有了类,再用类来创建对象,我们把这个过程称为“创建类的实例(instance)”,也可以说通过类来实例化对象。
- 有了对象之后,让对象协作起来,形成一个系统。
类-------实例化------->对象
(对象又被称为Instance)
对象-------抽象-------->类
重点:类描述的是对象的共同特征,例如身高,体重,肺活量等。
而这个身高特征在被访问的时候,必须先创建对象,通过对象去访问这个特征。因为这个特征具体到某个对象上之后,值不同。有的对象升高1.80m,有的对象身高2.80m。而类是一个抽象的概念,是无法通过一个抽象的概念去访问一个具体的数据属性的。
一个类主要描述什么信息呢?
一个类主要描述:状态 + 行为
状态–>类的属性
行为–>类的方法
我们以学生类作为例子说明:
学生类是描述所有学生对象的共同特征。这些特征被划分为状态特征和行为特征。
学生对象有哪些状态信息?
- 学号 int num
- 姓名 String name
- 年龄 int age
- 住址 String address
- ……
这些属性,即状态信息通常是以变量形式定义的。
学生对象有哪些行为信息?
- 听课
- 写作业
- 吃饭
- ……
这些行为信息,通常是以“方法”形式定义的(C语言选手可以暂时将“方法”理解为C中的函数的概念)
public class Student {
//状态信息【属性】——
int num;//学号
int age;//年龄
String address;//地址
String name;//姓名
//行为信息【方法】——
public void listen() {
System.out.println("我在听课!");
}
public void doHomework() {
System.out.println("我在写作业!");
}
public void eat() {
System.out.println("我在吃法!");
}
//此部分代码为构造器,后面会详细说明,暂且忽视
public Student() {
}
public Student(int num,int age,String address,String name) {
this.address=address;
this.age=age;
this.name=name;
this.num=num;
}
}
public class StudentTest {
public static void main(String[] args) {
Student Blanche=new Student(191601,19,"Mount_Huang","Blanche");
//我想要访问这个Blanche学生的姓名:
System.out.println(Blanche.name);
//我想要访问这个Blanche学生的年龄:
System.out.println(Blanche.age);
//上述的访问其实是不安全的,后续我们在讲解面向对象的“封装性”时,会详细讲解改进
//我想让Blanche同学吃饭:
Blanche.eat();
//我想让Blanche同学写作业:
Blanche.doHomework();
/*上述代码运行结果:
* Blanche
19
我在吃法!
我在写作业!
*/
}
}
总结起来,一个java中的一般的类(有特殊情况)通常以下面的形式呈现
[修饰符列表] class 类名{
属性// 描述对象的状态信息
方法// 描述对象的动作信息
}
正如上面的代码所展示的那样,java的代码都位于某个类的内部。而且标准的java库本身也为程序员提供了很多的类,日期类,数学工具类等,但鉴于具体的业务需要,很多的类我们还是要自己去编写,来描述所需要的对象。
从识别类开始,到面向对象开发的三个过程
面向对象开发的三个过程:
- OOA:面向对象分析法。
- OOD:面向对象设计。
- OOP:面向对象的编程。
OOA:A是Analysis的缩写,即面向对象的分析过程。面向对象的分析主要有这以下几个过程:
- 确定类和对象:
学过C语言的程序员一般写程序都是从main函数着手开始编写代码。而在OOP的开发过程中我们应该从类的设计开始编写代码,进而编写类所代表的的一类的对象的属性和方法。
识别类的简单的规则则是在解决问题的过程中寻找名词,而方法则对应着动词。
我们模拟这样一个过客用信用账户去某宝购买商品的情景;
在这个情景下出现了以下几个名词
- 账户—(Account)
- 顾客—(Customer)
- 地址—(Address)
- 商品—(Goods)
- 购物车—(Shopping_Cart)
- 商家—(Merchant)
这些名词则可能成为账户类,顾客类,地址类等;
而在这个情景中也会出现一些动词,比如顾客下单添加了商品进入购物车,商家划走了顾客账户上的对应金额,将货物打包送到对应的顾客的地址。
那么账户和购物车应该是顾客的一个属性,而顾客同时又购买的动作,或者说是方法。商家则会拥有购买商品的顾客的一些信息,比如顾客的地址等,商家会通过地址使用“发货”这一方法,或者说动作实现交付货物。
在这样一个过程中购买和发货这样的动词则成为顾客和商家的方法,或者说是动作信息。
当然具体的类的设置还是和具体的开发需要挂钩,并不只是“找动词,找名词”这样粗暴的过程。
- 确定类之间的关系
- 关联关系:has a
- 依赖关系: uses a
- 继承关系: is a
① **关联关系(has-a):**在上面的情景的描述中,我们提到了账户,地址和顾客应该都是一类事物,即“类”;同时我们说“顾客”有一个(has a)“账户”,“顾客”有一个(has a)“地址”。
我们把这样的A类对象包含B类对象的关系成为“聚合”关系或者“关联”关系,很简单的可以用"has a"来理解:如果A has a B,那么A和B具有关联关系。
② **依赖关系(use-a):**还是上面购物的情景,我们知道商家要通过访问顾客的信息来得到顾客的地址,从而完成发货。如果一个类的方法操纵另一个类的对象,那么我们说这两个对象之间是一种“依赖关系”。
③继承关系(is-a): 我们假设有洗护用品商品和零食商品,这两个商品对“商品类”来说都是商品类的子类,商品类则是他们的父类,构成“继承关系”(后面会详细说明继承)。
- 确定主题
指事物的具体概貌和分析。 - 确定属性
这里的属性只的就是对象具有的属性,比如顾客的姓名,地址,银行账号等,这行即是对象具有的属性,这些属性(状态信息)通常是以变量的形式定义的。后面我们将会详细介绍实例变量和静态变量等…… - 确定方法
方法指得是对象具有的动作信息,可以是跟某一个对象息息相关,也可以是和某一个具体的对象无关,只和和类有关。后面的博客也将说明。
更新中……下一篇将说明对象的创建,面向对象的封装性等信息,从而把OOD和OOP慢慢串联上……