面向对象java语言程序设计课程第四章xin_第1页
面向对象java语言程序设计课程第四章xin_第2页
面向对象java语言程序设计课程第四章xin_第3页
面向对象java语言程序设计课程第四章xin_第4页
面向对象java语言程序设计课程第四章xin_第5页
已阅读5页,还剩197页未读 继续免费阅读

下载本文档

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

文档简介

1、面向对象JAVA语言程序设计,信息科学与技术学院 网络工程系 周文峰,2,第 4 章 面向对象编程,面向对象基本概念 Java的类与对象 成员变量与封装 成员方法 继承 多态 特殊类 接口,3,第 4 章 面向对象编程,主要任务: 理解面向对象编程的基本概念 了解类的封装方法 如何创建类和对象 了解成员变量和成员方法的特性 学习使用OOP方式进行程序设计,4,学习导读,Java程序是由一个个类定义组成的,编写Java程序的过程就是从现实世界中抽象出Java可实现的类并用合适的语句定义它们的过程,这个定义过程包括对类内各种属性和方法的定义,创建类的对象,也包括类间的各种关系和接口的定义。 方法是

2、类的主要组成部分。在一个类中,程序的作用体现在方法中。方法是Java语言的基本构件。利用方法可以组成结构良好的程序。本章介绍方法的构成规则和设计、使用方法的基本要点。,5,4.1 面向对象基本概念,Java是完全面向对象编程语言。面向对象编程(OOP)是一种全新的编程理念,如果从来没有过OOP编程经验,需要从基本概念开始。 什么是对象?类又是什么?它们之间有什么关系?对象是如何通过消息和外部通讯的?,6,4.1.1 对象,在开发软件的信息世界中,对象定义为相关数据和方法的集合。 对象是现实世界真实对象的抽象模型。从现实世界真实对象中抽象出来的对象使用数据和方法描述其现实世界中的状态和行为特征,

3、一般通过变量描述其状态,通过方法实现其行为。 变量是一种有名称的数据实体,而方法则是和对象相关的函数或过程。,抽象就是抽出事物的本质特性而暂时不考虑它们的细节。,7,4.1.2 封装,封装的含义是把类设计成一个黑箱,使用者只能看见类中定义的公共方法,而看不到方法实现的细节,也不能直接对类的数据进行操作,迫使用户通过接口去访问数据,这种封装正是OOP设计者追求的理想境界。 相关数据和方法封装到一个包里,为程序员带来了两个好处:模块化和数据隐藏。,8,4.1.3 消息,对象的行为由方法来实现,消息传递是对象之间进行交互的主要方式。 构成消息的三个要素是: 接收消息的对象 接收消息后进行处理的方法

4、方法所需要的参数,9,4.1.4 类,类就是对象的软件图纸、模板或原型,它定义了同类对象共有的变量和方法。 类和对象二者不太容易区分。一方面,由于软件对象都是现实对象或抽象概念的电子模型,另一方面,经常不加区分地将对象和类统称为“对象”。 Java编程就是设计类,可以采用自定义方法或继承方法设计一个类,然后使用它的实例对象完成具体的功能。,10,说明: (1) 所有东西都是对象。可将对象想象成一种新型变量;它保存着数据,但可要求它对自身进行操作。 (2) 程序中通过消息传递,各对象知道自己该做些什么。 (3) 每个对象都有自己的存储空间,可容纳其他对象。 (4) 每个对象都有一种类型。根据语法

5、,每个对象都是某个“类”的一个“实例”。其中,“类”(Class)是“类型”(Type)的同义词。 (5)同一类所有对象都能接收相同的消息。,11,4.2 类 和 对 象,Java语言与其他面向对象语言一样,引入了类和对象的概念,类是用来创建对象的模板,它包含被创建对象的属性和方法的定义。因此,要学习Java编程就必须学会怎样去编写类,即怎样用Java的语法去描述一类事物共有的属性和行为。 对象的属性通过变量来刻画,而对象的行为通过方法来体现。方法可以操作属性形成一定的算法来实现一个具体的功能。类把属性和方法封装成一个整体。,12,4.2.1 定义类,在Java语言中,类是基本的构成要素,是对

6、象的模板,Java程序中所有的对象都是由类创建的。一个Java类主要包括以下两部分: 类的声明 类的主体,13,类的声明,在类声明中,需要定义类的名称、对该类的访问权限、该类与其他类的关系等。类声明的格式如下: 修饰符用于指定类的访问权限,可选值为public、abstract和final。,修饰符 class extends 父类名 implements 接口列表 ,14,类的声明-类名,class 类名 类名用于指定类的名称,类名必须是合法的Java标识符。一般情况下,要求首字母大写。,15,类的声明-修饰符,public(公共的) 在没有任何修饰符的缺省情况下,类只能被同一个源程序文件或

7、同一个包中的其它类使用。 加上public修饰符后,类可以被任何包中的类使用,称为公共类。,类的容器,分割类名空间。,16,类的声明-修饰符,abstract(抽象的) 定义的类代表一个抽象的概念,就不能用它来实例化一个对象。 在OOP中,可能建立了一个不需要产生对象的类。例如,java.lang包中的Number类代表了数这个抽象概念,可以用它在程序中产生一个数的子类,如Interger或Float,但从Number中直接生成对象是没有意义的。 abstract说明的类称为抽象类,不能用它实例化一个对象,它只能被继承。,17,类的声明-修饰符,final(最终的) final说明的类称为最终

8、类。一个最终类不可能有子类,也就是说它不能被继承。为什么要把一个类说明为最终类呢?有两点理由:为了提高系统的安全性和出于对一个完美类的偏爱。 黑客常用的一个攻击技术是设计一个子类,然后用它替换原来的父类。子类和父类很相象,但做的事情却大不一样。为防止这样的事情发生,你可以把你的类声明为最终类,不让黑客有机可乘。,18,类的声明-继承,extends(继承)父类名 extends告诉编译器创建的类是从父类继承下来的子类,父类必须是Java系统类或已经定义的类。 从父类继承,可以提高代码的重用性,不必从头开始设计程序。大部分情况下应该利用继承的手段编程,只在没有合适的类可以继承时才自己设计类。,1

9、9,类的声明-实现,implements(实现)接口名 implements告诉编译器当前类中实现了哪个接口定义的功能和方法。接口必须有定义,一般为系统类。 接口是消息传递的通道,通过接口,消息才能传递到处理方法中进行处理。implements说明你的类可以实现的一个或多个接口,如果有多个接口,要用逗号分隔。,20,类 体,类声明部分大括号中的内容为类体。类体主要由以下两部分构成: (1)成员变量的定义; (2)成员方法的定义。 在程序设计过程中,编写一个能完全描述客观事物的类是不现实的。 比如,构建一个Apple类,该类可以拥有很多很多的属性(即成员变量),在定义该类时,选取程序需要的必要属

10、性和行为就可以了。,21,4.2.2 了解成员方法,Java中类的行为由类的成员方法来实现。类的成员方法由方法声明和方法体两部分组成。其一般格式如下:,修饰符 ( 参数列表) 方法体 ,类的方法,又称为成员函数,用来规定类属性上的操作,实现类的内部功能的机制,同时也是类与外界进行交互的重要窗口。,22,4.2.2 了解成员方法,修饰符用于指定方法的访问权限,可选值为public、protected和private。 方法返回值的类型用于指定该方法的返回值的类型,如果该方法没有返回值,必须使用关键字void进行标识。方法返回值的类型可以是任何Java数据类型。,23,了解成员方法,方法名用于指定

11、成员方法的名称,方法名必须是合法的Java标识符。 参数列表用于指定方法中所需的参数。当存在多个参数时,各参数之间应使用逗号分隔。方法的参数可以是任何Java数据类型。,24,了解成员方法,方法体是方法的实现部分,在方法体中可以完成指定的工作,可以只打印一句话,也可以省略方法体,使方法什么都不做。需要注意的是:当省略方法体时,其外面的大括号一定不能省略。 【例4-1】 实现两数相加。(Count.java),25,public class Count public int add(int src,int des) int sum=src+des; return sum; public stat

12、ic void main(String args) Count count=new Count(); int apple1=30; int apple2=20; int num=count.add(apple1,apple2); System.out.println(苹果总数是:+num+箱。); ,26,4.2.3 成员变量和局部变量,在类体中所声明的变量称为类的成员变量,而在方法体中声明的变量和方法的参数则称为局部变量。 如何声明成员变量和局部变量,以及变量的有效范围?,27,声明成员变量,Java用成员变量来表示类的状态和属性,声明成员变量的基本语法格式如下: 修饰符:可选参数,用于指定

13、变量的被访问权限,可选值为public、protected、private和package。 static:可选,用于指定该成员变量为静态变量,可以直接通过类名访问。如果省略该关键字,则表示该成员变量为实例变量。,修饰符 static final ;,28,声明成员变量,final:可选,用于指定该成员变量为取值不会改变的常量。 变量类型:必选:用于指定变量的数据类型,其值可以为Java中的任何一种数据类型。 变量名:必选,用于指定成员变量的名称,变量名必须是合法的Java标识符。,29,1访问控制权限,(1)public 公共变量 由public修饰的变量称为公共变量,可被任何包中的任何类访

14、问,只有在确认任何外部访问都不会带来不良后果的情况下才将成员声明为公共的。公共变量对任何类都是可见的,因此它没有秘密可言,不具有数据保护功能。 (2)private私有变量 由private修饰的变量称为私有变量,只能被声明它的类所使用,拒绝任何外部类的访问。私有变量是不公开的,它们得到了最好的保护,这是对类进行封装时使用的主要方法。,30,1访问控制权限,(3)protected 受保护变量 由protected修饰的变量称为受保护变量,可被声明它的类和派生的子类以及同一个包中的类访问。 (4)package包变量 由package修饰的变量称为包变量,在声明时常常省略package关键字,

15、即没有修饰符的成员被视为包成员。包成员可被声明它的类和同一个包中的其它类(包括派生子类)所访问,在其它包中的子类则不能访问父类的包成员。,31,内容回顾,Java语句及控制结构 面向对象基本概念(对象,封装,消息,类等) 类的定义(类的声明,类体等),修饰符 class extends 父类名 implements 接口列表 ,32,2static 静态变量,static声明的成员变量被视为类的成员变量,而不把它当作实例对象的成员变量。 静态变量是类固有的,可以直接引用,其它成员变量仅仅被声明,生成实例对象后才存在,才可以被引用。 基于这样的事实,也把静态变量称为类变量,非静态变量称为实例变量

16、。相应地,静态方法称为类方法,非静态方法称为实例方法。,33,例 静态变量的使用,class StaticDemo static int x; int y; static public int getX() return x; static public void setX(int newX) x = newX; public int getY() return y; public void setY(int newY) y = newY; ,34,public class ShowDemo public static void main(String args) System.out.pri

17、ntln(静态变量x=+StaticDemo.getX(); System.out.println(实例变量y=+StaticDemo.getY(); / 非法,编译时将出错 StaticDemo a= new StaticDemo(); StaticDemo b= new StaticDemo();,35,a.setX(1); a.setY(2); b.setX(3); b.setY(4); System.out.println(静态变量a.x=+a.getX(); System.out.println(实例变量a.y=+a.getY(); System.out.println(静态变量b.

18、x=+b.getX(); System.out.println(实例变量b.y=+b.getY(); ,36,对上面的源程序进行编译会出现如图所示结果,不能进行运行该程序。,37,将源程序中的出错语句删除或使用解释符/隐藏起来如: /System.out.println(“实例变量y=”+StaticDemo.getY(); / 非法,编译时将出错,再进行编译,即可执行该程序,结果如图所示。,38,从输出结果中可以得出以下几点结论 :,类的静态变量可以直接引用,例如在程序中直接使用了StaticDemo.getX(),而非静态变量则不行。类的静态变量相当于某些程序语言的全局变量。 静态方法只能

19、使用静态变量,不能使用实例变量。 类的静态变量只有一个版本,所有实例对象引用的都是同一个版本。 对象实例化后,每个实例变量都被制作了一个副本,它们之间互不影响。,39,3final 最终变量,一旦成员变量被声明为final,在程序运行中将不能被改变。这样的成员变量就是一个常量。例如: final double PI=3.14159; 该语句声明一个常量PI,如果在后面试图重新对它赋值,将产生编译错误。 另外,常量名一般用大写字母。,40,声明成员变量举例,例如,在类中声明3个成员变量。,public class Apple public String color;/声明公共变量color pu

20、blic static int count;/声明静态变量count public final boolean MATURE=true;/声明常量MATURE并赋值 public static void main(String args) System.out.println(Apple.count);/直接引用静态变量 Apple apple=new Apple();/创建类的对象 System.out.println(apple.color); System.out.println(apple.MATURE); ,41,声明局部变量,定义局部变量(成员方法中的变量)的基本语法格式同定义成员

21、变量类似,所不同的是不能使用权限修饰符和static关键字对局部变量进行修饰,但可以使用final关键字:,final ;,42,声明局部变量,final:可选,用于指定该局部变量为常量。 变量类型:必选,用于指定变量的数据类型,其值可以为Java中的任何一种数据类型。 变量名:必选,用于指定局部变量的名称,变量名必须是合法的Java标识符。,43,声明局部变量举例,例如,在grow()成员方法中声明两个局部变量。,public void grow() final boolean STATE;/声明常量STATE int age;/声明局部变量age ,44,变量的有效范围,变量的有效范围是指

22、该变量在程序代码中的作用区域,在该区域外不能直接访问变量。 有效范围决定了变量的生命周期,变量的生命周期是指从声明一个变量并分配内存空间、使用变量,然后释放该变量并清除所占用内存空间的一个过程。 进行变量声明的位置,决定了变量的有效范围,根据有效范围的不同,可将变量分为以下两种。,45,变量的有效范围,(1)成员变量:在类中声明,在整个类中有效。 (2)局部变量:在方法内或方法内的复合代码块( “”与“”之间的代码)中声明的变量。 在复合代码块内声明的变量,只在当前复合代码块中有效; 在复合代码块外、方法内声明的变量在整个方法内都有效。,46,变量的有效范围举例,例如下面的实例:,public

23、 class Olympics private int medal_All=800;/成员变量 public void China() int medal_CN=100;/方法的局部变量 if(medal_CN1000)/代码块 int gold=50;/代码块的局部变量 medal_CN+=50;/允许访问 medal_All-=150;/允许访问 ,47,4.2.4 构造方法的概念及用途,构造方法是一种特殊的成员方法,它的名字必须与它所在类的名字完全相同,并且没有返回值,也不需要使用关键字void进行标识。,public class Apple public Apple() / 构造方法

24、,48,4.2.4 构造方法的概念及用途,构造方法用于对类对象中的初始化工作,在创建一个类的新对象的同时,系统会自动调用该类的构造方法为新对象初始化。 【例4-2】定义Apple类,在该类的构造方法中初始化成员变量,然后在main()主方法中创建Apple类的实例对象并输出所有成员变量值。,49,public class Apple int num; float price; Apple apple; public Apple() num=10; price=8.34f; public static void main(String args) Apple apple=new Apple();

25、/创建类对象 System.out.println(苹果数量:+apple.num); System.out.println(苹果单价:+apple.price); System.out.println(成员变量apple=+apple.apple); ,50,4.2.4 构造方法的概念及用途,构造方法的名字和类的名字是相同的。当构造类的对象时,此构造方法被自动启动,实例字段赋初值,在Java中,定义和初始化是统一的两者缺一不可。 构造方法的特点有: 构造方法和类具有相同的名字。 一个类可以有多个构造函数。 构造方法可以有0个、1个或多个参数。 构造方法没有返回值。 构造方法总是和new运算符

26、一起被调用。,51,4.2.4 构造方法的概念及用途,说明: 如果在定义类时,没有定义构造方法,系统也会提供默认的构造方法。 默认的构造方法是无参数的,但是如果你已经在类里定义了一个或多个构造方法,那么JAVA就不会提供默认的构造方法了。 如果定义的构造方法是带参数的,在创建对象时,必须带参数,否则就是非法语句(除非你还定义了一个不带参数的构造方法)。,52,4.2.5 对象生命周期,在Java语言中,把任何事物都看做对象,例如一个人、一个动物,或者没有生命体的轮船、汽车、飞机,甚至概念性的抽象,例如公司业绩。 一个对象在Java语言中的生命周期包括3个阶段: 创建对象 使用对象 销毁对象,5

27、3,创建对象,对象是类的实例。Java定义任何变量都需要指定变量类型,因此,在创建对象之前,一定要先声明该对象。声明对象的一般格式如下: 类名:用于指定一个已经定义的类。 对象名:用于指定对象名称,对象名必须是合法的Java标识符。,类名 对象名;,54,声明对象举例,例如声明Apple类的一个对象redApple的代码如下:,Apple redApple;,55,创建对象,在声明对象时,只是在内存中为其建立一个引用,并置初值为null,表示不指向任何内存空间。 声明对象以后,需要为对象分配内存,这个过程也称为实例化对象。在Java中使用关键字new来实例化对象,具体语法格式如下:,对象名=n

28、ew 类名(构造方法名)(参数列表);,56,创建对象,对象名:必选,用于指定已经声明的对象名。 类名:必选,用于指定构造方法名,即类名,因为构造方法与类名相同。 参数列表:可选参数,用于指定构造方法的入口参数。如果构造方法无参数,则可以省略。,57,创建对象,在声明Apple类的一个对象redApple后,可以通过以下代码为对象redApple分配内存(即创建该对象): 在声明对象时,也可以直接实例化该对象: 这相当于同时执行了对象声明和创建对象:,Apple redApple=new Apple();,redApple=new Apple();,Apple redApple; redApp

29、le=new Apple();,创建对象以某个类为模板,这个类里定义了哪些属性和方法,新建的对象就必然在内存里拥有相应的属性和方法。 可见,相对于简单数据类型,类就是用户自己定义的复杂的抽象数据类型:而相对于简单变量,对象就是复杂的既包括数据又包括方法代码的复杂数据单位。,58,使用对象,创建对象后,就可以访问对象的成员变量,并改变成员变量的值了,而且还可以调用对象的成员方法。通过使用运算符“.”实现对成员变量的访问和成员方法的调用。 语法格式为: 【例4-3】 定义一个类,创建该类的对象,同时改变对象的成员变量的值并调用该对象的成员方法。,对象.成员变量 对象.成员方法(),59,publi

30、c class Round final float PI=3.14159f; /定义一个用于表示圆周率的常量PI public float r=0.0f; public float getArea() /定义计算圆面积的方法 float area=PI*r*r;/计算圆面积并赋值给变量area return area;/返回计算后的圆面积 public float getCircumference(float r) /定义计算圆周长的方法 float circumference=2*PI*r;/计算圆周长并赋值给变量 return circumference;/返回计算后的圆周长 ,60,pu

31、blic static void main(String args) Round round=new Round();/创建类对象 round.r=20;/改变成员变量的值 float r=20; float area=round.getArea();/调用成员方法 System.out.println(圆的面积为:+area); float circumference=round.getCircumference(r);/调用带参数的成员方法 System.out.println(圆的周长为:+circumference); ,61,销毁对象,在许多程序设计语言中,需要手动释放对象所占用的内

32、存,但是,在Java中则不需要手动完成这项工作。Java提供的垃圾回收机制:垃圾收集器可以自动判断对象是否还在使用,并能够自动销毁不再使用的对象,收回对象所占用的资源。 Java提供了一个名为finalize()的方法,用于在对象被垃圾回收机制销毁之前执行一些资源回收工作,由垃圾回收系统调用,可以重写该方法。finalize()方法没有任何参数和返回值,每个类有且只有一个finalize()方法。,62,Java程序的基本结构如下: 引入Java类库; 定义用户类1 定义类1的若干变量或对象: 定义类1的方法1; 定义类1的方法2; 定义类1的方法M1; 定义用户类2 定义类2的若干变量或对象

33、: 定义类2的方法1; 定义类2的方法2; 定义类2的方法M2 ,63,Java编程小结,源程序的文件名和程序中定义的主类名应保持一致,包括字母大小写的匹配。 Java严格区分大小写,例如applet和Applet代表了不同的含义。 语句以分号结束。 程序中可加注释,用双斜杠“/”引导,“/* */”可包含多行注释。 注意设计一般类与主类,一般类可以有多个,主类只能有一个,源程序名与主类名相同。 源程序保持良好的书写风格,不同级别的语句采用缩进的方法来表示它们的差异。,64,4.3 继 承,在面向对象程序设计中,继承是不可或缺的一部分。通过继承可以实现代码的重用,提高程序的可维护性。,65,4

34、.3.1 继承的概念,类之间的继承关系是现实世界中遗传关系的直接模拟,它表示类之间的内在联系以及对属性和操作的共享,即子类可以沿用父类(被继承类)的某些特征。当然,子类也可以具有自己独立的属性和操作。 继承性是面向对象程序设计语言的最主要的特点,是其他语言(如面向过程语言)所没有的。,66,4.3.1 继承的概念,继承定义 继承性是软件复用的一种形式。新的类由已存在的类生成,通过保留它们的属性和行为,并且根据新类的要求对性能加以修改,添加新的属性和行为。 当建立一个新类时,不必写出全部成员变量和成员方法。只要简单地声明这个类是从一个已定义的类继承下来的,就可以引用被继承类的全部成员。被继承的类

35、称为父类或超类(superclass),这个新类称为子类。,67,4.3.1 继承的概念,继承定义 如果子类只从一个父类继承,则称为单继承;如果子类从一个以上父类继承,则称为多继承。注意 Java不支持多重继承,但它支持“接口”概念。接口使Java获得了多重继承的许多优点,摒弃了相应的缺点。,68,4.3.2 子类的创建,在类的声明中,可以通过使用关键字extends来显式地指明其父类。 语法格式为: 修饰符:可选,用于指定类的访问权限,可选值为public、abstract和final。 子类名:必选,用于指定子类的名称,类名必须是合法的Java标识符。一般情况下,要求首字母大写。 exte

36、nds 父类名:必选,用于指定要定义的子类继承于哪个父类。,修饰符 class 子类名 extends 父类名,69,子类的创建,例如定义一个Cattle类,该类继承于父类Animal,即Cattle类是Animal类的子类:,abstract class Cattle extends Animal /此处省略了类体的代码 ,子类从父类继承有两个主要的方面: (1)属性的继承。例如,公司是一个父类,一个公司有名称、地址、经理、雇员等,这些都属于结构方面。 (2)方法的继承。一个父类定义了若干操作,如一个公司要有项目、利润、任命经理、录用职工等操作,子公司也将继承这些行为。,70,子类的创建,p

37、ublic class MyApplet extends java.applet.Applet public class MyApplication extends Frame public class MyApp1 extends Object public class MyApp2 第一条语句声明子类MyApplet的父类是Applet,并指明Applet的层次结构; 第二条语句声明子类MyApplication的父类是Frame; 第三条语句声明子类MyApp1的父类是Object,但编程中通常会省略extends Object子句; 第四条语句在字面上没有extends,但实际上等价于

38、public class MyApp2 extends Object。,71,类Object,它在java.lang中定义,是所有类的始祖。一个类可以有多个子类,也可以没有子类,但它必定有一个父类(Object除外)。 对继承的理解应该扩展到整个父类的分支,也就是说,子类继承的成员实际上是整个父系的所有成员。例如,toString这个方法是在Object中声明的,被层层继承了下来,用于输出当前对象的基本信息。,72,4.3.3 继承的使用原则,子类可以继承父类中所有可被子类访问的成员变量和成员方法,但必须遵循以下原则: (1)子类能够继承父类中被声明为public和protected的成员变量

39、和成员方法,但不能继承被声明为private的成员变量和成员方法; (2)子类能够继承在同一个包中的由默认修饰符修饰的成员变量和成员方法;,73,4.3.3 继承的使用原则,(3)如果子类声明了一个与父类的成员变量同名的成员变量,则子类不能继承父类的成员变量,此时称子类的成员变量隐藏了父类的成员变量; (4)如果子类声明了一个与父类的成员方法同名的成员方法,则子类不能继承父类的成员方法,此时称子类的成员方法覆盖了父类的成员方法。,74,继承的使用原则,【例4-4】 定义一个动物类Animal及它的子类Bird。 public class Animal public boolean live=t

40、rue; /定义一个成员变量 public String skin=; public void eat() /定义一个成员方法 System.out.println(动物需要吃食物); public void move() /定义一个成员方法 System.out.println(动物会运动); ,75,继承的使用原则,【例4-4】 定义一个动物类Animal及它的子类Bird。 public class Bird extends Animal public String skin=羽毛; public void move() System.out.println(鸟会飞翔); ,76,实验题

41、目:数组程序设计 一、实验目的与要求: 1.掌握java的数组的定义、初始化 2.掌握java数组的基本操作 3.掌握java数组的应用 4.掌握java数组的常用方法 二、实验内容 1. 2. 三、源程序 四、实验总结,77,Java编程小结,源程序的文件名和程序中定义的主类名应保持一致,包括字母大小写的匹配。 Java严格区分大小写,例如applet和Applet代表了不同的含义。 语句以分号结束。 程序中可加注释,用双斜杠“/”引导,“/* */”可包含多行注释。 注意设计一般类与主类,一般类可以有多个,主类只能有一个,源程序名与主类名相同。 源程序保持良好的书写风格,不同级别的语句采用

42、缩进的方法来表示它们的差异。,78,内容回顾,类的定义(最终变量,局部变量,变量的作用范围,构造方法) 对象的创建,使用和销毁 继承性(作用,定义,子类的创建等),79,成员变量的隐藏,所谓隐藏是指子类重新定义了父类中的同名变量。 子类执行自己的方法时,操作的是子类的变量,子类执行父类的方法时,操作的是父类的变量。 在子类中要特别注意成员变量的命名,防止无意中隐藏了父类的关键成员变量,这有可能给你的程序带来麻烦。,80,成员方法的覆盖,已知通过继承子类可以继承父类中所有可以被子类访问的成员方法,但如果子类的方法与父类方法同名,则不能继承,此时称子类的方法覆盖了父类的那个方法,简称为方法覆盖。

43、方法的覆盖(override),为子类提供了修改父类成员方法的能力。例如,子类可以修改层层继承下来的toString方法,让它输出一些更有用的信息。下面的例子显示了在子类Circle中添加toString方法,用来返回圆半径和圆面积信息。,81,class Circle extends Point private int radius; Circle(int r) setRadius(r);/构造方法 public void setRadius(int r) radius=r; public int getRadius() return radius; public double area()

44、 return 3.14159*radius*radius; public String toString() return 圆半径:+getRadius()+ 圆面积:+area(); ,82,public class O1 public static void main(String args) Circle c=new Circle(10); System.out.println(n+c.toString(); 程序中添加了toString方法并修改了它的返回值。由于toString和继承下来的方法名相同、返回值类型相同,因此就覆盖了父类中的toString方法。而父类Point中的to

45、String方法尽管没有显示出来,它仍然存在,它是从Object中继承下来的。,83,方法覆盖时要特别注意,用来覆盖的子类方法应和被覆盖的父类方法保持同名、同返回值类型,以及相同的参数个数和参数类型。 有时,可能不需要完全覆盖一个方法,可以部分覆盖一个方法。部分覆盖是在原方法的基础上添加新的功能,即在子类的覆盖方法中添加一条语句:super.原父类方法名,然后加入其它语句。,84,4.3.4 使用this关键字,当局部变量和成员变量的名字相同时,成员变量就会被隐藏,这时如果想在成员方法中使用成员变量,则必须使用关键字this。 语法格式为: 【例4-5】,this.成员变量名,85,publi

46、c class Fruit public String color=绿色; /定义颜色成员变量public void harvest() /定义收获的方法 String color=红色; /定义颜色局部变量 System.out.println(水果是:+color+的!); /此处输出的是局部变量color System.out.println(水果已经收获); System.out.println(水果原来是:+this.color+的!);/此处输出的是成员变量color public static void main(String args) Fruit obj=new Fruit(

47、);/创建类对象 obj.harvest(); ,86,4.3.5 使用super关键字,子类可以继承父类的非私有成员变量和成员方法(不是以private关键字修饰的)。 但是,如果子类中声明的成员变量与父类的成员变量同名,那么父类的成员变量将被隐藏。如果子类中声明的成员方法与父类的成员方法同名,并且参数个数、类型和顺序也相同,那么称子类的成员方法覆盖了父类的成员方法。 这时,如果想在子类中访问父类中被子类隐藏的成员方法或变量时,就可以使用super关键字。,87,使用super关键字,super关键字主要有以下两种用途。 (1)调用父类的构造方法 (2)操作被隐藏的成员变量和被覆盖的成员方法

48、,88,调用父类的构造方法,子类可以调用父类的构造方法。但是必须在子类的构造方法中使用super关键字来调用。其语法格式如下: 如果父类的构造方法中包括参数,则参数列表为必选项,用于指定父类构造方法的入口参数。 例如下面的代码在Animal类中添加一个带参数的构造方法:,super(参数列表);,public Animal() public Animal(String strSkin) skin=strSkin; ,89,调用父类的构造方法,这时,如果想在子类Bird中使用父类的带参数的构造方法,则需要在子类Bird的构造方法中通过以下代码进行调用:,public Bird() super(羽

49、毛); ,90,关于子类构造方法,在子类中使用构造方法 关于子类构造方法的规律总结如下: (1)子类构造方法总是先调用(显式的或隐式地) 其父类的构造方法,以创建和初始化子类的父类 成员。 (2)构造方法不能继承,它们只属于定义它们的类。 (3)当创建一个子类对象时,子类构造方法首先调用 父类的构造方法并执行,接着才执行子类构造方法。,91,操作被隐藏的成员变量和被覆盖的成员方法,如果想在子类中操作父类中被隐藏的成员变量和被覆盖的成员方法,也可以使用super关键字。 如果想在子类Bird的方法中改变父类Animal的成员变量skin的值可以使用以下代码: 如果想在子类Bird的方法中使用父类

50、Animal的成员方法move()可以使用以下代码:,super.成员变量名 super.成员方法名(参数列表),super.skin=羽毛;,super.move();,92,class Person public int c; private String name; private int age; protected void setName(String name) =name; protected void setAge(int age) this.age=age; protected void print() System.out.println(Name=+n

51、ame+ Age=+age); ,93,public class DemoSuper extends Person public void print() System.out.println(DemoSuper:); super.print(); public static void main(String args) DemoSuper ds=new DemoSuper(); ds.setName(kevin); ds.setAge(22); ds.print(); ,94,4.4 多 态,多态是面向对象程序设计的重要部分,是面向对象的3个基本特性(封装,继承,多态)之一。 在一个类中,可

52、以定义多个同名的方法,只要确定它们的参数个数和类型不同。这种现象称为类的多态。,95,4.4 多 态,多态使程序简洁,为程序员带来很大便利。在OOP中,当程序要实现多个相近的功能时,就给相应的方法起一个共同的名字,用不同的参数代表不同的功能。这样,在使用方法时不论传递什么参数,只要能被程序识别就可以得到确定的结果。 在Java语言中,通常使用方法的重载(Overloading)和覆盖(Overriding)实现类的多态性。,96,4.4.1 方法的重载,方法的重载是指在一个类中,出现多个方法名相同,但参数个数或参数类型不同的方法,则称为方法的重载。Java在执行具有重载关系的方法时,将根据调用

53、参数的个数和类型区分具体执行的是哪个方法。 【例4-6】,97,public class Calculate final float PI=3.14159f; /定义一个用于表示圆周率的常量PI /求圆形的面积 public float getArea(float r) /定义一个用于计算面积的方法getArea() float area=PI*r*r; return area; /求矩形的面积 public float getArea(float l,float w) /重载getArea()方法 float area=l*w; return area; /画任意形状的图形 public v

54、oid draw(int num)/定义一个用于画图的方法draw() System.out.println(画+num+个任意形状的图形); ,98,/画指定形状的图形 public void draw(String shape) /重载draw()方法 System.out.println(画一个+shape); public static void main(String args) Calculate calculate=new Calculate(); /创建Calculate类的对象并为其分配内存 float l=20; float w=30; float areaRectangl

55、e=calculate.getArea(l, w); System.out.println(求长为+l+ 宽为+w+的矩形的面积是:+areaRectangle); float r=7; float areaCirc=calculate.getArea(r); System.out.println(求半径为+r+的圆的面积是:+areaCirc); int num=7; calculate.draw(num); calculate.draw(三角形); ,99,4.4.1 方法的重载,Java在执行具有重载关系的方法时,将根据调用参数的个数和类型区分具体执行的是哪个方法。 重载的方法之间并不一

56、定必须有联系,但是为了提高程序的可读性,一般只重载功能相似的方法。 注意:在方法重载时,方法返回值的类型不能作为区分方法重载的标志。,100,4.4.2 方法的覆盖,【例4-7】 public class Animal public Animal() public void cry() System.out.println(动物发出叫声!); public class Cat extends Animal public Cat() public void cry() System.out.println(猫发出“喵喵”声!); ,101,4.4.2 方法的覆盖,【例4-7】 public cl

57、ass Dog extends Animal public Dog() public void cry() System.out.println(狗发出“汪汪”声!); public class Cattle extends Animal ,102,public class Zoo public static void main(String args) Dog dog=new Dog(); /创建Dog类的对象并为其分配内存 System.out.println(“执行dog.cry();语句时的输出结 果:); dog.cry(); Cat cat=new Cat(); /创建Cat类的对

58、象并为其分配内存 System.out.println(“执行cat.cry();语句时的输出结 果:); cat.cry(); Cattle cattle=new Cattle(); /创建Cattle类的对象 并为其分配内存 System.out.println(“执行cattle.cry();语句时的输出 结果:); cattle.cry(); ,103,4.4.3 构造方法的重载,重载构造方法的目的: 提供多种初始化对象的能力,使程序员可以根据实际需要选用合适的构造方法来初始化对象。,104,class RunDemo private String userName, password

59、; RunDemo() System.out.println(All is null!); RunDemo(String name) userName=name; RunDemo(String name, String pwd) this(name); password=pwd; check(); ,105,void check() String s=null; if (userName!=null) s=用户名:+userName; else s=用户名不能为空!; if (password!=ThisWord) s=s+ 口令无效!; else s=s+ 口令:*; System.out.println(s); ,106,public class D1 public static void main(String args) new RunD

温馨提示

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

评论

0/150

提交评论