面向对象的基本思想
- 格式:docx
- 大小:648.04 KB
- 文档页数:17
使用java面向对象编程的三大特征大多数新人,在才开始学习java面对对象编程的过程中对于这一块的三大特征一直比较模糊,基本都是刚开始学习接触编程,一个人跌跌撞撞摸索着往前走,初学的时候很多东西理解的也懵懵懂懂,后来实践的多了,有些东西才慢慢清楚;二是经过一定的实践之后,反过头来再去学习一些基础东西才能够理解的更透彻;三是有些东西基础但是确很重要,是值得好好搞一搞的。
1、面向对象面向对象(Object Oriented)是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),其基本思想是使用对象、类、继承、封装、多态等基本概念来进行程序设计。
从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。
2、对象对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。
一个对象由一组属性和对这组属性进行操作的一组服务组成。
3、类类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分。
在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性和方法两个主要部分。
Java中的类实现包括两个部分:类声明和类体。
类的实例化可生成对象,一个对象的生命周期包括三个阶段:生成、使用、消除。
当不存在对一个对象的引用时,该对象成为一个无用对象。
Java的垃圾收集器自动扫描对象的动态内存区,把没有引用的对象作为垃圾收集起来并释放。
当系统内存用尽或调用System.gc( )要求垃圾回收时,垃圾回收线程与系统同步运行。
向对象的三个基本特征是:封装、继承、多态。
4、封装封装性就是尽可能的隐藏对象内部细节,对外形成一道边界,只保留有限的接口和方法与外界进行交互。
封装的原则是使对象以外的部分不能随意的访问和操作对象的内部属性,从而避免了外界对对象内部属性的破坏。
可以通过对类的成员设置一定的访问权限,实现类中成员的信息隐藏。
面向对象的名词解释是什么在计算机科学中,面向对象(Object-Oriented)是一种编程范式,它将系统的组织和设计建立在对象的概念上。
面向对象编程的核心理念是将问题分解成不同的对象,每个对象都有自己的状态和行为,并且能够与其他对象进行交互。
面向对象编程的基本概念是“类”和“对象”。
类是一种抽象的概念,描述了一组具有相同属性和行为的对象。
通过类的定义,我们可以创建一些具体的实例,即对象。
对象是类的具体实例化,它拥有类定义的属性和行为。
在面向对象的编程中,我们通过创建对象来解决问题,每个对象都具有自己的数据和可执行的代码。
面向对象编程具有许多特性,其中最重要的是封装、继承和多态。
封装是面向对象编程的基本原则之一。
它指的是将数据和相关操作封装在单个对象中,同时隐藏对象内部的细节。
通过封装,我们可以将对象的数据和行为组织在一起,使其成为一个独立的实体。
封装有助于减少代码的耦合性,提高代码的可维护性和复用性。
继承是面向对象编程的另一个重要概念。
继承允许我们创建一个新的类,该类继承现有类的属性和行为。
新类称为子类或派生类,而被继承的类称为父类或基类。
通过继承,子类可以重用父类的代码,并且可以在其基础上进行扩展或修改。
继承可以提高代码的可读性和可维护性,同时也促进了代码的重用。
多态是面向对象编程的第三个重要特性。
多态允许不同的对象对相同的消息作出不同的响应。
具体来说,多态使我们可以使用一个通用的接口来处理不同类型的对象,而不需要关心对象的具体类型。
这种特性使得代码更加灵活和可扩展,使得程序具有更好的适应性和可复用性。
除了封装、继承和多态,面向对象编程还有其他一些重要的概念,如抽象、接口和消息传递等。
抽象指的是将问题的共同特征提取出来,形成类或接口的过程。
接口定义了类所提供的方法和属性,它为类提供了一种协议,规定了类和外部世界之间的交互方式。
消息传递是面向对象编程中对象之间通信的方式,对象通过发送消息来请求其他对象执行某个操作。
面向对象编程思想面向对象是一种新兴的程序设计方法,或者说它是一种新的程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计。
它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其它概念来构造系统)。
这可以使系统直接地映射问题域,保持问题域中事物及其相互关系的本来面貌。
它可以有不同层次的理解:从世界观的角度可以认为:面向对象的基本哲学是认为世界是由各种各样具有自己的运动规律和内部状态的对象所组成的;不同对象之间的相互作用和通讯构成了完整的现实世界。
因此,人们应当按照现实世界这个本来面貌来理解世界,直接通过对象及其相互关系来反映世界。
这样建立起来的系统才能符合现实世界的本来面目。
从方法学的角度可以认为:面向对象的方法是面向对象的世界观在开发方法中的直接运用。
它强调系统的结构应该直接与现实世界的结构相对应,应该围绕现实世界中的对象来构造系统,而不是围绕功能来构造系统。
从程序设计的角度来看,面向对象的程序设计语言必须有描述对象及其相互之间关系的语言成分。
这些程序设计语言可以归纳为以下几类:系统中一切皆为对象;对象是属性及其操作的封装体;对象可按其性质划分为类,对象成为类的实例;实例关系和继承关系是对象之间的静态关系;消息传递是对象之间动态联系的唯一形式,也是计算的唯一形式;方法是消息的序列。
面向对象面向对象(Object Oriented,OO)是当前计算机界关心的重点,它是90年代软件开发方法的主流。
面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。
如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。
面向对象的基础思想1 类与对象(重点)1.1类与对象的基本关系类与对象是整个面向对象概念之中的最为重要的组成部分。
类:类是对整个现实世界的一种合理的抽象,是一种共性的产物,在类之中主要有两个组成部分:属性(变量)、行为(方法);对象:是一个具体的,可以使用的产物,是一种个性的表示。
实际上类中规定了一个对象的具体行为,而对象是一个类的具体表现。
类只有通过对象才可以使用,所以在开发之中一定要先有类之后再定义对象。
但是一个类产生之后就好比汽车的设计图纸那样,本身并不能直接使用,必须按照图纸生产出具体的汽车之后才可以开,所以需要对象,而对象定义格式如下:格式一:声明并实例化对象格式二:分步完成通过以上的格式可以发现,依然存在了关键字new,所以这一操作也一定表示要开辟堆内存空间,同时需要注意的是,当一个对象开辟空间之后可以按照如下的两个方式来操作类中的内容:·操作类中的属性:对象.属性;·操作类中的方法:对象.方法();范例:声明并实例化对象但是类本身属于引用数据类型,所以以上的程序依然要牵扯到内存的划分,同样使用两块内存:·堆内存:保存的是每一个对象所具备的属性;·栈内存:保存的是一块堆内存的使用地址,可以简单理解为对象名称。
1.2浅深入引用传递清楚了以上的内存关系之后,下面再来对另外一个类似的程序进行观察。
如果说现在同时产生了两个只要发现了关键字new,那么一定表示要开辟的是一块新的内存空间,每一块堆内存空间都有一个栈内存指向它。
范例:观察如下程序发现现在一个per对象没有进行实例化的操作,这个时候程序编译没有任何的语法错误,但是程序执行的时候出现了以下的错误提示:现在给出的是“NullPointerException”,表示空指向异常。
此异常肯定会伴随你的开发人生走完的那一刻,此异常只有在引用数据类型操作的时候才会出现。
NullPointerException更准确的讲法是指使用只声明而未开辟空间的引用类型所造成的问题,所以为了区分此概念,以后对于对象而言,在操作上就会给出两个不同的名词:·声明对象:只开辟了栈内存空间的对象,无法直接使用;·实例化对象:有了对应的堆内存空间指向,可以使用;以上的分析流程和数组是完全一样的,因为数组也属于引用数据类型,在数组学习的时候强调过,所谓的引用传递实际上指的就是一块堆内存空间可以同时被多个栈内存所指向的操作,那么对于类也是一样的,引用传递指的是一块堆内存同时被不同的对象(不同的栈)所指向。
结构化方法和面向对象方法的比较结构化方法是结构化分析,结构化设计和结构化编程的总称,是最早最传统的软件开发方法,也是迄今为止信息系统中应用最普遍、最成熟的一种,它引入了工程思想和结构化思想,使大型软件的开发和编程都得到了极大的改善。
面向对象方法它不仅仅是一些具体的软件开发技术与策略,而且是一整套关于如何看待软件系统与现实世界的关系,用什么观点来研究问题并进行问题求解,以及如何进行软件系统构造的软件方法学。
人们普遍认为面向对象方法是一种运用对象、类、继承、封装、聚合、关联、消息和多态性等概念和原则来构造系统的软件开发方法。
结构化方法和面向对象方法二者的比较如下。
一、基本思想的比较结构化方法的基本思想主要体现在三个方面。
一、自顶向下,逐步求精:把程序看成是一个逐步演化的过程。
把一个系统与程序看成是一层一层的。
例如:户籍管理系统可以划分为:户籍迁入迁出,人员迁入迁出,户籍注销,人员注销等几个子系统,而每个子系统又划分为接收用户信息,实施处理,提供返回信息等等部分。
二、模块化:即将几个系统分成几个模块,每个模块实现特定的功能,最终整个系统由这些模块组成。
模块跟模块之间通过接口传递信息,模块最重要的特点就是独立性,模块之间还有上下层的关系,上层模块调用下层模块来实现一些功能。
三、语句结构化:顺序结构、分支结构、循环结构,都是常用的语句结构。
面向对象方法的基本思想主要有:一、客观世界中的事物都是对象,对象之间存在一定的关系,并且复杂对象由简单对象构成。
二、具有相同属性和操作的对象属于一个类,对象是类的一个实例。
三、类之间可以有层次结构,即类可以有子类,其中,子类继承父类的全部属性和操作,而且子类有自己的属性和操作。
四、类具有封装性,把类内部的属性和一些操作隐藏起来,只有公共的操作对外是可见的,对象只可通过消息来请求其他对象的操作或自己的操作。
五、强调充分运用人在日常逻辑思维中经常采用的思想方法与原则。
例如:抽象,分类,继承,聚合,封装,关联等。
什么是⾯向对象思想⾯向对象是⼀种思想,是基于⾯向过程⽽⾔的,就是说⾯向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节;这种思想是将数据作为第⼀位,⽽⽅法或者说是算法作为其次,这是对数据⼀种优化,操作起来更加的⽅便,简化了过程。
⾯向对象有三⼤特征:封装性、继承性、多态性,其中封装性指的是隐藏了对象的属性和实现细节,仅对外提供公共的访问⽅式,这样就隔离了具体的变化,便于使⽤,提⾼了复⽤性和安全性。
对于继承性,就是两种事物间存在着⼀定的所属关系,那么继承的类就可以从被继承的类中获得⼀些属性和⽅法;这就提⾼了代码的复⽤性。
继承是作为多态的前提的。
多态是说⽗类或接⼝的引⽤指向了⼦类对象,这就提⾼了程序的扩展性,也就是说只要实现或继承了同⼀个接⼝或类,那么就可以使⽤⽗类中相应的⽅法,提⾼程序扩展性,但是多态有⼀点不好之处在于:⽗类引⽤不能访问⼦类中的成员。
举例来说:就是:⽐如说你要去饭店吃饭,你只需要饭店,找到饭店的服务员,跟她说你要吃什么,然后就会给你做出来让你吃,你并不需要知道这个饭是怎么错做的,你只需要⾯向这个服务员,告诉他你要吃什么,然后他也只需要⾯向你吃完收到钱就好,不需要知道你怎么对这个饭进⾏吃。
1、特点:1:将复杂的事情简单化。
2:⾯向对象将以前的过程中的执⾏者,变成了指挥者。
3:⾯向对象这种思想是符合现在⼈们思考习惯的⼀种思想。
2、⾯向对象的三⼤特征:封装,继承、多态1.封装:只隐藏对象的属性和实现细节,仅对外提供公共访问⽅式好处:将变化隔离、便于使⽤、提⾼复⽤性、提⾼安全性原则:将不需要对外提供的内容隐藏起来;把属性隐藏,提供公共⽅法对其访问2.继承:提⾼代码复⽤性;继承是多态的前提注:①⼦类中所有的构造函数都会默认访问⽗类中的空参数的构造函数,默认第⼀⾏有super();若⽆空参数构造函数,⼦类中需指定;另外,⼦类构造函数中可⾃⼰⽤this指定⾃⾝的其他构造函数。
§2.6 空间数据模型四、面向对象数据模型面向对象的基本概念是在本世纪70年代萌发出来的,它的基本做法是把系统工程中的某个模块和构件视为问题空间的一个或一类对象。
到了80年代,面向对象的方法得到很快发展,在系统工程、计算机、人工智能等领域获得了广泛应用。
但是,在更高级的层次上和更广泛的领域内对面向对象的方法进行研究还是90年代的事。
(一)基本思想和基本概念面向对象的基本思想是通过对问题领域进行自然的分割,用更接近人类通常思维的方式建立问题领域的模型,并进行结构模拟和行为模拟,从而使设计出的软件能尽可能地直接表现出问题的求解过程。
因此,面向对象的方法就是以接近人类通常思维方式的思想,将客观世界的一切实体模型化为对象。
每一种对象都有各自的内部状态和运动规律,不同对象之间的相互联系和相互作用就构成了各种不同的系统。
在面向对象的方法中,对象、类、方法和消息是基本的概念(图6-6-7)。
(二)面向对象的特性面向对象方法具有抽象性、封装性、多态性等特性。
(三)面向对象数据模型的四种核心技术1、分类:是把一组具有相同属性结构和操作方法的对象归纳或映射为一个公共类的过程。
如城镇建筑可分为行政区、商业区、住宅区、文化区等若干个类。
2、概括:将相同特征和操作的类再抽象为一个更高层次、更具一般性的超类的过程。
子类是超类的一个特例。
一个类可能是超类的子类,也可是几个子类的超类。
所以,概括可能有任意多层次。
概括技术避免了说明和存储上的大量冗余。
这需要一种能自动地从超类的属性和操作中获取子类对象的属性和操作的机制,即继承机制。
3、聚集:聚集是把几个不同性质类的对象组合成一个更高级的复合对象的过程。
4、联合:相似对象抽象组合为集合对象。
其操作是成员对象的操作集合。
四种核心技术的进一步说明。
(四)面向对象数据模型的核心工具1、继承一类对象可继承另一类对象的特性和能力,子类继承父类的共性,继承不仅可以把父类的特征传给中间子类,还可以向下传给中间子类的子类。
面向对象程序设计思想面向对象程序设计(Object-Oriented Programming,简称OOP)是一种以对象为中心的编程范式,它将现实世界中的事物抽象为对象,并通过对象之间的交互来实现程序的运行。
面向对象程序设计的核心思想包括封装、继承和多态。
封装封装是面向对象程序设计中最基本的概念之一。
它指的是将数据(属性)和操作数据的方法(行为)组合在一起,形成一个对象。
封装的目的是隐藏对象的内部细节,只暴露出一个可以被外界访问的接口。
这样,对象的使用者不需要了解对象内部的实现细节,只需要通过接口与对象进行交互。
例如,在一个银行系统中,我们可以创建一个`Account`类,该类封装了账户的基本信息(如账号、余额)和对账户的操作(如存款、取款)。
用户在使用`Account`类时,只需要调用相应的方法,而不需要关心这些方法是如何实现的。
继承继承是面向对象程序设计中另一个重要的概念。
它允许一个类(子类)继承另一个类(父类)的属性和方法。
通过继承,子类可以扩展或修改父类的行为,而不需要重新编写代码。
继承支持代码的复用,使得程序设计更加简洁和高效。
例如,假设我们有一个`Animal`类,它定义了所有动物共有的属性和方法。
我们可以创建一个`Dog`类,它继承自`Animal`类。
`Dog`类将继承`Animal`类的所有属性和方法,并且可以添加一些特有的属性和方法,如`bark`。
多态多态是面向对象程序设计中的一个重要特性,它允许不同类的对象对同一消息做出响应,但具体的行为会根据对象的实际类型而有所不同。
多态性使得程序设计更加灵活和可扩展。
多态性通常通过抽象类和接口来实现。
抽象类定义了一个或多个抽象方法,而具体的子类则提供了这些抽象方法的实现。
接口则定义了一组方法规范,不同的类可以实现同一个接口,但提供不同的实现。
例如,假设我们有一个`Shape`接口,它定义了一个`draw`方法。
我们可以创建`Circle`、`Square`等类,它们都实现了`Shape`接口。
面向对象的基础思想1 类与对象(重点)1.1类与对象的基本关系类与对象是整个面向对象概念之中的最为重要的组成部分。
类:类是对整个现实世界的一种合理的抽象,是一种共性的产物,在类之中主要有两个组成部分:属性(变量)、行为(方法);对象:是一个具体的,可以使用的产物,是一种个性的表示。
实际上类中规定了一个对象的具体行为,而对象是一个类的具体表现。
类只有通过对象才可以使用,所以在开发之中一定要先有类之后再定义对象。
但是一个类产生之后就好比汽车的设计图纸那样,本身并不能直接使用,必须按照图纸生产出具体的汽车之后才可以开,所以需要对象,而对象定义格式如下:格式一:声明并实例化对象格式二:分步完成通过以上的格式可以发现,依然存在了关键字new,所以这一操作也一定表示要开辟堆内存空间,同时需要注意的是,当一个对象开辟空间之后可以按照如下的两个方式来操作类中的内容:·操作类中的属性:对象.属性;·操作类中的方法:对象.方法();范例:声明并实例化对象但是类本身属于引用数据类型,所以以上的程序依然要牵扯到内存的划分,同样使用两块内存:·堆内存:保存的是每一个对象所具备的属性;·栈内存:保存的是一块堆内存的使用地址,可以简单理解为对象名称。
1.2浅深入引用传递清楚了以上的内存关系之后,下面再来对另外一个类似的程序进行观察。
如果说现在同时产生了两个只要发现了关键字new,那么一定表示要开辟的是一块新的内存空间,每一块堆内存空间都有一个栈内存指向它。
范例:观察如下程序发现现在一个per对象没有进行实例化的操作,这个时候程序编译没有任何的语法错误,但是程序执行的时候出现了以下的错误提示:现在给出的是“NullPointerException”,表示空指向异常。
此异常肯定会伴随你的开发人生走完的那一刻,此异常只有在引用数据类型操作的时候才会出现。
NullPointerException更准确的讲法是指使用只声明而未开辟空间的引用类型所造成的问题,所以为了区分此概念,以后对于对象而言,在操作上就会给出两个不同的名词:·声明对象:只开辟了栈内存空间的对象,无法直接使用;·实例化对象:有了对应的堆内存空间指向,可以使用;以上的分析流程和数组是完全一样的,因为数组也属于引用数据类型,在数组学习的时候强调过,所谓的引用传递实际上指的就是一块堆内存空间可以同时被多个栈内存所指向的操作,那么对于类也是一样的,引用传递指的是一块堆内存同时被不同的对象(不同的栈)所指向。
范例:观察引用传递}范例:分析以下的程序运行}所谓的垃圾空间实际上就是指的没有任何的栈内存指向的堆内存空间,所有的垃圾空间要等待JVM不定期的进行垃圾回收(GC),以释放内存空间,不过虽然有了所谓的垃圾回收机制,从实际的开发来讲,应该尽量的去避免垃圾的产生。
2 封装性的基本实现(重点)封装性是作为面向对象第一大特征,但是需要提醒的是,本次所讲解的封装性只是针对于一种基本的实现,而Java之中的封装性是与权限有关的。
在真正的去研究封装操作之前,首先来观察这样的一个程序:这个时候程序依然可以执行,因为在int的数据范围之中本身就包含了负数,所以从技术上来讲,本程序没有任何的问题,但是从实际生活这样也完全不靠谱,所以这个时候按照开发的术语来讲是业务上有问题了。
而造成这一问题的本质在于属性没有经过任何的检查,并且可以在类的外部直接操作,所以要想解决问题,就必须让属性对外部不可见,可以使用private进行属性的定义。
现在给出的提示是name和age两个属性在Person类之中是属于私有的访问,所以类的外部无法使用,即:使用private定义的内容只能在当前类中起作用。
而当属性使用了private封装之后,按照Java EE的标准来讲,此时就必须使用如下的方法格式进行属性的操作,以name属性为例,现在已经使用了private封装:·设置属性内容(setter):public void set N ame(String n); setter要检查以后只要是类中的属性都必须使用private封装,封装之后的属性一定要使用setter、getter设置和取得。
3 构造方法(重点)现在可以对以上的格式分析一下:“类名称对象名称”,这个操作意味着声明一个指定类型的对象。
而后new表示要开辟一个新的堆内存空间,但是在最后有一个“类名称()”,一旦操作后面有“()”表示的是一个方法,那这个就是构造方法,所以对于构造方法在之前一直在使用。
范例:观察构造在一个类之中,构造方法的定义要求如下:·构造方法的名称和类的名称要求完全一样,如果class Person,则构造:Person();每当使用关键字new实例化新的对象时,构造方法都要被调用,但是这个时候也出现一个问题了,在之前貌似没有编写过构造方法,那么为什么之前没有错呢?为了保证每一个类操作的方便,所以如果在一个类之中没有明确的定义一个构造方法的话,则会在编译的时候自动的生成一个无参的,什么都不做的构造方法:结论:在一个类之中至少存在一个构造方法,如果一个类之中已经明确定义一个构造的话,则无参的什么都不做的构造方法将不会再自动生成了。
构造方法的基本概念介绍完了,但是构造方法有什么用呢?在之前所进行的操作可以发现是按照如下的流程:·实例化对象:Person per = new Person() ;;·调用类的setter方法设置内容:per.setName("张三") ;、per.setAge(20) ;;很明显,当一个对象实例化之后就特别希望类中的属性就有内容了,这样分别调用setter方法设置实在是不方便,所以可以使用构造方法进行属性内容的传递。
构造方法的主要作用:是进行对象中属性的初始化操作。
简单点理解:就是一个类对象实例化的时候可以自动的完成一些操作。
但是在这里面还有一个小说明,既然现在在构造方法之中所调用的方法是本类中的方法,所以很多时候(在开发之中必须使用)都会使用一个this来强调一下是本类中的方法:既然构造方法本身属于方法,那么只要是方法就可以进行方法的重载,但是构造方法重载的时候根本就不用考虑方法名称(因为都跟类名称一样),只需要考虑参数的类型及个数的不同即可。
提示(以后解释):在每一个对象的构造过程(实例化过程),构造方法是整个构造过程的最后一步,所以如果现在在类中的一个属性定义时存在了默认值,那么这个默认值也只有在构造完成之后才会真正的赋值给这个属性,其他的时候这个属性的值都是其对应数据类型的默认值,例如:从理论上讲,本类之中的name属性的默认值“无名氏”,只能构造完成之后才可以真正的给name,其他的时候name的内容就是null,但是这一特征如果要想通过代码来验证,需要点时间。
学习完构造方法之后,发现在类之中就存在了三样东西:属性、普通方法、构造方法,所以这三样东西的编写流程:1、定义属性;2、编写构造:如果有多个构造方法,则一定要按照参数的顺序编写(按照参数的个数升序或降序)3、普通方法:也需要考虑到参数的个数;4 匿名对象(重点)匿名就是指没有名字的对象,对于对象的内存划分,很明显现在是有两块内存,一块是堆内存,另外一块是栈内存空间,但是堆内存是真正要使用的内容,而栈只是保留了一块堆内存地址而已,就是一个表示堆内存的名字,所以所谓的匿名对象指的就是没有名字的堆内存对象。
但是由于匿名对象本身没有名字,所以使用一次之后就称为垃圾了,就要等待被回收。
何种情况下需要匿名对象:一个对象只用一次,就匿名对象。
5 对象的比较和排序如果是简单的对象之间是否相同的比较则直接重写Object提供的equals()方法和hashCode();如果想进行一组对象的比较,那么必须存在比较器的支持,而Java之中的比较器有两种:Comparable、Comparator,下面分别说明。
5.1、重写equals()方法和hashCode()方法范例:在String类之中如果要想判断两个字符串的内容是否相等,使用equals()方法,那么如果说现在有一个自定义类的两个对象,要想判断是否相等,这个时候肯定要将类之中的所有属性依次进行比较判断。
如果从实际来讲肯定是自己来处理省事,因为如果把所有的比较操作交给了第三方去完成,那么就意味着,第三方必须清楚每一个操作的细节,这样做根本就不现实,而一个好的设计客户端不应该参与更多的细节方面的内容,关心的只是一个结果,而主方法就是一个客户端,所以在这个客户端之中不应该牵扯到细节。
为了解决这样的问题,那么肯定要由类提供这一操作,所以应该在Person类之中提供一个比较的操作方法。
而对象的比较操作在日后课程讲解以及开发之中,是一个极其重要的概念,一定要记住,对象比较是一个类自己提供的功能。
5.2 常用的比较器:Comparable(核心)首先来看一下Comparable接口的定义格式:在之前学习String的时候也学习过compareTo()方法,因为String也是Comparable接口的子类,所以String类中的compareTo()方法也是覆写而来,而如果是一个用户自己定义的compareTo()方法可以返回三种值:-1、1、0;可以发现Comparable接口是在一个类定义的时候就默认实现好了的,所以是一个类本身自己的功能。
6.2、挽救的比较器(了解)如果说现在定义了一个类,但是在定义类的时候并没有考虑到排序问题。
但是现在有一个新的要求出现了,突然希望可以对一组这样类的对象进行排序,而现在Person类无法修改,而又要同时满足排序要求的话,只能使用另外一种比较器:Comparator,此接口定义如下:如果希望使用Comparator的话,就必须准备出一个专门用于实现具体比较操作的规则类。
现在这是一个专门用于定义的比较规则,而这个比较规则在使用的时候直接向sort()方法上传递对象即可。
观察Arrays类的一个方法:public static <T> void sort(T[] a, Comparator<? super T> c)面试题:请解释一下两种比较器的区别?·Comparable:parable是在一个类定义时直接实现的接口,属于一个类本身的功能存在,里面只有一个compareTo()方法;·Comparator:parator是一个挽救的比较器接口,需要单独定义一个比较规则,里面有两个方法:compare()、equals();·但是从使用上来讲肯定使用Comparable完成。