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