对象与类:打开java世界的大门
这一章我将介绍以下的内容:
- 对象与类关系的理解
- 对象和类的主要特性
- 引出三大特性和面向对象的软件开发的生命周期
类与对象的概念
什么是类?什么是对象
引用《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慢慢串联上……
- 打开Java的大门,寻找新世界的OnePiece
- Hadoop打开大数据新世界的大门(Hadoop介绍)
- 打开神秘编程世界的大门
- 如何突破算力的界限,打开智能世界的大门?
- 打开容器世界的大门: Docker、POD 初探
- MontionLayout:打开动画新世界大门(其一)
- 打开神秘编程世界的大门
- 如何突破算力的界限,打开智能世界的大门?
- 打开神秘编程世界的大门
- 略懂Java编程(一):Java世界里的对象
- Java基础:第二十五讲 软件系统的对象与现实世界对象的关系
- 打开新世界的大门
- Java技术提供了从现实世界到应用软件世界的对象建模能
- 新世界!打开Selenium和PhantomJs的大门!--爬虫福音
- PHP给我打开程序世界的大门
- C++精品视频课程推荐-开启面向对象世界的大门!
- Python与量化投资:用最贴近人的语言打开新世界大门!
- 点验打开新世界大门,再也不用担心短信验证码占据信箱
- C++精品视频课程推荐-开启面向对象世界的大门!
- 黑马程序员——Java的内存世界:面向对象的概念以及对象的建立过程