




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2讲 面向对象编程,2.1.1 类和对象 对一个用户自定义的类,要为类取一个名字,并指明类中包含哪些变量和方法以及相应的类型、实现等,这称为类的定义。类定义语句的一般形式为: 修饰符class 类名 extends 父类名 implements 接口名表 成员变量声明 / 类体 方法成员声明 【例1】定义一个名为Rect表示长方形的类,它仅包含double类型的长length和宽width两个数据成员。,【例2】定义一个名为Rectangle表示长方形的类,它包含double类型的长length和宽width两个数据成员和设置长方形长宽值的方法setDim()、计算长方形面积的方法area()。 对象举例:设已经定义了例5.2中的Rectangle类,可以用如下的方法来引用对象的成员: Rectangle r = new Rectangle(); / 定义类的对象 r.length,r.width / 引用对象的数据成员 r.area() / 引用对象的成员方法,【例3】利用例5.1定义的类Rect,计算长和宽分别为20和10的长方形面积。 class RectDemo public static void main(String args) Rect rect1 = new Rect(); / 为对象rect1分配存储空间 double area; rect1.width = 20; / 向数据成员赋值 rect1.length = 10; area = rect1.width * rect1.length; /对数据成员运算 System.out.println(“长方形面积是:“ + area); ,3、构造方法的作用与构成 构造方法:与类同名且没有任何返回值的方法; 对象的初始化任务要靠构造方法来完成; 一个类中可以有多个构造方法,名字相同而参数不同; 构造方法一般用于类中变量的初始化。 例: class Rect double length; double width; Rect(double l,double w) Length=l; width=w; ,2.1.3 构造方法 在Java中,任何变量在被使用前都必须先设置初值。Java提供了为类的成员变量赋初值的专门功能:构造方法(constructor)。构造方法是一种特殊的成员方法,它的特殊性反映在如下几个方面: (1)构造方法名与类名相同。 (2)构造方法不返回任何值,也没有返回类型。 (3)每一个类可以有零个或多个构造方法。 (4)构造方法在创建对象时自动执行,一般不能显式地直接调用。,【例6】分别计算长、宽分别为20、10和6、 3的两个长方形面积。本程序用构造方法来初始化长方形的大小。 class RectConstructor double length; double width; double area() return length * width; RectConstructor (double l, double w) length = l; width = w; ,class RectDemo3 public static void main(String args) RectConstructor rect1=new RectConstructor (20,10); RectConstructor rect2=new RectConstructor (6,3); double ar; ar = rect1.area(); System.out.println(“第一个长方形的面积是: “ + ar); ar = rect2.area(); System.out.println(“第二个长方形的面积是: “ + ar); 程序运行结果如下: 第一个长方形的面积是: 200.0 第二个长方形的面积是: 18.0,练习1:编写程序,计算长方形的面积。 class Rectangle double width, height; Rectangle(double w, double h ) width=w; height=h; double area() return width*height; double perimeter() return 2*(width+height); ,public class Lx1 public static void main(String args) double w=2, h=3, c, s; Rectangle r=new Rectangle(w,h); s=r.area(); c=r. perimeter(); System.out.println(“长方形的面积=”+s); System.out.println(“长方形的面积=”+c); ,double s2=area(3.0, 4.0); System.out.println(“矩形的面积=”+s2); double s3=area(3.0, 4.0, 5.0); System.out.println(“梯形的面积=”+s3); 程序运行的结果如下: 圆的面积=28.27433388230838 矩形的面积=12.0 梯形的面积=17.5,2.2.1 类继承的实现 Java中的继承是通过extends关键字来实现的,在定义新类时使用extends关键字指明新类的父类,就在两个类之间建立了继承关系。 1.定义子类 通过继承系统类定义子类的例子已经见过的有例1.2的小程序,其类头分别为: public class HelloApplet extends Applet 一般地,在类声明中,加入extends子句来创建一个类的子类。extends后即为父类名,若父类名又是某个类的子类,则定义的类也是该类的(间接)子类。若无extends子句,则该类为java.lang.Object的子类。,例5.4 显示当前日期和时间,运行结果见图。,import java.awt.Graphics; import java.applet.Applet; import java.util.Calendar; class Time private Calendar t; private int y, m, d, hh, mm, ss; Time () t=Calendar.getInstance(); y=t.get( t.YEAR ); m=t.get( t.MONTH )+1; d=t.get( t.DATE ); hh=t.get( t.HOUR_OF_DAY ); mm=t.get( t.MINUTE ); ss=t.get( t.SECOND ); ,public String getDate( ) return y+ 年+m+月+d+日; public String getTime() String s=hh+ 时+mm+分+ss+秒; return s; public class ShowTime extends Applet Time t=new Time(); public void paint(Graphics g) g.drawString(当前日期: +t.getDate(),50,40); g.drawString(当前时间: +t.getTime(),50,80); ,2.类继承的传递性 类继承具有传递性,即子类继承父类的所有非私有成员,也继承父类的父类直至祖先所有的所有非私有成员。 3.类的成员覆盖 在类的继承中,若子类(派生类)新增的成员名称与父类(超类)成员相同,则称为成员覆盖(overriding)。 在子类中定义与父类同名成员的目的是修改父类的属性和行为。,(1)成员变量的覆盖 若子类声明了与父类同名的变量,则父类的变量被隐藏起来,直接使用的是子类的变量,但父类的变量仍占据空间,可通过super或父类名来访问。 【例5.14】在子类中定义了与父类同名的变量,从而隐藏了父类成员变量,这种隐藏变量可加super前缀来访问。 class A int x = 100; ,class B extends A int x = 200; void print() System.out.println(“Subclass : “ + x); System.out.println(“Superclass : “ + super.x); public static void main(String args) (new B().print(); 程序运行结果如下: Subclass : 200 Superclass : 100,(2)成员方法覆盖 与子类可以定义与父类同名的成员变量,实现对父类成员变量的隐藏的情况一样,子类也可以定义与父类同名的方法,实现对父类方法的覆盖。方法成员的覆盖与成员变量的隐藏的不同之处在于:子类隐藏父类的成员变量只是使得它不可见,父类的同名成员变量在子类对象中仍然占据自己的存储空间; 而子类成员方法对父类同名方法的覆盖将清除父类方法占用的内存空间,从而使得父类的方法在子类对象中不复存在。,方法的覆盖中需注意的是:子类在重新定义父类已有的方法时,应保持与父类完全相同的方法头声明,即应与父类有完全相同的方法名、返回值和参数列表。否则就不是方法的覆盖。而是在子类定义自己的与父类无关的成员方法,父类的方法未被覆盖,所以仍然存在。 下述规则适用于覆盖方法: 覆盖方法的返回类型必须与它所覆盖的方法相同。 覆盖方法不能比它所覆盖的方法访问性差。 覆盖方法不能比它所覆盖的方法抛出更多的异常。,【例15】继承例5.6中的类RectConstructor时对父类的成员变量赋初值。 class Cube extends RectConstructor double height; Cube(double l,double w,double h) super(l,w); height = h; void vol() System.out.println(“长方体体积 = “+ area() * height); 【例6】,public class CubeDemo public static void main(String args) Cube c = new Cube(7,6,5); c.vol(); 程序运行结果如下: 长方体体积 = 210.0,3 接口(interface),接口是若干完成某一特定功能的没有方法体的方法(抽象方法)和常量的集合。接口仅提供了方法协议的封装。为了获取接口功能和真正实现接口功能需要使用类来继承该接口。在继承接口的类中,通过定义接口中抽象方法的方法体(即抽象方法的覆盖)来实现接口功能。 Java语言使用接口来实现类间多重继承的功能,从而弥补了Java语言只支持类间单重继承,描述复杂实际问题处理不方便的不足。,JAVA中的接口,接口的概念 接口是一组特定的函数定义的集合 接口中只有函数定义,而没有具体的实现 接口中也可以有常量,但不能有变量 接口的作用是定义了一组接口协议 接口好像一堵墙,将功能与实现彻底分隔开,接口的概念与特点 接口函数的实现: 接口函数可以用任何类来实现 必须实现接口中的所有函数,而不能只实现一部分 接口函数的调用: 任何程序都可以调用接口中的函数 调用接口函数时不需要知道它是怎么实现的,也不需要知道它是由哪个类实现的,JAVA中的接口,例如:,一架战斗机可能同时是一架飞机,也是一种武器,如果选择继承其中一项特性,那么针对另外一项特性就必须在对象类中自行定义构建所需的方法等,但这样可能因此丧失与其他对象类的关联性与程序概念的可重复性。,Mili (军用) 特性,Fighter (战斗机) 特性,Tank (坦克) 特性,Truck (卡车) 特性,Weapon (武器) 特性,Plane (飞机) 特性,Weapon (武器) 特性,Car (汽车) 特性,Car (汽车) 特性,Supply (补给) 特性,构建Fighter,选择Plane特性,则Weapon的部分特性原来与Tank重叠,却可能因自行构建Weapon的部分特性而舍弃了这一部分概念。,Fighter (战斗机)类,Tank (坦克)类,Plane (飞机)类,Weapon (武器)类,Car (汽车)类,Fighter (战斗机)类,Tank (坦克)类,Plane (飞机)类,Weapon (武器)类,Car (汽车)类,选择继承同一类,可做类型转换,但必须额外构建Plane与Car特性。,选择Plane与Car类,只需构建类似的Weapon特性,但无法类型转换。,Java的单一继承要求每个对象仅继承一个单一的对象类,并从中继承所需的方法和数据成员。,合理做法:将Weapon这个特性定义成interface,构建该项特性所必须的方法,这样,Fighter对象类的构建就可以继承Plane对象类,但实现接口Weapon,完成该对象所具备的真正特性。,接口的定义和实现 1.接口的定义 在Java语言中,用关键字interface来定义接口。接口有类似类的结构,其定义格式如下: 修饰符 interface 接口名 extends 父接口名表 / 接口体 接口定义包括定义接口名和接口体。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 七年级英语教材重点Lesson导读
- 看电影学英语:中英文对照剧本解析
- 2025-2030数字人民币跨境支付系统建设与银行IT改造投资机会分析
- 2025-2030教育装备行业市场深度分析及技术革新与未来发展前景研究
- 2025-2030教育考试身份核验领域指纹识别设备招投标数据全景分析
- 2025-2030教育科技云平台服务行业发展前景与商业模式优化报告
- 2025-2030教育出版行业数字化转型与市场格局演变报告
- 2025-2030教育人工智能产品用户体验与市场接受度报告
- 2025-2030换电模式与充电模式协同发展前景对比分析报告
- 2025-2030抗辐射芯片在航天电子系统中的可靠性验证方法研究报告
- 2025-2030中国废塑料化学回收行业市场发展分析及发展前景与投融资战略规划研究报告
- T-CIDA 0025-2024 大中型灌区量测控设施整体规划技术指南
- 道路清障合同范本
- (完整版)深基坑土方开挖专项施工方案
- 中国私人诊所行业投资分析、市场运行态势研究报告-智研咨询发布(2025版)
- 《婴幼儿营养与喂养》课件-1.2.1 维生素
- SBS防水卷材购货合同范本
- 广东广州历年中考语文现代文阅读之非连续性文本阅读7篇(截至2024年)
- 2025-2030年中国输电线路铁塔市场发展状况规划研究报告
- 华为干部管理
- 广东省深圳中考《英语》听说考试信息询问专项课件
评论
0/150
提交评论