第三章抽象封装和类_第1页
第三章抽象封装和类_第2页
第三章抽象封装和类_第3页
第三章抽象封装和类_第4页
第三章抽象封装和类_第5页
已阅读5页,还剩69页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2020/7/25,1,第三章 抽象、封装和类,重点掌握: 抽象与封装 用户自定义类和对象 Java 类库概述,2020/7/25,2,3.1面向过程到面向对象的转变 3.2面向对象的基本概念 3.3 类 3.4 类的修饰和它的“推广空间” 3.5 数据成员 3.6 方法,第三章 抽象、封装和类,2020/7/25,3,3.1面向过程到面向对象的转变,使用面向过程描述一件事,青椒炒牛肉,取出青椒 500 g,用刀切成细丝,过油 取出牛肉 300 g,切丁,用醬油、酒、淹制 30 分钟 起油锅、放入牛肉炒及青椒大火快炒1 分半 拿出太白粉、水调在一起,这个称为 芡汁。 將芡汁倒入锅中搅拌,会产生

2、粘稠现象这叫芶芡 完成。,使用面向对象描述一件事,青椒炒牛肉,青椒 数量:500 g 处理:用刀切成细丝,过油 牛肉 数量:300 g 处理:切丁,用醬油、酒、淹制 芡汁 制作:太白粉调上适量的水 芶芡:將芡汁倒入锅中 青椒处理好、牛肉处理好、芡汁制作好,放入锅中快炒 1 分半后用芡汁芶芡即可。,2020/7/25,4,何为面向对象,先定义好参与这件事的物品有哪些 (这些物品叫做 “对象”),再定义这些物品所需的数量及行为 (这些数量及行为叫做“属性”与“方法”),接下來可用物品间的互动行为來描述整件事情是如何发生的。(这部分的描述称为 “主程序”),青椒炒牛肉,青椒 数量:500 g 处理:

3、用刀切成细丝,过油 牛肉 数量:300 g 处理:切丁,用醬油、酒、淹制 芡汁 制作:太白粉调上适量的水 芶芡:將芡汁倒入锅中 青椒处理好、牛肉处理好、芡汁制作好,放入锅中快炒 1 分半后用芡汁芶芡即可。,2020/7/25,5,3.2面向对象的基本概念,3.2.1 抽象,什么是抽象 抽象就是抽出事物的本质特性而暂时不考虑它们的细节。 过程抽象和数据抽象是常用的两种主要抽象手段。,2020/7/25,6,3.2.2 封装,将信息隐蔽的过程称为封装。,2020/7/25,7,有两方面的原因促使我们控制对成员的访问。 原因一:防止程序员接触他们不该接触的东西通常是内部数据类型的设计思想。若只是为了

4、解决特定的问题,用户只需操作接口即可,毋需明白这些信息。 原因二:允许库设计人员修改内部结构,不用担心它会对客户程序员造成什么影响。,2020/7/25,8,3.2.3 对象,对象(object)应是实际问题域中有意义的个体或概念实体。 对象应该以某种方式与系统发生关联,即对象应该与系统中其他有意义的对象进行消息传递,并提供外部服务。,2020/7/25,9,如何理解对象? (1) 所有东西都是对象。可将对象想象成一种新型变量;它保存着数据,但可要求它对自身进行操作。 (2) 程序是一大堆对象的组合;通过消息传递,各对象知道自己该做些什么。 (3) 每个对象都有自己的存储空间,可容纳其他对象。

5、 (4) 每个对象都有一种类型。根据语法,每个对象都是某个“类”的一个“实例”。 (5)同一类所有对象都能接收相同的消息。,2020/7/25,10,对象的三个要素: 1、对象的标识:对象的名字。 2、属性:对象的静态特征 3、方法:服务和操作。,汽车,行驶,转弯,刹车,静态属性,动 态 属 性,颜色,马力等,2020/7/25,11,对象的图形化描述:,对象:小李的手表,静态特征:小李 指针表 单价180元 银色表带,动态特征:显示当前时间 修改当前时间,2020/7/25,12,实验二-Java语言基础,掷骰子6000次, 分别统计每一面出现的次数。 (int)(Math.random()

6、*(100+1),2020/7/25,13,import java.util.Scanner; import java.math.*; public class AA public static void main(String args) int count = 0,0,0,0,0,0; for (int i = 0; i 6000; i+) int result = (int) (Math.random()*6); countresult +; / print the result for (int i = 0; i count.length; i+) System.out.println

7、(i + 出现 + counti + 次!); ,2020/7/25,14,3.3 类,3.3.1类的相关概念 何谓“类 (Class)” 类是现实世界某些对象的共同特征(属性和操作)的表示, 对象是类的实例。 將所需属性和操作打包在一起,并给它一个名字以方便操作。,类的属性:就是类的静态属性的简称,指类内包含的各项数据,如变量或其他类的对象; 类的服务: 则被称为成员函数或方法。,2020/7/25,15,客戶,String User = “Robert”; String Pass = “1234”;,Login(User, Pass) ,class Customer String User

8、 = “Robert”; String Pass = “1234”; Login(User, Pass) ;,属性,方法,2020/7/25,16,类与对象的关系,类(Class):对象的设计蓝图 对象(Object):根据类建造出來的实体,2020/7/25,17,class Customer String User = “Robert”; String Pass = “1234”; function Login(User, Pass) ;,Robert = new Customer,Peter = new Customer,Lisa = new Customer,对象,类,2020/7/2

9、5,18,何谓面向对象程序设计,把真实世界的物品,以 class 表現出來,“客戶”,class Customer String User = “Robert”; String Pass = “1234”; function Login(User, Pass) ;,Robert,Peter,Lisa,Robert = new Customer,Peter = new Customer,Lisa = new Customer,2020/7/25,19,类的基本定义方法: 修饰符class类名 extends 父类implements 接口名 类成员变量声明 类方法声明 ,2020/7/25,20

10、,1关于类头-class、extends,class关键字,在它的后面,应跟随新数据类型的名称。(注意不要把class写成Class)。 父类名跟在extends 关键字后面,用来说明当前类是哪个已经存在类的子类,存在继承关系。,2020/7/25,21,1关于类头-类的修饰符,“public”(公共) 意味着后续的定义任何人均可使用。 “private”(私有)意味着除您自己、类型的创建者以及那个类型的内部函数成员,其他任何人都不能访问后续的定义信息。 “protected”(受保护的)与“private”相似,只是一个继承的类可访问受保护的成员,但不能访问私有成员。 “friendly”(

11、友好的)若某样东西是“友好的”,意味着它只能在这个包装的范围内使用(所以这一访问级别有时也叫作“包装访问”),2020/7/25,22,1关于类头-接口名,接口是一种与类相似的结构,只包含常量和抽象方法,目的是指明多个对象的共同行为。接口名跟在implements关键字后面,用来说明当前类中实现了哪个接口定义的功能和方法。,2020/7/25,23,2关于类体 类体的定义要包括类的具体内容,包括类的属性与方法。 class ,2020/7/25,24,Java中声明类属性为简单变量的语法如下: 修饰符 变量类型 变量名 =变量初值;,变量类型和变量名是声明一个变量必不可少的部分。,2关于类体-

12、类的属性,2020/7/25,25,2关于类体-类的方法,Java中声明方法的语法如下: 修饰符 返回值类型 方法名(参数列表) 方法体: 局部变量声明; 语句序列; ,类中定义的方法通常起到两种作用: 一是围绕着类的属性进行各种操作; 二是与其他的类或对象进行数据交流、消息传递等操作。,2020/7/25,26,3、类图的描述,2020/7/25,27,3.3.2 用户程序自定义类,Java程序员把注意力放在创建称为类的用户自定义类型(user-defined type)上,类也称为程序员定义的类型(programmer-defined type); 每个类都含有数据和一组操作数据的方法:

13、类中的数据部分称为实例变量。 用户定义类型(即类)的实例称为对象。,2020/7/25,28,class Employee /构造函数 public Employee(String n,double s) name = n; /职工姓名 salary = s; /职工工资 /方法1 public String getName() return name; /更多的方法 /属性的实例 private String name; private double salary; ,2020/7/25,29,3.3.3 创建类及类的实例对象,对象是类的一个实例,类是同种对象的抽象,是创建对象的模板。 在程

14、序中创建一个对象,将在内存中开辟一块空间,其中包括该对象的属性和方法。,2020/7/25,30,1、声明对象 格式:类名 对象列表; 例: Employee newEmp1,newEmp2; 2、建立对象 格式: 对象名 = new 构造方法(); 例:newEmp1 = new Employee(张三, 75); newEmp2 = new Employee(“李四, 75); 或合为一步: Employee newEmp2 = new Employee(“李四, 75);,注意: 创建对象以某个类为模板,这个类里定义了哪些属性和方法,新建的对象就必然在内存里拥有相应的属性和方法。 相对于

15、简单数据类型,类就是用户自己定义的复杂的抽象数据类型; 相对于简单变量,对象就是复杂的既包括数据又包括方法代码的复杂数据单位。,2020/7/25,31,3、初始化对象,构造函数 要使用对象,首先必须构造它们,并指定它们的初始状态,然后将方法应用于对象。 在Java程序设计语言中,使用构造函数(constructor)来构造新的实例。 一个构造函数是一个新的方法,它的作用是构造并初始化对象。,2020/7/25,32,构造函数是类的一种特殊方法,它的特殊性主要体现在如下的几个方面: (1)构造函数的方法名与类名相同。 (2)构造函数没有返回类型。构造函数可以有0个、1个或多个参数。 (3)构造

16、函数的主要作用是完成对类对象的初始化工作。 (4)构造函数不能由编程人员显式地直接调用,构造函数总是和new运算符一起被调用。 (5)在创建一个类的新对象的同时,系统会自动调用该类的构造函数为新对象初始化。,2020/7/25,33,Java中可以不定义构造函数,此时系统会自动为该系统生成一个默认的构造函数。 这个构造函数的名字与类名相同,它没有任何形式参数,也不完成任何操作。 为了避免失去控制,一般将构造函数的声明与创建分开处理。,2020/7/25,34,例1 Java中对象的初始化,class Valuement boolean a; char b; byte c; short d; i

17、nt e; long f; float g; double h; void print() ystem.out.println(boolean + a); System.out.println(char + b); System.out.println(byte + c); System.out.println(short + d); System.out.println(int + e); System.out.println(long + f); System.out.println(float + g); System.out.println(double + h); ,public c

18、lass InitVal public static void main(String args) Valuement value = new Valuement(); value.print(); ,2020/7/25,35,boolean false char byte 0 short 0 int 0 long 0 float 0.0 double 0.0,2020/7/25,36,习题,1、抽象小李、小王等同学,构造学生类,用类图方法描述学生类,用对象图描述小李。 2、写出描述学生类的java语言片段。并以此类声明“小李同学”、建立“小李同学”。,2020/7/25,37,3.4 类的修

19、饰和它的“推广空间”,类的修饰符用来说明对它的访问限制 1、无修饰符 如果一个类前无修饰符,那么这个类只能被同个包里的类使用。(同个程序文件中的类都可以使用该类)。,2020/7/25,38,public class c3_2 /公共类c3_2 public static void main(String args) pp p1=new pp(); /类c3_2中创建了一个无修饰符类pp的对象p1 System.out.println(p1.a); ,例2 class pp /无修饰符的类pp int a=45; /pp类的数据成员a ,2020/7/25,39,2、public修饰符 表示该

20、类是公共类, 可以被本包其他类使用, 可以被其他包中类使用,但在其他包中使用该类,必须用import语句引入该类所在包。 注意:在一个程序文件中,只能定义一个public类 例如:上例中, c3_2 就是一个公共类。,2020/7/25,40,3、final修饰符用来说明最终类 说明该类为最终类的目的为: 如果一个类被声明为final,通常是一些有特殊作用的、用来完成标准功能的类。 将一个类定义为final则可以将它的内容、属性和功能固定下来,与它的类名形成稳定的映射关系,从而保证引用这个类时所实现的功能是准确无误的。 提高安全性。由于最终类不能派生子类,所以切断了非法访问利用派生子类访问关键

21、信息的途径。,2020/7/25,41,例3 import java.awt.*; import java.applet.*;,final class p1 /用final修饰的类p1 int i=7; int j=1; void f(Graphics g) g.drawString(OK ,20,50); ,/ public class c3_3 extends p1,public class c3_3 extends Applet public void paint(Graphics g) p1 n=new p1(); n.f(g); n.i=40; n.j+; g.drawString(

22、i=+n.i,20,70); g.drawString(j=+n.j,20,90); ,用final修饰的类p1不能有继承类,OK i=40 j=2,2020/7/25,42,4、abstract修饰符用来说明抽象类 抽象类不能被实例化。 例如: abstract class transport . 如果在别的类中出现下面的语句就是非法的: transport trans1 = new transport(); 解决方法:由该抽象类派生一子类,重载其中的抽象方法,完善它。然后用该子类实例化。 方法重载:在一个类中有两个方法,它们具有相同的名字,但有不同的参数列表。,2020/7/25,43,3

23、.5 数据成员,3.5.1 数据成员的声明 Java中声明类属性为简单变量的语法如下: 修饰符 变量类型 变量名 =变量初值; 注:修饰符分两种:,2020/7/25,44,3.5.2 访问权限控制符 私有访问控制符private 用private修饰的属性只能被该类自身所访问和修改,而不能被任何其他类,包括该类的子类,来获取和引用。 例:有两个字段,它们含有在Employee类的实例 内部被操作的数据。 private string name; private double salary; private(私有的)关键字用来确保可以访问这些实例字段的只能是Employee类本身的方法。 将属

24、性说明为“私有的”是数据安全的保证。,2020/7/25,45,保护访问控制符protected 用protected修饰的成员变量可以被三种类所引用 该类自身、 与它在同一个包中的其他类、 在其他包中的该类的子类。 使用protected修饰符的主要作用: 允许其他包中的它的子类来访问父类的特定属性。 例: protected double salary;,2020/7/25,46,私有保护访问控制符 private protected private和protected按顺序连用构成一个完整的 访问控制符:私有保护访问控制符。 用private protected修饰的成员变量可以被两种类

25、 访问和引用: 一种是该类本身, 一种是该类的所有子类,不论这些子类是与该类在同一个包里,还是处于其他的包中。 相对于protected,private protected修饰符把同一包内的非子类排除在可访问的范围之外,使得成员变量更专有于具有明确继承关系的类,而不是松散地组合在一起的包。,2020/7/25,47,公共访问控制符public 字段应用public关键字,这是一种非常糟糕的做法,破坏封装,不推荐。,注:一个类作为整体对程序的其他部分可见,并不能代表类内的所有属性和方法也同时对程序的其他部分可见,前者只是后者的必要条件; 类的属性和方法能否为所有其他类所访问,还要看这些属性和方法

26、自己的访问控制符。,2020/7/25,48,3.5.3 静态修饰符,static称为静态修饰符,它可以修饰类中的属性。 使用场合: 只想用一个存储区域来保存一个特定的数据无论要创建多少个对象,甚至根本不创建对象; 被static修饰的属性称为静态属性; 最本质的特点: 它们是类的属性,而不属于任何一个类的具体对象 对于该类的任何一个具体对象而言,静态属性是一个公共的存储单元,任何一个类的对象访问它时,取到的都是相同的数值,同样任何一个类的对象去修改它时,也都是在对同一个内存单元做操作。 访问: 类名加点操作符访问。,2020/7/25,49,import java.awt.*; import

27、 java.applet.*; 例 4 class pc static double ad=8; public class c3_4 extends Applet public void paint(Graphics g) pc m=new pc(); pc m1=new pc(); m.ad=0.1; /只对m对象的数据成员ad赋了值 g.drawString(m1.ad=+m1.ad,20,50); g.drawString(“pc.ad=+pc.ad,20,70); g.drawString(m.ad=+m.ad,20,90); ,m1.ad=0.1 pc.ad=0.1 m.ad=0.1

28、,2020/7/25,50,3.5.4最终属性修饰符final 无论static还是final字段,都只能存储一个数据,而且不得改变。 初始化: 可以在声明时初始化; 可以通过构造方法初始化; 不能在程序的其他部分赋值。 在对象被构造时,常量必须被初始化。 即,必须保证在每一个构造函数结束之前其值已被设定。以后其值不能改变。,2020/7/25,51,import java.awt.*; 例 5 import java.applet.*; class ca static int n=20; final int nn; /声明nn,但没有赋初值 final int k=40;/声明k并赋初值40

29、 ca( ) nn= +n; /在构造方法中给nn赋值 ,2020/7/25,52,public class c3_5 extends Applet public void paint(Graphics g) ca m1=new ca(); /创建对象m1, ca m2=new ca(); /创建对象m2, m1.nn=90; g.drawString(m1.nn=+m1.nn,20,30); g.drawString(m1.k=+m1.k,20,50); g.drawString(m2.nn=+m2.nn,20,70); g.drawString(m2.k=+m2.k,20,90); ,/错

30、误的赋值语句,因nn是标识符常量,m1.nn=21 m1.k=40 m2.nn=22 m2.k=40,import java.awt.*; 例 5 import java.applet.*; class ca static int n=20; final int nn; /声明nn,但没有赋初值 final int k=40;/声明k并赋初值40 ca( ) nn= +n; /在构造方法中给nn赋值,2020/7/25,53,3.6.1 方法概述,3.6 方法,Java程序是由一个个类定义组成的; 类有两个部分:属性和方法; 属性描述类是什么,方法描述类做什么; 方法是类的主要组成部分。在一个

31、类中,程序的作用体现在方法中; 方法即是JAVA创建一个有名字的子程序; 一个主方法和若干个子方法构成; 主方法调用其他方法,其他方法间也可互相调用; 同一个方法可被一个或多个方法调用任意次。,2020/7/25,54,Java程序的基本结构如下: 引入Java类库; 定义用户类1 定义类1的若干变量或对象: 定义类1的方法1; 定义类1的方法2; 定义类1的方法M1; 定义用户类2 定义类2的若干变量或对象: 定义类2的方法1; 定义类2的方法2; 定义类2的方法M2 ,2020/7/25,55,Java语言的方法实现子任务处理时,有下面几个原则与规律: (1)算法中需要细化的步骤、程序中重

32、复的代码以及重载父类方法都可以定义成类的方法。 (2)界面清晰。 (3)大小适中。 (4)方法有两种: 一种:标准方法,Java API提供了丰富的类和方法,这些方法提供了程序员所需的许多功能。 另一种:用户自定义的方法,以解决用户专门需要。 (5)Java应用程序中,程序的执行从main类开始,调用其他方法后又回到main类,在main类中结束整个程序的运行。,2020/7/25,56,3.6.2 定义方法 1声明方法头 2声明方法体,Java中声明方法的语法如下: 修饰符 返回值类型 方法名(参数列表) throws 例外名1,例外名2, 方法体: 局部变量声明; 语句序列; ,类的方法,

33、又称为成员函数,用来规定类属性上的操作,2020/7/25,57,1声明方法头 方法头一般由方法名、参数列表、返回类型、方法修饰符和方法抛出的例外五部分组成。,(1)方法名可以是任何有效的标识符,命名规则与标识符命名规则相同。 (2)类型说明符用来指定方法返回值的类型,方法最多只能返回一个值。 (3)参数列表是方法的输入接口,它列出了一系列形式参数的类型和名称,在方法参数表的右括号后加一个分号是语法错误。 参数表以逗号为分隔符,其中包含了方法被调用时传递给方法的参数说明。对于方法定义中的每一个参数,方法调用时必须有一个参量与之对应,而且该参量的类型必须与对应参数类型相一致。,2020/7/25

34、,58,2 声明方法体,方法头定义了方法的性质, 方法体定义了方法的具体内容。 注:在一个方法中定义另一个方法将产生语法错误。 (1)最好避免局部变量“屏蔽”实例变量,在一个类中不使用同名标识符就可以做到这一点; 方法调用中参数用来传递数值、传递引用,同时方法还可以嵌套、递归调用。 (2)方法体中如果指定了非void的返回值类型,方法中就必须包含一条return语句保证任何情况下都有返回数值,return语句后面不能跟任何表达式;,2020/7/25,59,例如下面的语句为部门类Department定义方法: class Department int m_ DeptNo; 部门编号 Strin

35、g m_DeptName; 部门名称 int m_DeptTotalEmp;部门雇员数 ManagerEmployee m_DeptMgr; 部门主管 int getDeptNo( ) 获取当前对象的部门号 return m _DeptNo; 返回这个对象的部门号 ,2020/7/25,60,3 方法修饰符(访问控制符),2020/7/25,61,3 方法修饰符(非访问控制符),一、static修饰的静态方法 属于整个类的类方法; 不用static修饰的方法是属于某个具体类对象的方法。 使用特点: 1) 可用对象名或类名作前缀引用静态方法; 2) static方法只能访问static数据成员,

36、不能访问非static数据成员; 非static方法可以访问static数据成员; 3) static方法只能访问static方法,不能访问非static方法; 非static方法可以访问static方法;,2020/7/25,62,4) static方法不能被覆盖,即这个类的子类不能有相同名,相同参数的方法; 5)main方法是静态方法。,2020/7/25,63,class f int d1; static int d2; void me( ) . static void me1( ) static void me2( ) me1( ); d1=3; me( ); d2=6; class

37、f1 extends f void me1( ) ,/错,/错,/错,/对,/对,2020/7/25,64,二、 final修饰的最终方法 为方法“上锁”,防止任何继承类改变它的本来含义。 设计程序时,若希望一个方法的行为在继承期间保持不变,而且不可被覆盖或改写,就可以采取这种做法。 注意: 若final修饰了某个方法,则该类的子类就不能覆盖父类的方法。 即不能再重新定义与此方法同名的自己的方法,而仅能使用从父类继承来的方法。,2020/7/25,65,三、abstract修饰的抽象方法 特点: 1) 只有方法头,无具体方法体; 2)具有一个或多个抽象方法的类本身必须为abstract类; 3

38、)方法体的具体实现,由当前类的不同子类在它们各自的类定义中完成。 (即各子类继承父类后,重载方法) (也即抽象方法在子类中实现。),2020/7/25,66,3.6.3 方法的调用,一、调用方法分类 Java语言中调用方法有两类: 1、需要程序书写专门的调用命令来调用的方法,称为程序调用方法; 2、运行过程中系统自动调用的方法,称为系统方法; 例如paint() 等。这两类方法的定义和使用原则有很大差异。,2020/7/25,67,二、调用方法的语句形式 1、在类中调用类自身的方法,可以直接使用这个方法的名称; class temp String name; String get() return name; void

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论