《java面向对象编程基础.ppt》由会员分享,可在线阅读,更多相关《java面向对象编程基础.ppt(73页珍藏版)》请在三一办公上搜索。
1、第三章,面向对象编程,2,目标,理解对象理解类理解抽象和封装理解对象与类之间的关系掌握包的创建和导入,3,面向对象编程,4,对象,具备某种功能 完成特定任务,“对象是存在的具体实体,具有明确定义的特征和行为。”,5,对象的示例,收银员对象,顾客对象,顾客姓名:朱丽叶年龄:28操作:购买商品,特征,姓名:布兰尼年龄:35职务:收银员操作:收款打印帐单,行为,6,类,类是面向对象程序设计的基础和核心类是对象的抽象和归纳,是对象的模板,水果类,动物类,汽车类,类的示例,“类是具有相同属性和方法的一组对象的集合”,7,类和对象的示例,收银员,系统管理员,仓库管理员,促销员,部门经理,8,属性,属性名称
2、由类的所有实例共享事物的特征在类中表示为变量每个对象的每个属性都拥有其特有的值,住址,姓名,属性,年龄,“在类中属性表示对象或实体拥有的特征”,9,方法,“对象执行的操作称为方法。”,10,方法的示例,缝制衣服的步骤,量尺寸,得到工具,缝衣服,方法,缝制衣服,裁缝,11,类和对象的区别,类是概念模型,定义对象的所 有特性和所需 的操作,对象是类的实例,类定义对象,对象是实际的实体,12,类与对象的关系示例,类与对象的关系示例,13,抽象,处理事物复杂性的方法,只关注事物的重要细节,而忽略事物的次要细节。,数据抽象:“根据具体的应用抽取出类的相关属性和操作。”,14,数据抽象的示例,属性,方法,
3、getName(),getStudentNO(),getSeatNumber(),15,封装,信息隐藏,隐藏对象的实现细节,不让用户看到将东西包装在一起,然后以新的完整形式呈现出来例如,两种或多种化学药品组成一个胶囊将方法和属性一起包装到一个单元中,单元以类的形式实现,“隐藏属性、方法或实现细节的过程称为封装。”,16,封装的示例 3-1,采购经理,罗杰斯先生,大众汽车公司,.,通用汽车公司,.,市场经理,雪莉女士,要求,17,封装的示例 3-2,有选择地提供数据,大众汽车公司,通用汽车公司,18,封装的示例 3-3,实体大众汽车公司,实体通用汽车公司,Auti Ltd,.,Buto Ltd,
4、.,19,封装的特征:(1)在类的定义中设置访问对象属性(数据成员)及方法(成员方法)的权限,限制本类对象及其他类的对象使用的范围。(2)提供一个接口来描述其他对象的使用方法。(3)其他对象不能直接修改本对象所拥有的属性和方法。,封装的示例 3-4,20,1.定义类的一般格式(1)系统定义的类,即Java类库,是系统定义好的类,类库是Java语言的重要组成部分。Java类库是一组由它的发明者SUN公司以及其他软件开发商编写好的Java程序模块,每个模块通常对应一种特定的基本功能和任务,且这些模块都是经过严格测试的,因而也总是正确有效的。当自己编写的Java程序需要完成其中某一功能的时候,就可以
5、直接利用这些现成的类库,而不需要一切从头编写,这样不仅可以提高编程效率,也可以保证软件的质量。,类的定义,21,(2)用户自己定义的类。在Java程序中,用户自己定义类的一般格式如下:,类的定义,语法class 类名 类体其中:class 是创建类所使用的关键字,类体包含属性(数据成员)和成员方法的声明。,22,类的简单定义,类的命名规则:不能为 Java 中的关键字不能包含空格或点号“.”可以下划线“_”、字母或“$”符号开头,class Book String bookName;String authorName;int nopages;boolean available;,23,类中的方
6、法 4-1,方法的名称,参数列表,方法的主体,方法返回的数据类型,24,类中的方法 4-2,语法:返回值类型 方法名(参数列表)方法体(语句体),25,类中的方法 4-3,class Book String bookName;String authorName;int nopages;boolean available;void isAvailable()if(available=true)(有这本书);.,26,创建对象通常包括声明对象、建立对象和初始化对象三步。1声明对象 声明对象就是确定对象的名称,并指明该对象所属的类。声明对象的格式如下:类名 对象名表;例如:Class_name ob
7、ject_one,object_two;,对象的声明,27,2建立对象 建立对象就是用new关键字为对象分配存储空间。只有通过建立对象这一步,才为对象分配内存,使该对象成为类的实例。建立对象的格式如下:对象名=new 构造方法();例如:object_one=new Class_name();object_two=new Class_name();,对象的建立,28,3.创建对象的格式如下:类名 对象名=new 构造方法名();例如:Class_name object_one=new Class_name();Class_name object_two=new Class_name();其中:
8、new的作用是建立对象,为对象分配存储空间。执行new Class_name()将产生一个Class_name()类的实例(对象)。,对象的创建,与类名相同,29,4.使用对象 一个对象可以有许多属性和多个方法。当一个对象被创建后,这个对象就拥有了自己的数据成员和成员方法,我们可以通过引用对象的成员来使用对象。对象的数据成员的引用方式如下:对象名.数据成员名 对象的成员方法的引用方式如下:对象名.成员方法名(参数表),对象的使用,30,示例,class Book String bookName;String authorName;int nopages;boolean available;st
9、atic void isAvailable()if(available=true)(“有这本书);Book objBook=new Book();objBook.isAvailable();.,31,类的严谨定义格式如下:类修饰符 class 类名 extends 父类名 implements 接口列表 数据成员 成员方法,类的严谨定义,32,访问修饰符 6-1,信息隐藏是 OOP 最重要的功能之一,也是使用访问修饰符的原因。信息隐藏的原因包括:对任何实现细节所作的更改不会影响使用该类的代码防止用户意外删除数据,访问修饰符,33,访问修饰符 6-2,34,6.1 类修饰符 类的修饰符用于说明对
10、它的访问限制,一个类可以没有修饰符,也可以有public、final、abstract等几种不同的修饰符。1无修饰符的情况 如果一个类前无修饰符,则这个类只能被同一个包里的类使用。Java规定,同一个程序文件中的所有类都在同一个包中。这也就是说,无修饰符的类可以被同一个程序文件中的类使用,但不能被其他程序文件中的其他包中的类使用。,类访问修饰符 6-3,35,【示例程序C3_1.java】class Aa/无修饰符的类Aa int a=45;/Aa类的数据成员a public class C3_1/公共类C3_1 public static void main(String args)Aa a
11、1=new Aa();/类C3_1中创建了一个无修饰符类Aa的对象a1 System.out.println(a1.a);,36,2public修饰符 如果一个类的修饰符是public,则这个类是公共类。公共类不但可供它所在包中的其他类使用,也可供其他包中的类使用。在程序中可以用import语句引用其他包中的public类。Java规定,在一个程序文件中,只能定义一个public类,其余的类可以是无修饰符的类,也可以是用final修饰符定义的最终类,否则编译时会报错。,类访问修饰符 6-4,37,【示例程序C3_2.java】class Fp C3_2 f1=new C3_2();int ad
12、d()return(f1.b+f1.c);,public class C3_2 int b=20,c=3;public static void main(String args)Fp p1=new Fp();System.out.println(p1.add();,运行结果:23,38,3final修饰符 用final修饰符修饰的类被称为最终类。最终类是不能被任何其他类所继承的。定义最终类的目的有三:(1)用来完成某种标准功能。将一个类定义为final类,则可以将它的内容、属性和功能固定下来,与它的类名形成稳定的映射关系,从而保证引用这个类时所实现的功能是正确无误的。,类访问修饰符 6-5,3
13、9,(2)提高程序的可读性。从父类派生子类,再从子类派生子类,使软件变得越来越复杂。而在必要的层次上设置final类,可以提高程序的可读性。(3)提高安全性。病毒的闯入途径之一是在一些处理关键信息的类中派生子类,再用子类去代替原来的类。由于用final修饰符定义的类不能再派生子类,截断了病毒闯入的途径,因而提高了程序的安全性。,40,4abstract修饰符 用abstract修饰符修饰的类称为抽象类。其作用在于将许多有关的类组织在一起,提供一个公共的基类,为派生具体类奠定基础。另外,当一个类中出现一个或多个用abstract修饰符定义的方法时,则必须在这个类的前面加上abstract修饰符,
14、将其定义为抽象类。,访问修饰符 6-6,41,5类修饰符使用注意事项 可以同时使用两个修饰符来修饰一个类,当使用两个修饰符修饰一个类时,这些修饰符之间用空格分开,写在关键字class之前,修饰符的顺序对类的性质没有任何影响。需要注意的是:一个类可以被修饰为public abstract,也可以被修饰为public final,但不能被修饰为abstract final,这是因为abstract类自身没有对象,需要派生子类后再创建子类的对象,而final类不能派生子类,所以不存在用abstract final两个修饰符修饰的类。,访问修饰符 6-7,42,1.无修饰符:具有包访问特性。2.pub
15、lic访问修饰符:用public修饰的数据成员称为公有数据成员,使用时危险,通常不使用。3.private访问修饰符:用private修饰的数据成员称为私有数据成员。私有数据成员只能在定义它的类中使用,不能在类外使用,是对类进行封装时使用的主要方法。4.protected访问修饰符:用protected修饰的数据成员可以被该类及其子类的成员访问,同一个包中的类也可访问。主要作用是允许其他包中的子类访问父类。,数据成员访问修饰符 6-7,43,class ClassA private int k;private void methodA()System.out.println(“私有方法”);c
16、lass ClassB void methodB()ClassA a=new ClassA();a.k=10;/a.methodA();/,数据成员访问修饰符示例,44,5.static修饰的静态数据成员 用static修饰符修饰的数据成员不属于任何一个类的具体对象,而是属于类的静态数据成员。其特点如下:(1)它被保存在类的内存区的公共存储单元中,而不是保存在某个对象的内存区中。因此,一个类的任何对象访问它时,存取到的都是相同的数值。(2)可以通过类名加点操作符访问它。(3)static数据成员仍属于类的作用域,还可以使用public static、private static等进行修饰。修饰
17、符不同,可访问的层次也不同。,数据成员修饰符 6-8,45,class Pc static double ad=8;,public class C3_5 public static void main(Stringargs)Pc m=new Pc();Pc m1=new Pc();m.ad=0.2;System.out.println(m1=+m1.ad);System.out.println(Pc=+Pc.ad);System.out.println(m=+m.ad);,【示例程序C3_5.java】对上述(1)和(2)的示例。,运行结果:m1=0.2 Pc=0.2 m=0.2,46,6.f
18、inal修饰符:用final修饰符修饰的数据成员称为最终数据成员。最终数据成员可以在声明时进行初始化,也可以通过构造方法赋值,但不能在程序的其他部分赋值,它的值在程序的整个执行过程中是不能改变的。用final修饰符说明常量时,需要注意:需要说明常量的数据类型并指出常量的具体值。,数据成员修饰符 6-9,47,class Ca static int n=20;final int n1;final int k=40;Ca()n1=+n;,public class C3_6 public static void main(String args)Ca m1=new Ca();Ca m2=new Ca
19、();/m1.n1=90;System.out.println(m1.n1=+m1.n1);(m1.k=+m1.k);(m2.n1=+m2.n1);(m2.k=+m2.k);,【示例程序C3_6.java】,运行结果:m1.n1=21 m1.k=40 m2.n1=22 m2.k=40,48,课堂练习,1.P76 例3.10,49,在成员方法头中:修饰符可以是公共访问控制符public、私有访问控制符private、保护访问控制符protected等访问权限修饰符,也可以是静态成员方法修饰符static、最终成员方法修饰符final、本地成员方法修饰符native、抽象成员方法修饰符abstra
20、ct等非访问权限修饰符。访问权限修饰符指出满足什么条件时该成员方法可以被访问。非访问权限修饰符指明数据成员的使用方式。,成员方法修饰符,50,方法修饰符,51,static 修饰符 3-1,static修饰符修饰的方法叫静态方法。静态方法是属于整个类的类方法,不用static修饰符限定的方法,是属于某个具体类对象的方法。static方法使用特点如下:(1)static方法是属于整个类的,它在内存中的代码段将随着类的定义而分配和装载。而非static的方法是属于某个对象的方法,当这个对象创建时,在对象的内存中拥有这个方法的专用代码段。(2)引用静态方法时,可以使用对象名做前缀,也可以使用类名做前
21、缀。,52,static 修饰符 3-2,(3)static方法只能访问static数据成员,不能访问非static数据成员,但非static方法可以访问static数据成员。(4)static方法只能访问static方法,不能访问非static方法,但非static方法可以访问static方法。(5)main方法是静态方法。在Java的每个Application程序中,都必须有且只能有一个main方法,它是Application程序运行的入口点。,53,例:class F int d1;static int d2;void me()static void me1()static void m
22、e2()me1();/合法引用 d1=34;/错,引用了非static数据成员 me();/错,引用了非static方法 d2=45;,54,final 修饰符2-1,55,final修饰的最终方法:用final修饰符修饰的方法称为最终方法,如果类的某个方法被final修饰符所限定,则该类的子类就不能覆盖父类的方法,即不能再重新定义与此方法同名的自己的方法,而仅能使用从父类继承来的方法。可见,使用final修饰方法,就是为了给方法“上锁”,防止任何继承类修改此方法,保证了程序的安全性和正确性。,final 修饰符2-2,56,native修饰的本地方法:修饰符native修饰的方法称为本地方法
23、,此方法使用的目的是为了将其他语言(例如C、C、FORTRAN、汇编等)嵌入到Java语言中。这样Java可以充分利用已经存在的其他语言的程序功能模块,避免重复编程。,native 修饰符,57,abstract 修饰符 2-1,由abstract修饰的方法叫抽象方法;由abstract修饰的类叫抽象类抽象方法必须声明在抽象类中抽象方法语法:abstract 返回值类型 方法名(形式参数列表);声明抽象类语法:abstract class 抽象方法不具有任何实现代码,58,abstract 修饰符 2-2,59,课堂练习,2.P83 例3.14,60,构造方法,每当创建类的对象时就调用的方法与
24、类同名,但没有返回类型Java 为对象分配内存,初始化实例变量并调用构造方法两种构造方法参数化构造方法隐式构造方法,61,参数化构造方法的示例,class Sdate int month;int day;int year;Sdate(int m,int d,int y)month=m;day=d;year=y;System.out.println(日期是+m+/+d+/+y+.);public static void main(String args)Sdate S1,S2;S1=new Sdate(5,27,2009);S2=new Sdate(8,8,2008);,62,隐式构造方法的示例
25、,class Sdate int month=5;int day=27;int year=2009;public static void main(String args)Sdate S1;S1=new Sdate();,63,1.定义年、月、日三个变量;2.定义一个构造方法,给三个变量赋初值;3.定义main方法,输出今天的日期。,构造方法练习,64,在一个方法的定义过程中又调用自身的方法称为递归方法。例如:计算N!的定义如下 1(当N=0 时)N!=N*(N-1)!(当N0时),递归方法,65,图3.5 求4!的递归过程,递归方法示例,66,成员方法的递归引用就是指在一个方法中直接或间接引
26、用自身的情况。例如:,int f1(int n)int p;p=f1(n-1)return p;,递归方法示例,67,int f1(int n)int f2(int m)int p;int s;p=f2(n-1);s=f1(m+2);return p;return s;,递归方法示例,间接调用,68,public class C3_7 static int fac(int n)int fa;if(n=0)fa=1;else fa=n*fac(n-1);/递归引用自身 return fa;,public static void main(Stringargs)int m=4;int f1=fac
27、(m);/引用fac()方法 System.out.println(4!=+f1);,【示例程序C3_7.java】编程计算4!的值。,69,图3.6 计算4!的成员方法fac递归引用关系,70,包,包允许将类组合成较小的单元(类似文件夹),使其易于找到和使用相应的类文件有助于避免命名冲突。在使用许多类时,类和方法的名称很难决定。有时需要使用与其他类相同的名称。包基本上隐藏了类并避免了名称上的冲突包允许在更广的范围内保护类、数据和方法,可以在包内定义类,而在包外的代码不能访问该类,“包将类名空间划分为更加容易管理的块,包既是命名机制也是可见度控制机制”,71,创建包,package mypac
28、kage;public class Calculate public double volume(double height,double width,double depth),72,导入包,import mypackage.Calculate;public class PackageDemo public static void main(String args)Calculate calc=new Calculate();,73,总结,对象由状态和行为组成 类是具有相同属性和行为的一组对象的集合 封装是隐藏对象实现细节的过程,以便不让用户看到类的变量和方法可被该类的实例访问圆点符号用于访问对象的成员构造函数在创建对象时初始化对象,