对象和类的理解

什么是对象

程序中的对象是对现实对象的抽象。现实中的对象包括可感知的物体以及思维中的概念。例如,天鹅、闹钟、飞机等各种物体可以看做一个个的对象,学校、公司、家庭等概念也可以看做一个个的对象。现实对象有一个特点,即它是具有属性和行为的整体。例如一个闹钟具有当前时间刻度、预定时间等“属性”,并具有指示时间、响铃等“行为”;而学校则具有学生、教师等“属性”,并具有招生、教育等“行为”。在程序中,属性可以抽象成数据,而行为可以抽象成函数,一个数据和函数的集合就构成了一个对象。

提示

程序中的对象是一个整体,其属性和行为不可分离。要访问对象的属性(数据)和行为(函数)只能通过对象进行。例如要查看闹钟的“当前时间”或“预定时间”,只能通过闹钟这个对象进行,指示时间和响铃也只能通过闹钟进行。由此带来的一个好处是可以对相关的数据和函数按照需要分类管理,从而提高程序代码的可读性,以及软件的可维护性。

例如,在程序中表示一个闹钟对象,可以先定义一个表示时间的结构体Time(其成员可以是三个整数,分别表示时、分、秒),然后用Time的两个变量分别表示“当前时间”和“预定时间”属性。对于“指示时间”和“到时响铃”两种行为,可以分别用两个函数表示,如图12-1所示,左图是现实中的闹钟对象,右图是程序中的闹钟对象。

什么是类

无论是在现实世界中,还是在程序中,对象都是一个完整的个体,而这些个体都可以按照某种规则进行分类。例如一个闹钟就属于闹钟类,一个三角形就属于三角形类。分类的规则是对象的属性相同(数量相同,类型也相同),行为也相同。

例如所有闹钟都具有形状、当前时间、预定时间等属性。这些属性的个数相同,不同闹钟的相同属性的类型也相同。另外,所有闹钟都具有指示当前时间、到时响铃等行为。因此,所有的闹钟都可以归为闹钟类,如图12-2所示。

说明

同一类的不同对象是靠属性值区别的。例如在图12.2中,各个闹钟的“形状”属性互不相同,当前时间和预定时间属性值也都不尽相同,由此可以区分不同的闹钟对象。如果同一类的两个对象的属性值完全相同,则两个对象就是相同(相等)的。

为了在程序中表示一个对象,应当采用一种特殊的数据结构来集成数据和函数。在C语言中结构体虽然可以用来集成数据,但不能用来集成函数。所以C++语言采用了特殊的数据结构类(class)来集成数据和函数,而类的变量就是对象。同结构体一样,类也是可以自定义的,即开发者可以设置类中包含的数据以及函数。例如,一个闹钟类的定义如下:

class AlarmClock

{

public:

void  showCurTime();                   // 显示当前时间

void  setAlarmTime( Time alarmTime );  // 设定响铃时间

void  alarm();                         // 响铃

private:

int  m_shape;                          // 闹钟的形状编号

Time  m_curTime;                       // 当前时间

Time  m_alarmTime;                     // 响铃时间

};

类与对象的关系就是类型与变量的关系。在程序中要使用一个对象,就用这个类声明一个变量,这个变量就是所需的对象。例如声明并使用一个闹钟对象:

AlarmClock clock;                      // 创建一个闹钟对象

clock.showCurTime();                   // 显示闹钟的当前时间

clock.alarm();                         // 响铃

提示

本节只给出了类的简单定义,有关类的详细说明,请参考下一章的内容。

对象的特征

对象有三个重要的特征:封装性、继承性和多态性。由于程序中的对象是对现实对象的模拟,所以在学习对象的时候,读者也可以将这两种对象对比起来理解。

封装性

对象从组成上来讲是数据和函数的集合。但是对于对象的使用者而言,并不能访问这个集合中的所有部分。使用者只能访问对象暴露出来的、可以被外部使用的部分,这些部分也可以看做对象的接口。而其他未暴露出来的部分则是对象的私有属性或者私有函数。私有属性和私有函数是为了实现对象的接口而存在的。

在前面的插图中,闹钟的时间、闹铃属性以及指示时间、到时响铃行为就是闹钟对象的对外接口,即外部使用者能够访问到的部分。而为了实现这些属性和行为,在对象的内部往往还有一些隐藏的部分,比如指针转动速度、预定响铃时间等私有属性,以及驱动指针转动、计算是否到预定时间等私有函数。

程序中的对象具有封装性,这一点同现实中的对象是一致的。人们在使用闹钟时,根本不需要知道其内部是怎么实现的,而设计闹钟的人也无意向用户暴露其中的细节。

继承性

继承是一种逻辑上的层次关系。在人类的思维中,有这样一种层次性的分类方法,即将一些事物按照一般到特殊的关系,先分成大类,再分成小类,各个小类也可以继续细分。大类与小类就构成了一种逻辑上的层次关系。大类(高层的类)称做基类(或者父类),小类(低层的类)称做派生类(或者子类)。基类与派生类的关系就是继承关系,派生类继承自基类。

多态性

多态性指的是同一行为在基类和派生类间,以及各个派生类间的表现并不相同。这里所说的同一行为,指的是在基类里定义并由各个派生类继承的函数。由于基类在定义这个函数时考虑的是一般的情况,并没有针对各种特殊情形,所以派生类往往需要重新定义这个函数。当系统运行时,虽然使用的是同一个函数名,但具体调用的函数却是被派生类重新定义的版本。由于不同的派生类有不同的定义,从而一个行为就会表现出不同的形式,也就是多态。

例如对于各种学校类,作为学校的基本功能,定义基类“学校类”时就应当定义招生、教育、考试等各种行为。但对于各种具体的学校类,如小学、中学、大学等,这些行为又是有差别的,必须根据各自的具体情况进行重新定义。当说一个学校招生时,不同的学校有不同的招生对象、方法等,所以招生这个行为就在不同种类的学校间表现出了多态性

原文地址:https://www.cnblogs.com/tangjunjun/p/11676489.html

时间: 2024-11-07 23:11:11

对象和类的理解的相关文章

core JAVA 学习篇之深入理解对象与类

一.面向对象概述 1.面向对象程序设计(OOP): (1)由对象组成,每个对象包含,对用户公开的特定的功能部分,和隐藏的实现部分. (2)如果对象能够满足需求,则不必关心其功能的实现过程. (3)与结构化程序设计区别: 结构化程序设计:Algorithms + Data Structures = Programs;算法是第一位的,数据结构是第二位的.程序员首先确定如何操作数据,然后确定如何组织数据. 面向对象程序设计:Data Structures + Algorithms = OOP:OOP将

关于对象、类、属性和方法的理解

文章开头申明:半路出家的野路子,可能个人理解有所欠缺,希望不吝赐教. 在初步学习java的过程中,往往都是绕不开面向对象的思想,说到对象或许挺多初学者和我一样只是听说过一个"万物皆对象"的说法,简单的记下对象包含属性和方法,然而实际使用的过程中往往有忽略这些东西,也就是犯浑了.个人的理解是希望将对象.类.属性和方法用一个例子来简单说明. 打个比方说我到商场买手机这个例子吧.我到了商场买手机,第一步自然就是向售货员提出我的要求:如手机大小.CPU.内存等等(属性),要求能拍照打电话首发短

谈谈Delphi的类和对象:三、类可以理解成一种特殊的数据结构、类型转换

三.类可以理解成一种特殊的数据结构 我们知道数据类型可以进行强制类型转换,类既然可以理解成一种数据类型,那么它也应该可以进行类型转换.比如下面代码为一个按钮(Button1)的单击事件 procedure TForm1.Button1Click(Sender: TObject); var ACaption: String; begin ACaption:= TButton(Sender).Caption; //Sender从TObject转化为TButton ShowMessage(Format

自己理解的javascript 的对象和类理解

首先需要先理解类和对象的意义,我个人理解如下: 类:对象的抽象化: 对象:类的实体: javascript中没有class关键字和类的用法,只能用伪类来做类的,所以要用function来定义累的名字: 如: function myClass(){ this.name="张三"; } 这样myClass方法才能用原型连接 prototype:这样才能扩展此类: 也可以用 new myClass();这个类 javascript中有对象,简单的写法就是 var obj={name:&quo

对象和类(上)

1. 对象和类(上) 1.1. 面向对象程序设计 1.1.1. 面向过程的结构化程序设计 首先来看一个需求,实现员工信息管理,将员工简历信息中的数据:姓名.性别.年龄.薪水, 存储在信息管理系统中进行操作.可以定义一个输出雇员信息的方法进行数据的输出,传递4个参数,代码如下: /** 打印员工信息的方法 */ public static void printEmpInfo(String name,int age, chargender,double salary) { System.out.pr

第三周学习《对象与类》心得

学习Java的第四章<对象与类>可以解决以前余留的问题,比如想求三角形,以前是直接定义变量,然后进行输出操作.学习第四章完后求三角形面积可可以运用<对象与类>知识进行编程,简便易懂.类是抽象的,而对象是具体事物,电脑是类,我们所使用的电脑的属性等就是对象.编程时遇到的问题:在写代码时只要理解类和对象的区别就可以,但在运行时总出错,比如自己写的代码和源程序没有差别,就连类名都一样,就是不能运行,而把源程序拷贝过来在运行反倒可以运行,这是怎么回事?

ThreadLocal类深刻理解

synchronized这类线程同步的机制可以解决多线程并发问题,在这种解决方案下,多个线程访问到的,都是同一份变量的内容.为了防止在多线程访问的过程中,可能会出现的并发错误.不得不对多个线程的访问进行同步,这样也就意味着,多个线程必须先后对变量的值进行访问或者修改,这是一种以延长访问时间来换取线程安全性的策略. 而ThreadLocal类为每一个线程都维护了自己独有的变量拷贝.每个线程都拥有了自己独立的一个变量,竞争条件被彻底消除了,那就没有任何必要对这些线程进行同步,它们也能最大限度的由CP

java基础知识-对象和类

前言: 因为要准备Java面试,所有将java基础知识点重新复习一遍,主要笔记来源于菜鸟教程和java核心技术的书籍中,也有一些博客上的资料(这些只供我个人学习使用) Java 对象和类 对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等. 类:类是一个模板,它描述一类对象的行为和状态. 下图中男孩女孩为类,而具体的每个人为该类的对象: 1.Java中的对象 现在让我们深入了解什么是对象.看看周围真实的世界,会发现身边有很多对象

Java面向对象-对象和类概述

java语言提供了定义类.成员变量.方法等基本功能. 类可以认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类来定义的变量都是引用变量,它们都会引用到类的对象. java面向对象的三大特征:封装.继承.多态. 封装:提供了private.protected和public三个访问修饰符来实现 继承:extends关键字让子类继承父类 多态:父类引用指向子类对象,使用继承关系来实现复用时,子类对象可以直接赋给父类变量,这个变量具有多态性,编程更加灵活.(百度搜:花木兰替父从军引例) 类和对