面向对象程序设计之一


• 程序=数据 +算法

• 程序设计方法
– 结构化程序设计
– 面向对象程序设计

• C语言:结构化程序设计语言
• Java语言:是一种面向对象程序设计语言

• 结构化程序设计方法

– 函数是分解出的算法零件
– 结构体类型是分解出的数据零件

– 程序修改

struct Rectangle // 修改成员a、b的数据类型
{
double a; // 原来为:int a;
double b; // 原来为:int b;
};

double Area(double length, double width) // 原来为:int Area(int length, int width)
{ return ( length*width ); }
double Len(double length, double width) // 原来为:int Len(int length, int width)
{ return ( 2*(length+width) ); }

double Area(double length, double width); // 原来为:int Area(int length, int width);
double Len(double length, double width); // 原来为:int Len(int length, int width);

结论:不仅要修改结构体成员数据类型,还得修改函数参数,以及头文件,如果是大型项目,修改量非常大。

• 面向对象程序设计方法

– 数据类=数据+算法

– 程序修改

class Rectangle // 修改头文件2.h中的类声明部分
{
public:
double a; // 原来为:int a;
double b; // 原来为:int b;
double Area( ); // 原来为:int Area( );
double Len( ); // 原来为:int Len( );
};

// 修改程序文件2.cpp中的类实现部分
double Rectangle::Area( ) // 原来为:int Rectangle::Area( )
{ return ( a*b ); }
double Rectangle::Len( ) // 原来为:int Rectangle::Len( )
{ return ( 2*(a+b) ); }
 

结论:算法和数据耦合度较低,易于修改
例:
在这里插入图片描述

• 面向对象程序设计中的封装

定义类的程序员可以将需要被外部直接访问的成员开放出来,同时将不需要被直接访问的成员隐藏起来,这就是面向对象程序设计中类的封装。

开放。定义类时将必须被外部访问的成员开放出来,以保证类的功能可以被正常使用
隐藏。定义类时将不需要被外部访问的成员隐藏出来,以防止它们被误访问

– 公有权限public。被赋予公有权限的类成员是开放的
– 私有权限private。被赋予私有权限的类成员将被隐藏

在这里插入图片描述
例:
在这里插入图片描述

• 面向对象程序的设计过程

– 面向对象程序的设计过程:分析、抽象、组装
– 统一建模语言UML(Unified Modeling Language)
具体细节请参照我的面向对象博客实例:Java画图软件

分析

进行需求分析,可以使用starUML,制作出用况图

抽象

为客观事物建立数据模型。
– 属性(property)
– 方法(method)

Java语言支持面向对象程序设计
– 类图:类
– 属性:字段
– 方法:方法
– 封装:访问权限

组装

类:描述客观对象数据模型的图纸
对象:按照图纸生产出的产品,图纸的实例

在主类中实现程序设计功能

类与对象的语法细则

Java语法:定义类

[public] class 类名 {
[访问权限] 数据类型 字段名 [ = 初始值 ];
……
[访问权限] 返回值类型 方法名(形式参数列表 ) { 方法体 }
……
}

语法说明:
◼ 定义类时使用关键字class。通常在class之前使用关键字public将类的访问权限设定为公有,也可以省略(此时类将具有默认的访问权限)。注:Java语法的中括号“[ ]”表示其中的内容可省略,以下同。
◼ 类名需符合标识符的命名规则,习惯上以大写字母开头。
◼ 类的下属成员有两种,分别是字段(存储数据)和方法(处理数据的算法)。某些特殊的类可能只包含一种成员,比如只包含字段,或只包含方法。
◼ 类成员的访问权限有4种,分别是公有权限(public)、保护权限(protected)、私有权限(private)或默认权限(未指定访问权限)。
◼ 方法成员可以访问本类中任意位置的字段(字段相当于是类中的全局变量),或调用本类中任意位置的其他方法。类成员之间互相访问不需要“先定义,后访问”,也不受权限约束

字段成员的语法细则

• 字段初始化
private int hour = 0;

• 空值
不同数据类型的空值
byte/short/int/long float/double char boolean 引用变量
0 0.0 ‘\u0000’ false null

• 只读字段final
private final int second = 0;

方法成员的语法细则

• 方法的4大要素
方法名
形式参数列表
方法体
返回值类型

• 方法签名:返回值类型 方法名(形式参数列表)
• 重载方法
public void set( ) { }
public void set(int h, int m, int s) { }

类成员访问权限的语法细则

• 公有权限public
• 私有权限private
• 保护权限protected
• 默认权限(未指定访问权限)

定义对象

• 运算符new
• 引用及引用变量
Clock obj1;
obj1 = new Clock( );
上述两条语句可简写为一条语句:
Clock obj1 = new Clock( );

• 请注意:“=”两边的类型应当一致

访问对象

• 成员运算符“.”
对象名.字段名
对象名.方法名(实参列表)

引用数据类型

基本数据类型(primitive data type):byte、short、int、long、float、double、char、boolean

Java语言中,使用基本数据类型定义变量,定义时直接为变量分配内存单元
后续程序将通过变量名访问变量的内存单元

引用数据类型(reference data type):类类型、数组类型、接口类型、枚举类型等

先定义引用数据类型的引用变量
再用运算符new创建引用数据类型的对象,并将所返回的对象引用保存到引用变量中
后续程序通过引用变量访问对象及其下属成员

图形表示:
在这里插入图片描述

三种不同的变量

– 字段:定义在类中的变量成员,用于保存属性数据。字段相当于是类中的全局变量,可以被类中的所有方法成员访问
– 局部变量:类中方法成员在方法体中定义的变量,仅能在所定义的方法体或复合语句中访问
– 形式参数(形参):类中方法成员在头部小括号里面定义的变量,用于接收原始数据。形参仅能在所定义的方法体中访问

类与对象的编译原理

– 程序员在编写方法成员代码时,形参this是隐含的,在方法体中访问其他类成员也不需要添加this引用,这些都由编译器在编译时自动添加
– 程序员可以在访问类成员时显式添加“this.”,也可以通过this获取当前对象的引用,或把this作为实参将当前对象的引用继续传递给其他方法
– 程序员还可以利用this来区分与形参或局部变量重名的字段

类的构造方法

构造方法(constructor)是类中一种特殊的方法
• 构造方法的名字必须与类名相同
• 构造方法通过形参传递初始值,实现对新建对象字段成员的初始化
• 构造方法可以重载,即定义多个同名的构造方法,这样可以提供多种形式的初始化方法
• 构造方法没有返回值,定义时不能写返回值类型,写void也不行
• 构造方法通常是类外调用,其访问权限不能设为private

类的静态成员
(全局变量、外部函数)纳入到类中管理:静态成员
Java语言不允许在类外定义全局变量或函数
图形表示:
在这里插入图片描述

静态字段的语法细则

• 关键字static:在类中定义静态字段需使用关键字static进行限定,通常放在访问权限之后,数据类型之前。定义静态字段时可以初始化
• 在本类访问静态字段:在本类的方法成员中访问静态字段,直接使用字段名访问,访问时不受权限约束。
• 不能通过this访问静态字段:静态字段是类字段,没有包含在对象中,因此不能使用关键字this访问静态字段。
注:this是指向当前对象的引用变量
• 在类外访问静态字段:在类外其他方法(例如主方法)中访问静态字段需以“类名.静态字段名”的形式访问,或通过任何一个该类对象引用以“对象引用名.静态字段名”的形式访问。类外访问静态字段受权限约束。
• 在类外访问静态字段时可以不创建对象,直接通过类名访问

静态方法的语法细则

• 关键字static:在类中定义静态方法需使用关键字static进行限定,通常放在访问权限之后,返回值类型之前
• 在本类调用静态方法:本类中的所有方法成员都可以调用静态方法。调用时直接使用方法名,并且不受访问权限约束。
• 在类外调用静态方法:与静态字段一样,静态方法是一种类方法,与对象实例无关。对应地,非静态的普通方法只能在创建对象实例之后才能用,因此被称为实例方法。在类外其他方法(例如主方法)中调用静态方法,需要以“类名.静态方法名( )”的形式调用,或通过任何一个该类对象引用以“对象引用名.静态方法名( )”的形式调用。类外调用受访问权限约束。在类外调用静态方法时可不创建对象,直接通过类名调用
• 静态方法访问本类其他成员:静态方法只能访问本类中的静态字段,不能访问实例字段,因为静态方法可以在没有创建任何对象的情况下直接调用,而实例字段必须在对象创建之后才会分配内存空间,因而不能访问。静态方法只能调用本类中的其他静态方法,不能调用实例方法,因为实例方法可能会间接访问实例字段

静态成员的应用

• 以类的形式管理全局变量或外部函数
• 将具有相同属性值的字段提炼出来,定义成静态字段,这样可以让所有对象共用同一个静态字段,从而减少内存占用。
• 将专门处理静态字段的方法定义成静态方法

数组(array)

元素(element)、下标(subscript)
一维数组、二维数组
遍历

定义数组

– 先定义数组类型的引用变量
int iArray[ ]; // 定义一个int型数组的引用变量iArray
int [ ]iArray; // 定义一个int型数组引用变量iArray
– 再创建数组
iArray = new int[5];
int iArray[ ] = new int[5]; // 定义引用变量的同时创建数组

定义数组时的初始化

int iArray[ ] = { 2, 4, 6 };

数组的语法细则

在这里插入图片描述

访问数组

1,按下标访问
2,for循环数组遍历
3,增强for语句
for (char x : cArray) { }

Java可变长参数语法

int max(int …varArgs) { // 在可变长形参名之前加“…”(3个点)
…… // 求最大值算法
}
// 可变长形参varArgs所接收到的实参是以数组形式存放的,varArgs是一个数组

二维数组

– 存储二维表格、矩阵这样的数据集合需要使用二维数组
– 二维数组有两个下标,第1个为行下标,第2个为列下标

定义二维数组
int iArray[ ][ ]; // 定义一个int型二维数组的引用变量iArray
iArray = new int[2][3]; // 创建一个2行3列的int型二维数组
int iArray[ ][ ] = new int[2][3]; // 定义引用变量的同时创建数组
int iArray[ ][ ] = { { 1, 3, 5 }, { 2, 4, 6 } }; // 定义二维数组时给出初始值

二维数组的每一行都可以看作是一个一维数组
int a[ ][ ] = new int[2][3]; // 定义一个2行3列的二维数组a
等价于:int a[ ][ ] = new int[2][ ]; // 先定义一个2行的二维数组
a[0] = new int[3]; // 再定义第0行的一维数组,包含3个元素
a[1] = new int[3]; // 再定义第1行的一维数组,包含3个元素
System.out.println( a.length ); // 显示数组a的行数:2
System.out.println( a[0].length ); // 显示第0行的列数:3
System.out.println( a[1].length ); // 显示第1行的列数:3

二维数组每一行的列数可以不同
int a[ ][ ] = new int[2][ ]; // 先定义一个2行的二维数组
a[0] = new int[3]; // 再定义第0行的一维数组,包含3个元素
a[1] = new int[5]; // 再定义第1行的一维数组,包含5个元素
System.out.println( a.length ); // 显示数组a的行数:2
System.out.println( a[0].length ); // 显示第0行的列数:3
System.out.println( a[1].length ); // 显示第1行的列数:5

对象数组

– 定义对象数组
Clock c[ ] = { new Clock( ), new Clock( 8, 30, 15 ), new Clock( 12, 0, 0 ) };
在这里插入图片描述

Java源程序文件的命名细则

– 如果文件中有一个public类,则必须以该类的类名作为文件名
– 如果文件中没有public类,则应任选文件中某个类的类名作为文件名
– 一个Java源程序文件中最多只能有一个public类(即访问权限被定义为public),其他类都不能指定访问权限(即访问权限是默认权限)
– Java源程序文件的扩展名为“.java”
– 编译后,Java源程序文件中的每个类都会生成一个与类同名的类程序文件,扩展名为“.class”

以包的形式管理Java类

大型Java程序会定义很多个类,将会有很多个源程序文件。可以对这些源程序文件进行分组管理,即在源程序根目录src下再建立子目录,将源程序文件分散到不同的子目录下进行管理。

– 将Java源程序文件放入不同的子目录进行分组管理,实际上是对源程序文件中的类进行分组管理
– 将Java源程序文件放入不同的子目录,Java语言称之为“将文件中的类放入不同的包(package)”
– 源程序文件的子目录名被称为是类的包名

分包管理Java类

在这里插入图片描述

使用不同包里的类

在这里插入图片描述

导入类中的静态成员

在这里插入图片描述
包的绝对路径
• Java虚拟机
– 运行Java虚拟机时选项“-classpath”所指定的目录
– 环境变量CLASSPATH所指定的目录
• Eclipse:Java项目的组建路径(Java Build Path)

访问权限

类的访问权限

• 公有权限public。具有公有权限的类是开放的。使用public类不受控制
• 默认权限:定义时没有为类设定访问权限,则该类具有默认权限。如果定义类时未指定访问权限,这意味该类只能被
– 同一程序文件的类
– 同一目录下其他程序文件中的类使用
– 默认权限是向本文件或本包定向开放的一种权限

类成员的访问权限

• 公有权限、私有权限、默认权限和保护权限
– 公有权限public。具有公有权限的类成员是开放的。访问public成员不受控制
– 私有权限private。具有私有权限的类成员是隐藏的。private成员只能在本类中访问,即只能被本类成员访问
– 默认权限:定义时没有为类成员设定访问权限,则该类成员具有默认权限。如果定义类成员时未指定访问权限,这意味该类成员只能被
• 同一程序文件的类
• 同一目录下其他程序文件中的类访问
– 保护权限protected

JAR包

– 可以将编译好的类程序文件(*.class)压缩打包成Java归档文件(Java ARchive,简称为JAR)
– 使用JDK中的归档打包程序(jar.exe)对类程序文件及其附属文件(例如图片文件)进行压缩打包,所生成的归档文件扩展名为“.jar”。Java归档文件俗称为“JAR包

– 与JAR包相关的4条常用命令
• 创建、查看、解压或运行JA
在这里插入图片描述

仅打包一个类程序文件

在这里插入图片描述

打包一个子目录

在这里插入图片描述
打包一个可执行JAR包

清单(manifest)文件
Manifest-Version: 1.0
Main-Class: JMainClass

在这里插入图片描述

参考文献及教程链接:

文献及资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Ma.01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值