Skip to content

Latest commit

 

History

History
executable file
·
311 lines (192 loc) · 12.7 KB

ch6_1.md

File metadata and controls

executable file
·
311 lines (192 loc) · 12.7 KB
title
Java语言面向对象

[TOC]

类和对象

面向对象概述

面向过程编程:

FortranBasic,__C__等面向过程的程序设计语言,是按流程化的思想来组织的。

在这些语言的设计思想中,==通常将存放基本数据类型的变量作为程序处理对象、以变量的赋值作为程序的基本操作、以变量值的改变作为程序运行的状态。==

过程式的程序 = 算法 + 数据

这种程序设计风格的缺点:

  • 数据抽象简单
  • 信息完全暴露
  • 算法复杂
  • 无法很好地描述客观世界

在程序设计过程中,==为了实现有限度的代码重用,公共代码被组织成为过程或函数。==
当需要代码重用时,调用已经组织好的过程或函数。

==在这种应用方式中,如果软件项目庞大,程序的调试和维护将变得异常困难。==

面向对象编程:

面向对象的程序设计思想是==将数据以及对于这些数据的操作,封装在了一个单独的数据结构中。==

这种模式更近似于现实世界,所有的__对象__都__同时__拥有__属性__以及__与这些属性相关的行为__。
对象之间的联系是通过__消息__来实现的,__消息__是请求对象执行某一处理或回答某些信息的要求。

某个对象在执行相应的处理时,可以通过传递消息请求其他对象完成某些处理工作或回答某些消息。

其他对象在执行所要求的处理活动时,同样可以通过传递消息和另外的对象联系。

==一个面向对象程序的执行,就是靠对象间传递消息来完成的。==

面向对象的程序 = 对象 + 消息

面向对象程序设计是一种程序设计方法,或者是一种程序设计规范,它使用__对象__、继承封装、__消息__等基本概念来进行程序的设计。

从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。

开发一个软件是为了解决某些问题,这些问题所涉及的业务范围称作该软件的问题域。

其应用领域不仅仅是软件,还有计算机体系结构和人工智能等。

面向对象的三大特点:封装, 继承, 多态

<<<<<<< HEAD

=======

b45f7ffc2e01e8847a854596423fd41090d73ca0

封装�

__封装__就是把对象的属性和和对这些属性的操作封装在一个单独的数据结构中,并尽可能隐蔽对象的内部细节,包含两个含义:

  • 把对象的全部属性和对属性的全部操作结合在一起,形成一个不可分割的独立单元(即对象)。
  • 信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界(或者说形成一道屏障),只保留有限的对外接口使之与外部发生联系。

换句话来讲:
==封装,也就是把客观事物抽象并封装成对象,即将数据成员、属性、方法和事件等集合在一个整体内。
通过访问控制,还可以隐藏内部成员,只允许可信的对象访问或操作自己的部分数据或方法==

继承

__继承__是一种由已有的类创建新类的机制。

利用继承,我们可以先创建一个拥有共有属性的一般类,根据该一般类再创建具有特殊属性的新类,新类继承一般类的状态和行为,并根据需要增加它自己的新的状态和行为。
由继承而得到的类称为子类,被继承的类称为父类或超类。

即,
继承是允许使用现有类的功能,并在无需重新改写原来的类的情况下,对这些功能进行扩展。继承可以避免代码复制和相关的代码维护等问题
继承的过程,就是从一般到特殊的过程。被继承的类称为“基类(base class)”、“父类”或“超类(super class)”,通过继承创建的新类称为“子类(subclass)”或“派生类(derived class)”

==Java不支持多重继承,子类只能有一个父类(单一继承),但允许实现多个接口。==

在Java编程语言中,通过继承可利用已有的类,并扩展它的属性和方法。
这个已有的类可以是语言本身提供的、其他程序员编写的或程序员原来编写的。
继承在Java中无所不在。

多态(polymorphism)

__多态__是指同样的消息被不同类型的对象接收时导致完全不同的行为。 多态性允许每个对象以自己的方式去响应共同的消息,从而允许用户以更明确的方式建立通用软件,提高软件开发的可维护性。

对象的多态是由封装和继承引出的面向对象程序设计语言的另一特征。
主要体现在两个方面:

  • 方法重载时实现的静态多态
  • 方法重载时实现的动态多态

==多态性使得我们的同一方法,可以有多种形式。==

另外父类中定义的属性或方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,同一个属性或方法在父类及其各个子类中可以具有不同的语义。

例如,
假设设计了一个绘图软件,所有的图形(Square、Circle等)都继承于基类Shape,每种图形有自己特定的绘制方法(draw)的实现。 如果要显示画面的所有图形,则可以创建一个基类Shape的集合,其元素分别指向各子类对象,然后循环调用父类类型对象的绘制方法(draw),实际绘制根据当前赋值给它的子对象调用各自的绘制方法(draw),这就是多态性。
如果要扩展软件的功能,例如增加图形Eclipse,则只需要增加新的子类,并实现其绘制方法(draw)即可。

客观事物的抽象

为了使计算机能够处理和理解客观事物,==必须对事物进行抽象,以求得事物的本质。==

现实事物纷繁复杂,因此,在事物抽象过程中,必须忽略抽象事物中那些与当前目的无关的特征,求取对当前需求有直接影响的因素。
因此,针对客观事物的抽象必须掌握一定的抽象原则。

例如:

我们知道,当确定了一个圆形的__圆心位__置和圆的__半径__后,就可以在平面上确定一个圆。

因此,抽象出来的圆的要素为__圆心__和__半径__。

用数据结构来表示,如下:

class Circle{
	point center; // 圆心
	float radius; // 半径
}

其中class是面向对象程序设计常用来定义“类”这种数据结构的关键字。

添加一些基本的行为如获取圆的面积,表示如下:

class Circle {
	point center; // 属性或成员
	float radius; // 属性或成员
	
	double getArea(){ // 方法
		return radius*radius*3.1415926;   
	}
}

抽象原则包括__数据抽象__和__过程抽象__两个方面:

  • 数据抽象 就是定义对象的 属性
  • 过程抽象 就是定义对象的 操作

对象封装了数据和代码(数据和程序)


对象(object)

对象(object)是现实世界的实体或概念在计算机逻辑中的抽象表示。
在面向对象系统中,是系统中用来描述客观事物的一个实体,构成系统的一个基本单位。

一个对象由一组属性和对这组属性进行操作的一组服务构成。

__属性__和__服务__是构成对象的两个主要因素,属性是一组数据结构的集合,表示对象的一种状态,对象的状态只供对象自身使用,用来描述静态特性,而服务是用来描述对象动态特征(行为)的一个操作序列,是对象一组功能的体现。

==对象的最主要特点是以数据为中心,它是一个集成了数据和其上操作的封装。==
封装隐藏了类的内部实现细节,强制类的使用者通过规定的接口访问对象,提高了代码的可维护性。

对象是具有唯一对象名和固定对外接口的一组属性和操作的集合,用来模拟组成或影响现实世界问题的一个或一组因素。

对象的主要特性:

  • 1.对象标识
  • 2.属性
  • 3.方法
  • 4.模块独立性
  • 5.动态连接性
  • 6.易维护性

对象是类的一个实例(对象不是找个女朋友),有状态和行为。 例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。

类(class)

在面向对象的编程语言中,类(class)是一个独立的程序单位,是对具有相同属性和方法的一组对象的抽象。

通过类可以对属于该类的全部对象进行统一的描述。 因此,在定义对象之前应先定义类。

类是一个模板,它描述一类对象的行为和状态。

下图之中男孩女孩为类,而具体的每个人为该类的对象。

描述一个类需要指明下述三个方面:

  • (1)类标识(即类名)
  • (2)属性说明
  • (3)类的方法

类的声明举例:

class Circle {
	point center; // 属性或成员
	float radius; // 属性或成员
	
	double getArea() { // 方法
		return radius*radius*3.1415926;   
	}
}

public class Rectangle extends Shapes implement Display{ 
   …… //  类体
}
//下面的Rectangle类继承了Shapes父类,实现了接口 Display,是一个公共类。

类变量

一个类可以包含以下类型变量:

  • 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
  • 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
  • 类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。

构造方法

每个类都有构造方法。 如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。

在创建一个对象的时候,至少要调用一个构造方法。 构造方法的名称必须与类同名,一个类可以有多个构造方法。

创建对象

对象是根据类创建的。 在Java中,使用关键字new来创建一个新的对象。

创建对象需要以下三步:

  • 声明:声明一个对象,包括对象名称和对象类型。
  • 实例化:使用关键字new来创建一个对象。
  • 初始化:使用new创建对象时,会调用构造方法初始化对象。

消息(message)

消息(message)是面向对象系统中实现对象间的通信和请求任务的操作,是要求某个对象执行其中某个功能操作的规格说明。
发送消息的对象称为发送者,接受消息的对象称为接收者。
==对象间的联系,只能通过消息来进行。==
对象在接收到消息时才被激活。

消息具有三个性质:

  • (1)同一对象可接收不同形式的多个消息,产生不同的响应。
  • (2)相同形式的消息可以送给不同对象,所做出的响应可以是截然不同的。
  • (3)消息的发送可以不考虑具体的接收者,对象可以响应消息,也可以对消息不予理会,对消息的响应并不是必需的。

面向对象系统的特性

  • 1.抽象性(abstract)
  • 2.封装性(encapsulation)
  • 3.继承性(inheritance)
  • 4.多态性(polymorphism)

源文件声明规则

当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。

  • 一个源文件中只能有一个public类
  • 一个源文件可以有多个非public类
  • 源文件的名称应该和public类的类名保持一致。

例如:源文件中public类的类名是Employee,那么源文件应该命名为Employee.java

  • 如果一个类定义在某个包中,那么package语句应该在源文件的首行。 如果源文件包含import语句,那么应该放在package语句和类定义之间。 如果没有package语句,那么import语句应该在源文件中最前面。

  • import语句和package语句对源文件中定义的所有类都有效。 在同一源文件中,不能给不同的类不同的包声明。

  • 类有若干种访问级别,并且类也分不同的类型:抽象类和final类等。

  • 除了上面提到的几种类型,Java还有一些特殊的类,如:内部类匿名类


本文档 Github : https://github.com/bushehui/Java_tutorial

<script type="text/javascript" async src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML"> </script> <script type="text/x-mathjax-config"> MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}}); </script>