第4章类、对象和接口
合集下载
第4章 系统静态分析与静态模型

第4章 系统静态分析与静态模型
为什么要进行分析
用例描述的是参与者和系统边界之间的交互操作——系统 本身是一个黑盒子,带有外部才能看到的接口; 为了使得系统更容易开发和理解,用例细节是用自然语言 编写的——用例是不严密的; 需求阶段所得到的用例模型并不能全面描述系统,开发人 员仅通过这些模型也无法全面理解问题。
class Car{ (3)依赖关系 static void move(){ System.out.println(" car move"); } } class Drive{ public void drive(){ Car.move(); //静态方法 } } public class TestDrive { public static void main(String[] args) { Drive d=new Drive(); d.drive(); } }
接口
接口是在没有给出对象的实现和状态的情况下对对象 行为的描述。接口是一种特殊的类,所有接口都是有 构造型<<interface>>的类。在UML中,接口使用一个 带有名称的小圆圈来进行表示,并且可以通过一条 Realize(实现关系)线与实现它的类相连接。
类之间的关系
1.关联关系(Association) • 聚合(aggregation)
}
}
class Person{ private String name; //职工姓名 public Person(String name) { = name; } } class Company { private String name; //公司名称 public Person[] employee=new Person[3]; public Company(String name){ //构造函数 = name; } }
为什么要进行分析
用例描述的是参与者和系统边界之间的交互操作——系统 本身是一个黑盒子,带有外部才能看到的接口; 为了使得系统更容易开发和理解,用例细节是用自然语言 编写的——用例是不严密的; 需求阶段所得到的用例模型并不能全面描述系统,开发人 员仅通过这些模型也无法全面理解问题。
class Car{ (3)依赖关系 static void move(){ System.out.println(" car move"); } } class Drive{ public void drive(){ Car.move(); //静态方法 } } public class TestDrive { public static void main(String[] args) { Drive d=new Drive(); d.drive(); } }
接口
接口是在没有给出对象的实现和状态的情况下对对象 行为的描述。接口是一种特殊的类,所有接口都是有 构造型<<interface>>的类。在UML中,接口使用一个 带有名称的小圆圈来进行表示,并且可以通过一条 Realize(实现关系)线与实现它的类相连接。
类之间的关系
1.关联关系(Association) • 聚合(aggregation)
}
}
class Person{ private String name; //职工姓名 public Person(String name) { = name; } } class Company { private String name; //公司名称 public Person[] employee=new Person[3]; public Company(String name){ //构造函数 = name; } }
C++语言程序设计实验4(类和对象)

是:用初始对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。
构造函数和拷贝构造函数的声明格式如下:
class 类名
{
public: 类名(形参); 类名(类名 &对象名);
//构造函数 //拷贝构造函数
... ...
}; 类名::类名()
//构造函数的实现
{ 函数体;
} 类名::类名(类名 &对象名)
6. 本章小结
本章主要介绍了面向对象的基本概念、类和对象的声明、构造函数、析构函数、内联成 员函数、拷贝构造函数、类的组合。
类是面向对象程序设计中最重要、最基本的概念,也是学习面向对象方法时遇到的第 1 个难点。类是对逻辑上相关的函数和数据的封装,是对问题的抽象描述。
要理解类与对象,必须要结合实例来学习,读者可以思考:除了书中列出的例子,现实 世 界 中 还 有 哪 些 有 形 或 无 形 的 事 务 可 以 被 抽 象 为 程 序 中 的 类 ,每 个 类 又 存 在 哪 些 对 象( 实 体 )。 这样可以对类的概念了解的快一些。
本章开始的每章的最后有一个实例——人员信息管理程序,这个例子贯穿后续各章,利 用每章介绍的只是不断丰富程序的功能,建议课后仔细阅读、体会,并尝试修改、补充程序 的功能。
另外,本章中还介绍了利用 UML 语言表示类与对象的方法,以后各章还将进一步介绍 用 UML 语言表示类之间的关系,但这远不是 UML 语言的全部,这方面的内容也不是初学者 学习的重点,读者可以不必深究,了解一下就可以了。如果有需要,可以另外学习软件工程 的课程。
面向对象的程序设计目的是:实现软件设计的产业化。主要观点是认为自然界是由实体 (对象)所组成。程序设计的出发点是:使用面向对象的观点来描述模仿并处理现实问题。 他要求:高度概括、分类、抽象。
第四章 面向对象编程(三)

43
定义类CCircle实现接口
Class CCircle implements CircleCal{ double clength(double r){ return 2*PI*r; } double carea(double r){ return PI*r*r; }
44
5.没有实现父类中所有抽象方法的类,也是抽象类。
8
抽象类实例
public abstract class Car{
private double price;
pribate String brand;
private int speed;
public class CarDemo{
}
public static void main(String[] args){ 抽象类不 Car c=new Car(); }}//编译能否通过?? 能被实例 化
抽象类练习:
定义一个描述宠物的抽象类Pet,包含重 量(weight)和年龄(age)两个成员变 量和显示宠物资料的showInfo和获取宠 物资料的getInfo两个抽象方法。
19
生活中的接口
电脑主板上的PCI插槽的规范就类似于Java 接口
声卡
网卡
主板
显卡
每种卡的内部结构都不相同,可以把声卡、 网卡、显卡都插在PCI插槽上,而不用担心哪 个插槽是专门插哪个卡的
41
练习:
创建一个接口 CircleCal,其中有: 一个数据成员 pi=3.1415 一个方法 clength,求圆周长 一个方法 carea,求园面积 一个方法 cvolum,求球的体积 并创建一个类CCircle ,实现该接口
第四章Java面向对象特性课件

第4章 Java面向对象特性
对象的基本概念
面向对象程序语言三个关键特点: 封装 ( Encapsulation ) 多态 ( Polymorphism ) 继承 ( Inheritance )
1
第4章 Java面向对象特性
抽象数据类型
基本数据类型和聚集类型的变量与一些操作 (如+, -)之间不需特殊的联系。 在面向对象语言中,在数据类型的声明与操作
数据隐藏与封装举例
class Date{
private int day, month, year;
void setDate( int a, int b, int c){
day = a;
month = b;
year = c ;
}
}
…
Date d1;
d1=new Date( ); d1.setDate(30,9,2001);
4
第4章 Java面向对象特性
对象生命周期
创建对象 使用对象 清除不用的对象
5
第4章 Java面向对象特性
创建对象
创建对象的三个步骤: 声明 (Declaration ) 实例化(Instantiation) 初始化(Initialization)
例: Point origin_one ; origin_one = new Point(23, 94); Rectangle rect_one = new Rectangle(origin_one, 100, 200); Rectangle rect_two = new Rectangle(50, 100);
public void changeObjValue( PassTest ref){
ref.ptValue = 99.0f; }
对象的基本概念
面向对象程序语言三个关键特点: 封装 ( Encapsulation ) 多态 ( Polymorphism ) 继承 ( Inheritance )
1
第4章 Java面向对象特性
抽象数据类型
基本数据类型和聚集类型的变量与一些操作 (如+, -)之间不需特殊的联系。 在面向对象语言中,在数据类型的声明与操作
数据隐藏与封装举例
class Date{
private int day, month, year;
void setDate( int a, int b, int c){
day = a;
month = b;
year = c ;
}
}
…
Date d1;
d1=new Date( ); d1.setDate(30,9,2001);
4
第4章 Java面向对象特性
对象生命周期
创建对象 使用对象 清除不用的对象
5
第4章 Java面向对象特性
创建对象
创建对象的三个步骤: 声明 (Declaration ) 实例化(Instantiation) 初始化(Initialization)
例: Point origin_one ; origin_one = new Point(23, 94); Rectangle rect_one = new Rectangle(origin_one, 100, 200); Rectangle rect_two = new Rectangle(50, 100);
public void changeObjValue( PassTest ref){
ref.ptValue = 99.0f; }
Java基础教程(第3版)_第4章_类与对象

如果有一个类是 public 类 , 那 么源文件的名字必须与这个类的 名字完全相同,扩展名是.java。编 译源文件将生成多个扩展名 为.class的字节码文件,每个字节 码文件的名字与源文件中对应的 类的名字相同,这些字节码文件 被存放在与源文件相同的目录中 。
2018/11/2
第 14 页
例子3 例子3中有两个Java源文件Example4_3.java和Rectangle.java,其 中Rectangle.java含有Rectangle类、Example4_3.java含有Circle类和 主类。程序运行效果如图4.5。
构造方法和对象的创建密切相关 。
2018/11/2
第 16 页
4.3.1 构造方法
构造方法是一种特殊方法,它的名字必须与它所在的类的名 字完全相同,而且没有类型。 允许一个类中编写若干个构造方法,但必须保证他们的参数 不同,即参数的个数不同,或者是参数的类型不同。
需要注意的是 ( 1) 如果类中没有编写构造方法, 系统会默认该类只有一个构造方法, 该默认的构造方法是无参数的,且方 法体中没有语句。 ( 2 )如果类里定义了一个或多个构 造方法,那么 Java 不提供默认的构造 方法 。
4.1.1
例子1 一个能输出圆的面积的 Java应用程序。
public class ComputerCircleArea { public static void main(String args[]) { double radius; //半径 double area; //面积 radius=163.16; area=3.14*radius *radius; //计算面积 System.out.printf("半径是%5.3f的园的面积:\n%5.3f\n",radius,area); } } 事实上, 如果其他Java应用程序也想计算圆的面积,同样需要知道计算 圆面积的算法,即也需要编写和这里同样多的代码。 现在提出如下问题: 能否将和圆有关的数据以及计算圆面积的代码进行封装,使得需要计 算圆面积的Java应用程序的主类无需编写计算面积的代码就可以计算出圆的 面积呢?
面向对象编程技术第四章-文档资料

说明:
关键字public后面声明公有类型成员 它们是类与外部的接口,任何外部函数都可以访问公有类 型数据和函数 关键字private后面声明私有类型成员
允许本类中的函数访问,类外部的任何函数都不能访问。 紧跟在类名称的后面声明私有成员,关键字private可省略 (不提 倡)
1.
2.
说明:
3.
保护类型与private类似,其差别表现在继承与派生时对派 生类的影响不同,在第七章介绍。
下页 例子
构造函数,后面介绍 class circle { public: circle::circle(int r) { radius=r; } int area() { return (int)3.14*radius*radius;
} void circle_prt() { cout<<"the private radius is:"<<radius<<endl; } void main() private: { int radius; circle circle1(1),circle2(3); };
3. 利用类易于编写大型复杂程序,其模块化程度比 C中采用函数更高。
慢慢体会…
2. 类的定义:
类是一种用户自定义类型,声明形式: class 类名 { public: 公有成员(外部接口) private: 私有成员 protected: 保护型成员 }
时钟类的成员 (数据成员与函数成员声明) class Clock 数据成员 {private: int Hour, Minute, Second; public: void SetTime(int NewH, int NewM, int NewS); void ShowTime( ); };
第四章 面向对象(上)

4.3 类的域(属性)与方法(操作)
Java中类包括域和方法两部分
域:即属性也称数据成员,是事特物静态特征 的抽象,可以是基本数据类型的数据或数组, 也可以是某一个类的对象
方法:即操作也称成员方法,是事物动态特征 的抽象,用于处理该类的数据
类的基本定义格式如下:
[修饰符] class 类名 [extends 父类] [implements 接口名] { 成员变量基本数据类型或某个类的对象 成员方法函数 }
类与对象
对象是对客观事物的抽象 类是对对象的抽象,在语言中是一种抽象的数 据类型。 它们的关系是,对象是类的实例,类是对象的 模板。
对象引用
类类型变量称为引用变量,它们并不直接保留 对象,只是保留对象的地址,而不是拥有对象 本身,通过引用变量即可以得到一个对象。 所有对象总是且只能通过内存引用访问,这种 方式称为间接寻址。
第四章 类与对象(上)
主要内容
4.1 面向对象技术 4.2 抽象、 类、对象及引用 4.3 类的域与方法 4.4 对象 4.5 构造方法 4.6 类成员属性和方法的非访问修饰符 4.7 包(Package)
4.1 面向对象技术
4.1.1 面向过程与面向对象的比较 面向过程程序设计方法
过程化程序设计先确定算法,再确定数据结构 程序=算法+数据结构 缺点
类成员方法
[修饰符] 返回值类型 方法名(参数列表)
[throws 例外名1,例外名2,…] { 局部变量声明;
语句序列;
}
类成员方法
局部变量
局部变量在某一个语句(如for语句)或代码块 (如方法体)中声明,作用域是声明该变量的 语句或代码块 局部变量使用前必须初始化
C++程序设计(第二版吴乃陵况迎辉)答案——第四章

(4) 函数来访问(读和写)。这些函数统称为
和 (3) (5) 。
。私有数据通常由
答案: (1) public(公有的) (2) private(私有的) (3) protected(保护的) (4) 公有的成员函数 (5) 类的接口 4.1.3 通常在逻辑上,同一类的每个对象都有 (1) 代码区,用以存储成员函数。而
(4) 中,全局域被包括在 (5) 中。using 指示符以关键字 using 开头,后面是 关键字 (6) ,最后是 (7) 。这样表示以后在该名字空间中所有成员都 (8) 。如不使用 using 指示符则在使用时要加::,称为 (9) 运算符。
答案: (1) 局部域(local scope) (2) 名字空间域(namespace scope) (3) 类域(class scope) (4) 局部域 (5) 名字空间域 (6) namespace (7) 名字空间名
第四章 类与对象习题
3
封装性增加了对象的独立性,C++通过建立数据类型——类,来支持封装和数据隐藏。 一个定义完好的类一旦建立,就可看成完全的封装体,作为一个整体单元使用,用户不需要 知道这个类是如何工作的,而只需要知道如何使用就行。另一方面,封装增加了数据的可靠 性,保护类中的数据不被类以外的程序随意使用。这两个优点十分有利于程序的调试和维护。
4.2.14 对象的第一特征是封装,那么由对象组成的面向对象的程序怎样建立各对象之间的 有效联系?面向对象程序的组织与面向过程有什么不同? 答:因为对象的操作主要用来响应外来消息并为其他对象提供服务,所以面向对象的程序利 用消息传递机制来建立各对象之间的有效联系,协调各对象的运行。一个对象可以向其他对 象发送消息以请求服务,也可以响应其他对象传来的消息,完成自身固有的某些操作,从而 服务于其他对象。
和 (3) (5) 。
。私有数据通常由
答案: (1) public(公有的) (2) private(私有的) (3) protected(保护的) (4) 公有的成员函数 (5) 类的接口 4.1.3 通常在逻辑上,同一类的每个对象都有 (1) 代码区,用以存储成员函数。而
(4) 中,全局域被包括在 (5) 中。using 指示符以关键字 using 开头,后面是 关键字 (6) ,最后是 (7) 。这样表示以后在该名字空间中所有成员都 (8) 。如不使用 using 指示符则在使用时要加::,称为 (9) 运算符。
答案: (1) 局部域(local scope) (2) 名字空间域(namespace scope) (3) 类域(class scope) (4) 局部域 (5) 名字空间域 (6) namespace (7) 名字空间名
第四章 类与对象习题
3
封装性增加了对象的独立性,C++通过建立数据类型——类,来支持封装和数据隐藏。 一个定义完好的类一旦建立,就可看成完全的封装体,作为一个整体单元使用,用户不需要 知道这个类是如何工作的,而只需要知道如何使用就行。另一方面,封装增加了数据的可靠 性,保护类中的数据不被类以外的程序随意使用。这两个优点十分有利于程序的调试和维护。
4.2.14 对象的第一特征是封装,那么由对象组成的面向对象的程序怎样建立各对象之间的 有效联系?面向对象程序的组织与面向过程有什么不同? 答:因为对象的操作主要用来响应外来消息并为其他对象提供服务,所以面向对象的程序利 用消息传递机制来建立各对象之间的有效联系,协调各对象的运行。一个对象可以向其他对 象发送消息以请求服务,也可以响应其他对象传来的消息,完成自身固有的某些操作,从而 服务于其他对象。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.类方法和实例方法
类中的方法也可分为实例方法和类方法. 方法声明时,方法类型前面不加关键字 static的是实例方法、加关键字static的是类 方法。 构造方法是特殊的方法,不能用static修饰 构造方法。
8、要注意的问题
对成员变量的操作只能放在方法中,方法 可以对成员变量和方法体中自己定义局部 变量进行操作。在定义类的成员变量时可 以同时赋予初值。 如class a 正确 class a 不正确 { int a=12;} { int a; a=12;} 如:class a { int a; void f(){int x=111; a=x+1111;}}
声明对象时的内存模型
当用XiyoujiRenwu类 声明一个变量,即对 象zhubajie时,如例子 1中的对象zhubajie:
XiyoujiRenwu zhubajie;
内存模型如左图所示
对象分配内存后的内存模型
当系统见到:
zhubajie=new XiyoujiRenwu();
时,就会做两件事:
class 三角形 { float sideA,sideB,sideC,lengthSum; void setSide(float sideA,float sideB,float sideC) { this.sideA=sideA; this.sideB=sideB; this.sideC=sideC; } } this.sideA,this.sideB,this.sideC就分别表示成 员变量sideA,sideB,sideC
6.构造方法
构造方法是一种特殊方法,它的名字必须 与它所在的类的名字完全相同,而且没有 类型,构造方法也可以重载。 构造方法是在构造类对象时使用的一种特 殊的成员方法,其主要作用是初始化成员 变量.
class 梯形 { float 上底,下底,高; 梯形() { 上底=60; 下底=100; 高=20; } 梯形(float x,int y,float h) { 上底=x; 下底=y; 高=h; } }
4.1 编程语言的几个发展阶段 4.2 类 4.3 对象 4.4 static 关键字 4.5 this 关键字 4.6 包 4.7 访问权限 4.8 类的继承 4.9 对象的上转型对象 4.10 多态性
4.1 编程语言的几个发展阶段(1)
机器语言(如汇编语言) 计算机处理信息的早期语言是所谓的机器语言, 这种语言中的指令都是由0,1组成的序列,称这 样的序列为一条机器指令。 过程语言 语言把代码组成叫做过程或函数的块。每个块的 目标是完成某个任务,例如,一个C的源程序就 是由若干个书写形式互相独立的函数组成。 面向对象编程
4.1 编程语言的几个发展阶段(2)
面向对象编程主要体现下列三个特性: 1.封装性 2.继承 3.多态 Java语言是面向对象语言,它的源程序是 由若干个类组成,源文件是扩展名为.java 的文本ห้องสมุดไป่ตู้件
4.2 类
类是组成Java程序的基本要素。类封装了 一类对象的状态和方法。类是用来定义对 象的模板。 类的实现包括两部分:类声明和类体。
4.方法(2)
写一个方法和C语言中写一个函数类似,只不过 在这里称做方法
5.方法重载
方法重载的意思是:一个类中可以有多个 方法具有相同的名字,但这些方法的参数 必须不同,即或者是参数的个数不同,或 者是参数的类型不同。
class Area { float getArea(float r) { return 3.14f*r*r; } double getArea(float x,int y) { return x*y; } float getArea(int x,float y) { return x*y; } double getArea(float x,float y,float z) { return (x*x+y*y+z*z)*2.0; } } 注意:方法的返回类型和参数的名字不参与比较,也就是说 如果两个方法的名字相同,即使类型不同,也必须保证参 数类型不同。
① 为height,weight,head,ear, mouth,hand,foot各个变量 分配内存,即XiyoujiRenwu类的 成员变量被分配内存空间,然后 执行构造方法中的语句。 ② new运算符在为变量height, weight,head,ear,mouth, hand,foot分配内存后,将返回 一个引用给对象变量zhubajie。
3.成员变量和局部变量(1)
我们已经知道类体分为两部分。变量定义部 分所定义的变量被称为类的成员变量。在 方法体中定义的变量和方法的参数被称为 局部变量。 成员变量在整个类内都有效,局部变量只在 定义它的方法内有效。
3.成员变量和局部变量(1)
class Sun { int distance; int find() {int a=12; distance=a ; //合法,distance在整个类内有效 return distance; } void g() { int y; y=a; //非法,因为a已经失效,而方法g中没有定义a }}
8、要注意的问题
实例方法既能对类变量操作也能对实例变量操作,而类方 法只能对类变量操作。 如 class A { int a; static int b; void f(int x,int y) { a=x; //合法 b=y;//非法} static void g(int z) { b=23; //合法 a=z;//非法}
class 梯形 { float 上底,下底,高,laderArea; //变量定义部分 float 计算面积() //方法定义 { laderArea=(上底+下底)*高/2.0f; return laderArea; } void 修改高(float h) //方法定义 { 高=h; } }
3.成员变量和局部变量(1)
对象分配内存后的内存模型
3、创建多个不同的对象 一个类通过使用new运算符可以创建多个 不同的对象,这些对象将被分配不同的内 存空间,因此,改变其中一个对象的状态 不会影响其他对象的状态。如 zhubajie=new XiyoujiRenwu(); sunwukong=new XiyoujiRenwu();
8、要注意的问题
一个类中的方法可以互相调用,实例方法可以调用该类中 的其他方法;类中的类方法只能调用该类的类方法,不能 调用实例方法。如 class A { float a; void setA(float x,float y){a=get(x,y);} static float get(float x,float y) {float c=max(x,y); return c;} static float max(float x,float y) {return x>y?x:y;} }
1.类声明
class People {… } “class People”叫做类声明;“People” 是 类名。习惯上类名的第一个字母大写,但 这不是必须的。 而且类名最好容易识别。
2.类体
写类的目的是为了描述一类事物共有的属 性和功能,描述过程由类体来实现。类声 明之后的一对大括号“{”,“}”以及它们之 间的内容称做类体,大括号之间的内容称 做类体的内容。 类体的内容由两部分构:一部分是变量的 定义,用来刻画属性;另一部分是方法的 定义,用来刻画功能。
4.方法(1)
我们已经知道一个类的类体由两部分组成: 变量的定义和方法的定义。方法的定义包 括两部分:方法声明和方法体。 方法声明部分 {方法体的内容}
4.方法(1)
1、方法的声明 最基本的方法声明包括方法名和方法的类型, 如 float area() {…..} void setA(double radius,int a) {…..}
第4章
类、对象和接口
4.11 abstract 类和abstract方法 4.12 super关键字 4.13 接口 4.14 内部类 4.15 匿名类 4.16 异常类 4.17 Class类 4.18 基本类型的类包装 4.19 反编译和文档生成器 4.20 jar文件
4.3 对象
类是创建对象的模板。当使用一个类创建 了一个对象时,我们也说我们给出了这个 类的一个实例。
1.创建对象
创建一个对象包括对象的声明和为对象分 配内存两个步骤。 (1).对象的声明。 一般格式为: 类的名字 对象名字; 如: People zhangPing;
(2)为声明的对象分配内存 使用new运算符和类的构造方法为声明的对 象分配内存,如果类中没有构造方法,系 统会调用默认的构造方法(默认的构造方 法是无参数的,你一定还记得构造方法的 名字必须和类名相同这一规定)。如: zhangPing=new People();
(3)对象的内存模型 使用例子1来说明对象的内存模型 例子4.1,4.2 class XiyoujiRenwu { float height,weight; String head, ear,hand,foot, mouth; void speak(String s) { System.out.println(s); } } class A { public static void main(String args[]) { XiyoujiRenwu zhubajie; //声明对象 zhubajie=new XiyoujiRenwu(); //为对象分配内存, //使用new 运 算 符和默认的构造方法 } }
成员变量和局部变量的类型可以是JAVA中的任何 一种数据类型,包括基本类型和引用类型。 class People { int boy; float a[]; void f() {boolean cool; Workman zhangboy;} } class Workman { double x; }