类的进一步讨论.ppt_第1页
类的进一步讨论.ppt_第2页
类的进一步讨论.ppt_第3页
类的进一步讨论.ppt_第4页
类的进一步讨论.ppt_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1 第4讲 类的继承、抽象类及接口 主要内容 p 类的继承 p 抽象类 p 内部类、匿名类及最终类 p 包及访问限定 p 接口 p 本讲小结 2 类的继承 u 继承是面向对象的重要特点之一。 u 类的继承使得能够在已有类的基础上构造新的类, 新类除了具有被继承类的属性和方法外,还可以根 据需要添加新的属性和方法。 u 继承有利于代码的复用。 u 通过继承可以更有效地组织程序结构,并充分利用 已有的类来完成复杂的任务,减少了代码冗余和出 错的几率。 u 类继承的实现 下边以一个定义学生入学注册登记类的示例说明类 继承的实现。 3 类的继承 (定义类StudentRegister ) 学生入学注册登记项包括: 个人的基本信息(这些信息包括在Citizen类中); 学号 String (studentID) 入学成绩 int (enterResult) 院系 String (department) 专业 String (specialty) 等等。此外还需要定义一些显示这些项的方法。 public class StudentRegister extends Citizen String studentId; /说明学号 int enterResult; /说明入学成绩 String department; /说明院系 String specialty; /说明专业 4 类的继承 (定义类StudentRegister ) public StudentRegister(String name,String alias,String sex, String brithday,String homeland,String ID,String studentId,int enterResult,String department,String specialty) /构造方法 super(name,alias,sex,brithday,homeland,ID); /调用父类构造方法 this.studentId=studentId; this.result=result; this.department=department; this.specialty=specialty; public void display() super.display (); /调用父类显示方法 System.out.println(“学号:“+studentId); System.out.println(“入学成绩:“+enterResult); System.out.println(“院系:“+department); System.out.println(“专业:“+specialty); System.out.println(“-“); 编译程序 5 测试StudentRegister类 public class StudentRegisterTest public static void main(String args) StudentRegister s1=new StudentRegister(“丽柔 ”, “一晓”,“女”,“1988.12.11”,“上海”, ,“200608010201”,624,“ 工程学院”,“工业设计”); /创建对象 s1.display(); /显示对象属性 6 类的继承 u 继承就是子类利用父类中定义的变量和方法,就像 它们属于子类本身一样. u方法的重载就是在同一个类中至少有两个方法使用 同一个名字,区分它们的主要依据: 参数的个数不同; 或 参数的类型不同。 这是多态性的具体体现。 例:在StudentRegister类中加入不带参数的构造方法 和能够只显示学号、姓名和入学成绩项的成员方法 。 7 添加方法 public StudentRegister() super(); /执行父类构造方法 studentId=“00000000000”; enterResult=0; department=“ 无 ”; specialty=“ 无 “; public void display( StudentRegister s1) System.out.print(“学号:“+s1.studentId); System.out.print (“ - 姓名:”+s1.getName(); System.out.println(“ - 入学成绩:“+s1.enterResult); 8 测试StudentRegister类的功能 public class StudentRegisterTest1 public static void main(String args) StudentRegister s1=new StudentRegister(“丽柔”,“一晓”,“女”, “1988.12.11”, “上海”, , “200608010201”, 624,“工程学院”,“工业设计”); /创建对象s1 StudentRegister s2=new StudentRegister(); /创建对象s2 s2.studentId=“20060801245”; /为对象s2的属性赋值 s2.enterResult=585; /. s2.setName(“席铪”); / s1.display(); /显示对象s1所有属性 s2.display(); /显示对象s2所有属性 s1.display(s1); /显示对象s1的部分属性 s2.display(s2); /显示对象s2的部分属性 9 类的继承 u 方法的覆盖 在子类中重新定义(重写)父类中已有的方法。 这样做的好处是方法名一致易记易用; 可以实现与父类方法不同的功能; 调用父类的同名方法: super.方法名(参数列表); u 变量的隐藏 在子类中定义了和父类中同名的属性 在方法中定义了和类中同名的属性 在方法中引用属性时,系统采用局部优先的原则,即: 方法中定义的属性直接使用; 本类中定义的同名属性的引用:this.属性名; 父类中定义的同名属性的引用:super.属性名; 10 抽象类 类是对现实世界中实体的抽象,但我们不能以 相同的方法为现实世界中所有的实体做模型,因为 大多数现实世界的类太抽象而不能独立存在。例如 :几何图形类、交通工具类、鸟类等等。 u 抽象类是指不能直接被实例化的类,因此一般把它 作为其它类的超类。与final类正好相反。 u 抽象方法是指只有方法声明而没有方法体的方法 。在该类中只声明但不提供方法实现(方法体),由 继承类提供方法实现。 u 只要类中声明了一个抽象方法,该类就必须是抽 象类. 11 抽象类的定义 定义抽象类的一般格式如下: 访问限定符 abstract class 类名 . /属性说明 访问限定符 abstract 类型 方法名(参数声明列表) ; /抽象方法声明 /非抽象方法定义 u所谓抽象方法,是指仅声明了类的行为,并没有真正实现行为的 代码。 u抽象方法只能存在于抽象类中. u构造方法、静态(static)方法、最终(final)方法和私有( private)方法不能被声明为抽象方法。 u抽象类中可以有一个或多个抽象方法,也可以没有。如果没有 抽象方法,这就意味着要避免使用该类直接创建对象。 u抽象类只能被继承(派生子类)而不能创建具体对象即不能 被实例化。 12 Shape类定义 u定义几何图形类Shape 任何几何图形都有一个名称,都占据一定的面 积,因此我们可以作如下的抽象定义: /* 这是抽象的平面形状类的定义程序的名字是:Shape.java */ public abstract class Shape String name; /声明属性 public abstract double area(); /抽象方法声明 u 抽象类的实现 例:定义并实现一个三角形类Triangle 。 13 抽象类的实现(三角形) 三角形面积公式: 其中:a,b,c 表示三角形的三条边的边长 u 根据上边公式中所涉及的量,需要在Triangle 类中定义 三角形的有关属性三条边:sideA、 sideB、 sideC。 u 由Shape类派生Triangle类。因此在Triangle 类中必须实 现Shape类中的抽象方法area(); u 也可在Triangle类中定义计算三角形周长等方法。 14 Triangle类定义 /*这这是定义义平面几何图图形三角形类类的程序 程序的名字是:Tritangle.java*/ public class Triangle extends Shape /这这是Shape的派生子类类 double sideA,sideB,sideC; /声明实实例变变量三角形3条边边 public Triangle() /无参数构造器 name=“示例全等三角形“; sideA=1.0; sideB=1.0; sideC=1.0; public Triangle(double sideA,double sideB,double sideC) /构造器 name=“任意三角形“; this.sideA = sideA; this.sideB = sideB; this.sideC = sideC; 15 Triangle类定义实现 public double area() /实现抽象方法 double s=0.5*(sideA+sideB+sideC); return Math.sqrt(s*(s-sideA)*(s-sideB)*(s-sideC); u 测试Triangle类 public class TriangleTest public static void main(String args) Triangle t1=new Triangle(); /创创建一个标标准三角形对对象 Triangle t2=new Triangle(4,5,6); /创创建一个三角形对对象 System.out.println(+”面积=”+t1.area(); System.out.println(+”边长为4,5,6其面积=”+t2.area(); 16 内部类 内部类(Inner Class)是指被嵌套定义在另外一个 类内甚至是一个方法内的类,也称之为类中类。嵌 套内部类的类称为外部类(Outer Class),内部类通常 被看成是外部类的一个成员。 例: 工厂工人加工正六边形的阴井盖,先将钢 板压切为圆型,然后再将其切割为正六边形,求被 切割下来的废料面积。 求解这个问题。只需要计算出圆的面积和正六边形 的面积,然后相减即可。当然我们可以将正六边形 化作六个全等三角形求其面积。 下边建立一个圆类,并在圆类内定义内部类处理正六 边形。 17 定义Circle类 /* 该程序主要演示内部类的应用, 程序名:Circle.java,在类中嵌套了Polygon类 */ public class Circle extends Shape /继承Shape类 double radius; public Circle() /构造标准圆 name=“标准圆“; radius=1.0; public Circle(double radius) /构造一般圆 name=“一般圆“; this.radius=radius; public double area() /实现父类的抽象方法 return radius*radius*Math.PI; / 返回圆的面积 18 定义Circle类 class Polygon /定义内部类Polygon Triangle t1; /声明三角形类对象 Polygon(double a,double b,double c) /内部类构造方法 t1=new Triangle(a,b,c); /创建三角形对象 double area() /内部类方法 return t1.area()*6; /返回正六边形面积 /内部类Polygon结束 public double remainArea() /计算被切割掉的废料面积 Polygon p1=new Polygon(radius,radius,radius); /创建内部类对象 return area()-p1.area(); 19 测试Circle类求切除面积 public class CircleTest public static void main(String args) Circle c1=new Circle(.5); /创建半径为0.5的圆对象 System.out.println(“圆面积=“+c1.area(); System.out.println(“正六边形面积=“+(c1.area()- c1.remainArea(); System.out.println(“被切除的面积=“+c1.remainArea(); 20 内部类特点 内部类作为一个成员,它有如下特点: u可以使用static修饰为静态内部类。静态和非静态内部类的 主要区别: 静态内部类对象和外部类对象可以相对独立,既可直接创 建对象(new 外部类名.内部类名() ),也可通过外部类对象 创建。非静态内部类对象只能由外部对象创建。 静态类中只能使用外部类的静态成员,不能使用外部类的 非静态成员;非静态类中可以使用外部类的所有成员。 在静态类中可以定义静态和非静态成员;在非静态类中 只能定义非静态成员。 u外部类不能直接存取内部类的成员。只有通过内部类才能访 问内部类的成员。 u如果内部类被定义在一个方法内(本地内部类),它完全被隐 藏在方法中,甚至同一个类的其他方法也无法使用它。 21 匿名类和最终类 u 匿名类(Anonymous Class) 所谓匿名类就是一种没有类名的内部类,通常更多的出 现在事件处理的程序中。 在某些程序中,往往需要定义一个功能特殊且简单的类 ,且只想使用它的一个对象,并把它作为参数传递给一个方 法。此种情况下只要该类是一个现有类的派生或实现一个接 口,就可以使用匿名类。 u 最终类 所谓最终类即是使用“final”关键字修饰的类。一个类被 声明为最终类,这就意味着该类的功能已经齐全,不能够由 此类再派生子类。 在定义类时,当你不希望某类再能派生子类,可将它声 明为最终类。 22 包及访问限定 u Java中常用的标准类包 java.lang 包中存放了Java最基础的核心类,诸如: System、Math、String、Integer、Float类等等。 java.awt 包中存放了构建图形化用户界面(GUI)的类。 javax.swing 包中提供了更加丰富的、精美的、功能强 大的GUI组件,是java.awt功能的扩展。 java.applet 包中提供了applet(小程序)所需要的一些类. java.util 包中提供了一些实用工具类。 java.io 包中提供了数据流输入/输出操作的类。 java.sql 包中提供了支持使用标准SQL方式访问数据库 功能的类。 包中提供与网络通讯相关的类。用于编写网络 实用程序。 23 包(package) u 在Java中使用包来管理类。 u 创建包(package)语句 其一般格式如下: package 包名; 需要说明的是: 此语句必须放在整个源程序第一条语句的位置(注解行和 空行除外)。 包名应符合标识符的命名规则,习惯上,包名使用小写字 母书写。 可以使用多级结构的包名.如标准类包那样:java.util、 java.sql等等。 例如:要把所有的几何图形类放入shape类包中,只需在这 些几何图形类程序的第一条语句位置放上:package shape; 24 包(package) u 包文件的编译 javac d 文件夹名 源文件名 其中: -d 表明带有包的创建。 文件夹名 是已存在的文件夹名,要创建的包将放在该文 件夹下。 u 引用类包中的类 在程序的第一行使用import语句导入类包: import 包名.*; 或: import 包名.类名; 在程序中直接引用类包中所需要的类。其引用的一般格 式是: 包名.类名 25 访问限定 public public限定符不能用于限定内部类。 一个源程序中可以定义多个类,但最多只能有一个被限定为公共类 。如果有公共类,则程序名必须与公共类同名。 private 限定符只能用于成员变量、方法和内部类。私有的成员只能在 本类中被访问,即只能在本类的方法中由本类的对象引用。 protected 限定符也只能用于成员变量、方法和内部类。它可以被其子 类(包括本包的或其他包的)访问,也可以被本包内的其他类访问。 访问范围同一个类同一个包不同包的子类不同包非子类 public 缺省 private protected 26 接口 在Java中可以把接口看作是一种特殊的抽象类,它只包含常 量和抽象方法的定义,而没有变量和方法的实现,它用来表 明一个类必须做什么,而不去规定它如何做。 public interface 接口名 extends 父接口名列表 /以下声明常量 类型 常量名=常数值; /以下声明抽象方法 返回值类型 方法名(参数列表) throw 异常列表 ; 对接口体中定义的常量,系统默认为是“static final”修饰的,不需指定。 对接口体中声明的方法,系统默认为是“abstract”的,也不需指定。 只有public和缺省的 接口名必须与文件名相同 27 定义接口 例:将上述的抽象类Shape改为接口实现。 /* 本程序是一个定义接口类的程序,名字是:ShapeI.java * 接口名为ShapeI,它包含常量PI和计算面积与周长的方法 * area()、girth()声明 */ package

温馨提示

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

评论

0/150

提交评论