Java程序设计第2版第七章课件_第1页
Java程序设计第2版第七章课件_第2页
Java程序设计第2版第七章课件_第3页
Java程序设计第2版第七章课件_第4页
Java程序设计第2版第七章课件_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

第7章

Java类的特性

6/4/20231通过本章的学习,主要掌握以下知识点:类的私有成员与公共成员

方法的重载

构造方法

实例成员与静态成员

6/4/20232本章的重点:

方法的重载

构造方法

本章的难点:静态成员6/4/202337.1类的私有成员与公共成员在第6章的例子中,可以看到类的成员变量pi、radius和height可以在类Cylinder的外部任意修改。这虽然方便了程序员灵活的使用,但也存在弊端。

6/4/20234

如果没有一个机制来限制对类中成员的访问,则很可能会造成错误的输入。为了防止这种情况的发生,Java提供了私有成员访问控制修饰符private。

下面来举例说明。7.1.1私有成员6/4/20235

【例7.1】在圆柱体类Cylinder中,创建类的私有成员,使之在该类的外部无法访问该成员。

//app7_1.java定义私有成员,使之无法在类外被访问classCylinder//定义Cylinder类{

privatedoubleradius;//将数据成员radius声明为私有的

private

intheight;//将数据成员height声明为私有的

privatedoublepi=3.14;//将数据成员pi声明为私有的,并赋初值

doublearea(){returnpi*radius*radius;//在Cylinder类内部,故可访问私有成员

}doublevolume(){returnarea()*height;//在类内可以访问私有成员height}}6/4/20236【例7.1】续publicclassapp7_1//定义公共主类{publicstaticvoidmain(String

args[]){Cylindervolu;

volu=newCylinder();

volu.radius=2.8;//错误!在类的外部,不能直接访问私有成员。

volu.height=-5;

//错误!在类的外部,不能直接访问私有成员。

System.out.println("底圆半径="+volu.radius);

System.out.println("圆柱的高="+volu.height);

System.out.print("圆柱");

System.out.println(“底面积=”+volu.area());//正确!

System.out.println("圆柱体体积="+volu.volume());//正确!}}6/4/202377.1.2公共成员如果在类的成员声明的前面加上修饰符public,则表示该成员可以被所有其他的类所访问。由于public修饰符会造成安全性和数据封装性的下降,所以一般应减少公共成员的使用。下面举例说明如何利用公共方法来访问私有成员变量。

6/4/20238

【例7.2】创建圆柱体类Cylinder的公共成员方法,来访问类内的私有成员变量

。//app7_2.java定义公共方法来访问私有成员classCylinder{privatedoubleradius;//声明私有数据成员

privateintheight;privatedoublepi=3.14;publicvoidSetCylinder(doubler,inth)//声明具有2个参数的公共方法

{//用于对私有数据进行访问

if(r>0&&h>0){radius=r;height=h;}else

System.out.println(“您的数据有错误!!”);}6/4/20239【例7.2】续

doublearea(){returnpi*radius*radius;//在类内可以访问私有成员radius和pi}doublevolume(){returnarea()*height;//在类内可以访问私有成员height}}publicclassapp7_2//定义公共主类{publicstaticvoidmain(String

args[]){Cylindervolu=newCylinder();volu.SetCylinder(2.5,-5);//通过公共方法SetCylinder()访问私有数据

System.out.println("圆柱底面积="+volu.area());

System.out.println("圆柱体体积="+volu.volume());}}6/4/202310程序运行结果如下:您的数据有错误!!圆柱底面积=0.0圆柱体体积=0.0【例7.2】续6/4/2023117.1.3友元若在类成员的前面加上访问控制符friendly,说明该成员是友元。友元访问控制符可以省略。也就是说在类内声明类成员时,不加任何访问控制修饰符,则该成员是一个友元。一个成员被声明为友元,表示这个成员只能被同一个包中的类所访问,但其他包中的类不能访问该成员。同理,对于类来说,如果一个类没有访问控制符,说明它具有缺省访问控制特性。这种缺省的访问控制权规定只能被同一个包中的类访问和引用,而不可以被其他包中的类所使用。

6/4/2023127.2方法的重载方法的重载是实现“多态”的一种方法。在面向对象的程序设计语言中,有一些方法的含义相同,但带有不同的参数,这些方法使用相同的名字,这就叫方法的重载(Overloading)。也就是说,重载是指相同的方法名称,如果参数个数不同,或者是参数个数相同,但类型不同,则方法就具有不同的功能。6/4/202313注意:方法的重载中参数的类型是关键,仅仅是参数的变量名不同是不行的。也就是说参数的列表必须不同,即:或者参数个数不同,或者参数类型不同,或者参数的顺序不同。方法的重载的应用见教材【例7.3】6/4/2023147.3构造方法前面所介绍的由Cylinder类所创建的对象,其成员变量都是在对象建立之后,再由相应的方法来赋值。如果一个对象在被创建时就完成了所有的初始化工作,将会很简洁。因此Java在类里提供了一个特殊的成员方法――构造方法。

6/4/202315构造方法(constructor)是一种特殊的方法,它是在对象被创建时初始化对象的成员的方法。构造方法的名称必须与它所在的类名完全相同。7.3.1构造方法的作用与定义6/4/202316//app7_4.java构造方法的使用classCylinder//定义类Cylinder{privatedoubleradius;privateintheight;privatedoublepi=3.14;publicCylinder(doubler,inth)//定义构造方法

{radius=r;height=h;}doublearea(){returnpi*radius*radius;}【例7.4】利用构造方法来初始化圆柱体类Cylinder的成员变量

。6/4/202317doublevolume(){returnarea()*height;}}publicclassapp7_4//定义主类{publicstaticvoidmain(String

args[]){Cylindervolu=newCylinder(3.5,8);//创建对象并调用构造方法

System.out.println("圆柱底积="+volu.area());

System.out.println("圆柱体体积="+volu.volume());}}【例7.4】续6/4/202318程序运行结果如下:圆柱底积=38.465圆柱体体积=307.72【例7.4】续6/4/202319构造方法的特殊性主要体现在如下几个方面:1.构造方法的方法名与类名相同;2.构造方法没有返回值,也不能写void;3.构造方法的主要作用是完成对类对象的初始化工作;4.构造方法一般不能由编程人员显式地直接调用,而是用new来调用;5.在创建一个类的对象的同时,系统会自动调用该类的构造方法为新对象初始化。6/4/202320细心的读者可能会发现,在例7.4以前的例子中均没有定义构造方法,依然可以创建新的对象,并能正确的执行程序,这是因为如果省略构造方法,Java会自动调用默认的构造方法(defaultconstructor)。默认的构造方法没有参数,在其方法体中也没有任何代码,即什么也不做。如果上面例子中的Cylinder类没有定义构造方法,则系统会产生默认的构造方法如下:Cylinder(){}7.3.2默认的构造方法6/4/202321

一般情况下,类都有一个至多个构造方法。但由于构造方法与类同名,所以当一个类有多个构造方法时,则这多个构造方法可以重载。

7.3.3构造方法的重载

构造方法重载的应用见教材【例7.5】

6/4/202322

从某一构造方法内调用另一构造方法,是通过关键字this来调用的。见教材例【例7.6】

。7.3.4从一个构造方法调用另一个构造方法6/4/202323

构造方法一般都是公有(public)的,而不可以声明为私有的,这是因为它们在创建对象时,是在类的外部被系统自动调用的。如果构造方法被声明为private,则无法在该构造方法所在的类以外的地方被调用,但在该类的内部还是可以被调用的。

见教材例公共构造方法与私有构造方法6/4/202324

static称为静态修饰符,它可以修饰类中的成员。被static修饰的成员被称为静态成员,也称为类成员,否则不用static修饰的成员称为实例成员。7.4静态成员6/4/202325

在类定义中如果成员变量或成员方法没有用static来修饰,则该成员就是实例成员。对实例成员,我们并不陌生,因为在此之前编写的程序中,用到的都是实例成员。7.4.1实例成员6/4/202326用static修饰的成员变量称为“静态变量”,静态变量也称为类变量。静态变量是隶属于类的变量,而不是属于任何一个类的具体对象。

换句话说就是,静态变量不需要实例化就可以使用。当然也可以通过实例对象来访问静态变量。使用格式是:类名.静态变量名对象名.静态变量名7.4.2静态变量6/4/202327//app7_8.java静态变量的使用classCylinder//定义类Cylinder{privatestaticintnum=0;//声明num为静态变量

privatestaticdoublepi=3.14;//声明pi为静态变量,并赋初值

privatedoubleradius;privateintheight;publicCylinder(doubler,inth)//定义有2个参数的构造方法

{radius=r;height=h;num++;//当构造方法Cylinder()被调用时,num便加1}publicvoidcount()//count()方法用来显示目前创建对象的个数

{

System.out.print(“创建了"+num+”个对象:”);}【例7.8】将Cylinder类里的变量pi和num声明为静态变量。6/4/202328

doublearea(){returnpi*radius*radius;}doublevolume(){returnarea()*height;}}publicclassapp7_8//主类{publicstaticvoidmain(String

args[]){Cylindervolu1=newCylinder(2.5,5);volu1.count();

System.out.println("圆柱1的体积="+volu1.volume());Cylindervolu2=newCylinder(1.0,2);volu2.count();

System.out.println("圆柱2的体积="+volu2.volume());}}【例7.8】续6/4/202329程序运行结果为:创建了1个对象:圆柱1的体积=98.125创建了2个对象:圆柱2的体积=6.28【例7.8】续6/4/202330与静态变量相似,用static修饰符修饰的方法是属于类的静态方法,又称为类方法。静态方法实质是属于整个类的方法,而不加static修饰符的方法,是属于某个具体对象的方法。7.4.3静态方法静态方法的应用见教材【例7.9】

。6/4/202331静态初始化器是由关键字static修饰的一对花括号“{}”括起来的语句组。它的作用与类的构造方法有些相似,都是用来初始化工作的,但静态初始化器与构造方法有几点根本的不同。7.4.4静态初始化器6/4/2023321.构造方法是对每个新创建的对象初始化,而静态初始化器是对类自身进行初始化。2.构造方法是在用new运算符创建新对象时由系统自动执行,而静态初始化器一般不能由程序来调用,它是在所属的类被加载入内存时由系统调用执行。3.用new运算符创建多少个新对象,构造方法被调用多少次,但静态初始化器则在类被加载入内存时只执行一次,与创建多少个对象无关。4.不同于构造方法,静态初始化器不是方法,因而没有方法名、返回值和参数。6/4/202333声明一个对象的格式与声明一般变量相似,即“类名对象名”。因而也可以将对象称之为“类类型的变量”,它属于非基本类型的变量。实际上对象是一种引用型的变量,而引用型变量实际上保存的是对象在内存中的地址(也称为对象的句柄),所以就对象的功能而言,对象是“指向对象的变量”,但就其类型而言它是属于“类类型的变量”。

7.5对象的应用6/4/202334在使用对象时,一般是先用new运算符创建对象,然后再对其进行操作处理。但有时没有使用new运算符创建新对象,仍然可以对其进行赋值。7.5.1对象的赋值与比较6/4/202335引用变量不但可以作为参数进行传递,而且也可以作为方法的返回值。若要方法返回类类型的变量,只须在方法声明的前面加上要返回的类即可。7.5.2引用变量作为方法的返回值6/4/202336在第5章中介绍过数组,数组元素可以是存放各种类型的数据,当然数组也可以用来存放对象。用数组来存放对象,一般要经过如下的两个步骤:1.声明类类型的数组变量,并用new运算符分配内存空间给数组;2.用new创建新的对象,分配内存空间给它,并让数组元素指向它。下面举例说明。7.5.3类类型的数组6/4/202337//app7_13.java对象数组的应用classPerson//定义类Person{privateStringname;privateintage;publicPerson(Stringname,intage){

=name;

this.age=age;}publicvoidshow(){

System.out.println(“姓名:“+name+”年龄:”+age);}}【例7.13】对象数组的应用。以个人类Person为类型,创建数组

。6/4/202338publicclassapp7_13//主类{publicstaticvoidmain(String

args[]){PersonPer[];//声明类类型的数组

Per=newPerson[3];//用new为数组分配内存空间

Per[0]=newPerson(“张三”,20);//用new运算符创建新对象,并分

Per[1]=newPerson(“李四”,21);//配给数组元素

Per[2]=newPerson(“王二”,19);Per[2].show();//利用对象Per[2]调用show()方法

Per[0].show();//利用对象Per[0]调用show()方法

}}【例7.13】续6/4/202339程序执行结果如下:姓名:王二年龄:19姓名:张三年龄:20【例7.13】

温馨提示

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

评论

0/150

提交评论