1、第第4 4章章 求租客户信息管理求租客户信息管理10/24/2022求租客户信息管理求租客户信息管理类的继承类的继承1对象转型与多态对象转型与多态抽象类与最终类抽象类与最终类3接口接口4210/24/20223第一讲第一讲 类的继承类的继承第第4 4章章 求租客户信息管理求租客户信息管理10/24/2022数据描述与数据操作类类继承的概念、继承的实现、继承的规则继承的概念、继承的实现、继承的规则属性属性属性的继承、扩展和隐藏属性的继承、扩展和隐藏方法方法方法的继承、扩展和隐藏方法的继承、扩展和隐藏构造方法的继承及调用顺序构造方法的继承及调用顺序10/24/2022一、引入什么是继承(inher
2、itance)l汽车汽车:型号、排量、颜色型号、排量、颜色l卡车卡车:型号、排量、颜色、载重型号、排量、颜色、载重l/汽车类汽车类lclass VehicleString model;/汽车型号汽车型号float displacement;/汽车排量汽车排量String color;/汽车颜色汽车颜色l/卡车类卡车类lclass TruckString model;/卡车型号卡车型号float displacement;/卡车排量卡车排量String color;/卡车颜色卡车颜色float carry;/卡车载重卡车载重10/24/2022使用继承代码重用l使用使用继承继承描述汽车类和卡车类
3、描述汽车类和卡车类l/汽车类汽车类lclass VehicleString model;float displacement;String color;l/描述卡车类,继承汽车类描述卡车类,继承汽车类lclass Truck extends Vehiclefloat load;/卡车载重,其他三个特性继承汽车类的,可以不要卡车载重,其他三个特性继承汽车类的,可以不要重复定义重复定义l继承是继承是利用已存在的类定义新的类利用已存在的类定义新的类,可以实现代码的重复使用,提高,可以实现代码的重复使用,提高效率效率l继承是类之间的一种继承是类之间的一种一般和特殊一般和特殊的关系。的关系。思考:思考:
4、现实生活中还有哪些现实生活中还有哪些对象之间存在继承关系?对象之间存在继承关系?10/24/2022二、类的继承语法规范lJavaJava中被继承的类叫中被继承的类叫父类父类(超类、基类超类、基类),),继承一个类产生的继承一个类产生的新类新类叫子类叫子类(派生类派生类)。l创建类时通过创建类时通过extendsextends指明是已有类的子类指明是已有类的子类 类修饰符类修饰符 class 子类名子类名 extends 父类名父类名 /类体,定义子类自己的成员变量和成员类体,定义子类自己的成员变量和成员方法或方法或重写父类的方法重写父类的方法 可以来自系统类可以来自系统类库,也可以是用库,也
5、可以是用户自定义类户自定义类10/24/2022Java中类的继承体现l子类继承父类的体现:子类继承父类的体现:l继承继承父类的所有成员变量和方法;父类的所有成员变量和方法;l重写重写父类的方法;父类的方法;l增加增加自己自己新的新的属性和方法。属性和方法。l子类是作为另一个类的子类是作为另一个类的扩充或修正扩充或修正而定义的一个类,而定义的一个类,子类子类总比父类多一些东西。总比父类多一些东西。l父类有的子类也有父类有的子类也有l父类没有的,子类可以增加父类没有的,子类可以增加l父类有的父类有的(方法方法),子类可以改变,子类可以改变10/24/2022类的继承规范l说明:说明:(1)Jav
6、a(1)Java不支持多重继承,只支持单继承。不支持多重继承,只支持单继承。l每个子类每个子类只能有一个父类只能有一个父类(2)(2)继承关系可以传递继承关系可以传递l每个子类也可能成为将来某个类的父类每个子类也可能成为将来某个类的父类l直接父类:子类直接继承的类直接父类:子类直接继承的类l间接父类:两级或两级以上的关系间接父类:两级或两级以上的关系(3)(3)Java中若未明确指定父类,则默认继承中若未明确指定父类,则默认继承java.lang.Object类类 10/24/2022Java类层次结构uObjectuNumber uMathuComponentu自定义类1u自定义类2uInt
7、egeruDoubleuButton uLabelu自定义类u自定义类除了根类,每个类都一个唯一的父类10/24/2022三、继承的实现父类定义package com.ext;/图形类图形类父类父类public class Shape String type;/图形类别图形类别 public void setType(String type)this.type=type;public String getType()return type;/显示类别信息显示类别信息 public void showInfo()System.out.println(type);public void getAr
8、ea()/形状的类别未确定,无法计算面积,方法体为空形状的类别未确定,无法计算面积,方法体为空 10/24/2022继承的实现子类定义package com.ext;/圆类圆类子类子类public class Circle extends Shape double radius;/圆的半径圆的半径 public void setRadius(double radius)this.radius=radius;public double getRadius()return radius;public void getArea()showInfo();/直接调用父类的方法直接调用父类的方法 Syst
9、em.out.println(“其面积为:其面积为:”+Math.PI*radius*radius);public double getPerimeter()return 2*Math.PI*radius;思考:思考:Circle类中有哪些属类中有哪些属性和方法?性和方法?10/24/2022继承的实现测试类定义package com.ext;/测试类测试类public TestCircle public static void main(String args)Circle myCircle=new Circle();myCircle.setRadius(2.1);/Circle自己新定义的
10、方法自己新定义的方法myCircle.setType(“这是一个圆这是一个圆!”);/调用继承的父类方法调用继承的父类方法myCircle.getArea();/调用调用Circle重写的父类的方法重写的父类的方法double perimeter=myCircle.getPerimeter();System.out.println(”其周长为:其周长为:”+perimeter);10/24/2022课堂实践l定义图形类的子类:三角形类和矩形类,分别定义图形类的子类:三角形类和矩形类,分别计算其面积及周长。计算其面积及周长。做一做做一做10/24/2022四、继承规则l子类继承父类所有的成员和方
11、法。(除了构造方法)子类继承父类所有的成员和方法。(除了构造方法)l父类中父类中privateprivate修饰的成员变量不能被子类直接访问。修饰的成员变量不能被子类直接访问。l若父类和子类不在同一个包若父类和子类不在同一个包 l子类继承父类时要求能够找到超类,因此子类继承父类时要求能够找到超类,因此父类必须有父类必须有packagepackage语句,语句,子类必须有子类必须有importimport语句语句,父类还必须有父类还必须有publicpublic修饰符修饰符10/24/2022类的继承继承规则图示包2子类2Public SuperClass子类1public int b;prot
12、ected int c;int a;public int b;protected int c;private int d;int a;public int b;protected int c;包1YesYesnonoYesYesYesnoimportuno表示不能直接访问uYes表示能被继承且能直接访问10/24/2022五、变量隐藏和方法重写l子类对父类可做扩展和特殊化子类对父类可做扩展和特殊化l创建新的成员:变量或方法的成员:变量或方法l重新定义父类中已有的父类中已有的变量:变量:变量隐藏l重新定义父类中已有的父类中已有的方法:方法重写:方法重写(覆盖)(overwrite(overwri
13、te 或或override)override)10/24/2022变量隐藏l子类子类重新重新定义从父类继承的定义从父类继承的完全相同的变量完全相同的变量称为变量隐藏。称为变量隐藏。l变量隐藏后变量的处理变量隐藏后变量的处理l当子类执行继承自父类的操作时,处理的是父类的变量当子类执行继承自父类的操作时,处理的是父类的变量l当子类执行自己定义的方法时,操作的是自己的变量,把父类的变当子类执行自己定义的方法时,操作的是自己的变量,把父类的变量量“隐藏隐藏”起来起来class Person String id;String name;String address;public void showNam
14、e()System.out.println(name);class Student extends Person String address;/重新定义父类变量重新定义父类变量 public void showInfo()showName();/调用父类的方法 System.out.println(“Student:“+address);/使用的是子类的address 10/24/2022方法的重写(覆盖)l重写是子类重写是子类根据需要根据需要重新定义继承自父类的方法,使子类具有自己的重新定义继承自父类的方法,使子类具有自己的行为。行为。l子类中的重写的方法应与父类中的被覆盖的方法有子类中的
15、重写的方法应与父类中的被覆盖的方法有完全相同的完全相同的:方法:方法名称、参数列表、返回值类型名称、参数列表、返回值类型。l重写时,修改方法的修饰权限重写时,修改方法的修饰权限只能从小到大只能从小到大 private defaultprotectedpublicprivate defaultprotectedpublicl不能重写父类的不能重写父类的finalfinal方法方法lstatic:static:子类可以继承父类的静态方法子类可以继承父类的静态方法,但不能重写但不能重写class Employee String name;public void showInfo()System.ou
16、t.println(name);class Manager extends Employee String department;public void showInfo()System.out.println(name);System.out.println(“Manager of”+department);10/24/2022示例:隐藏和覆盖class MyClassprotected String s=a member of MyClass;protected void test()System.out.println(s);public class MySubClass extends
17、 MyClasspublic String s=“a member of MySubClass”;/隐藏隐藏public void test()/重写重写super.test();System.out.println(s);public static void main(String args)MySubClass msc=new MySubClass();System.out.println(msc.s);msc.test();a member of MySubClassa member of MyClassa member of MySubClass10/24/2022思考l方法重载和重写
18、的区别?方法重载和重写的区别?l重载:重载:l一个类中,同名方法一个类中,同名方法l参数类型不同或个数不等参数类型不同或个数不等l重写:重写:l不同类的同名方法,两个类之间是继承关系不同类的同名方法,两个类之间是继承关系l子类对父类方法的重新定义子类对父类方法的重新定义l重写重写一定是伴随着一定是伴随着继承继承发生的,没有继承就没有重发生的,没有继承就没有重写写10/24/2022六、this和superp系统默认,每个类有系统默认,每个类有nullnull、thisthis和和supersuper三个域,直接使用三个域,直接使用this 引用自身对象引用自身对象super 引用父类对象引用父
19、类对象thisthis的主要作用是引用自身对象的方法、变量及构造方法。的主要作用是引用自身对象的方法、变量及构造方法。supersuper用来引用父类中的用来引用父类中的(被覆盖的被覆盖的)方法、方法、(被隐藏的被隐藏的)变量及构变量及构造方法。造方法。thisthis和和supersuper可以调用当前对象或父类对象的构造函数可以调用当前对象或父类对象的构造函数10/24/2022做一做做一做u理解动物类之间的继承关系,通过理解动物类之间的继承关系,通过JavaJava类的类的继承体现各种动物之间的关系。继承体现各种动物之间的关系。编写动物世界的继承关系代码。动物编写动物世界的继承关系代码。
20、动物(AnimalAnimal)包括山羊()包括山羊(GoatGoat)和狼)和狼(WolfWolf),它们吃(),它们吃(eateat)的行为不同,)的行为不同,山羊吃草,狼吃肉,但走路(山羊吃草,狼吃肉,但走路(walkwalk)的)的行为是一致的。通过继承实现以上需求,行为是一致的。通过继承实现以上需求,并编写并编写AnimalTestAnimalTest测试类进行测试。测试类进行测试。10/24/2022七、构造方法的继承原则l当当生成子类对象生成子类对象时,时,JAVAJAVA默认首先默认首先去调用父类的去调用父类的不带参不带参数的构造方法数的构造方法,然后执行该构造方法,生成父类的
21、对象,然后执行该构造方法,生成父类的对象,接下来,再去调用子类的构造方法,生成子类的对象。接下来,再去调用子类的构造方法,生成子类的对象。l若若父类没有无参的构造方法父类没有无参的构造方法,则子类必须在自己的构造方则子类必须在自己的构造方法中使用法中使用super()super()显式调用父类的某个有参构造方法。显式调用父类的某个有参构造方法。l如果如果子类子类使用使用super()super()显式的调用父类的某个构造方法,显式的调用父类的某个构造方法,那么在执行的时候就会那么在执行的时候就会寻找与寻找与super()super()所对应的构造方法所对应的构造方法,而不会再去寻找父类的不带参
22、数的构造方法。与而不会再去寻找父类的不带参数的构造方法。与this()this()一一样,它也必须要作为构造方法的样,它也必须要作为构造方法的第一条语句第一条语句。10/24/2022public class A extends F5 private F1 f1=new F1();private F2 f2=new F2();A()System.out.println(A);public static void main(String args)A a=new A();class F1 F1()System.out.println(F1);class F2 F2()System.out.pri
23、ntln(F2);class F3 F3()System.out.println(F3);class F4 extends F3 F4()System.out.println(F4);class F5 extends F4 F5()System.out.println(F5);构造方法的调用顺序-面试和资格考试重点 F3F4F5F1F2Ao有父类的话先调用父类的构造方法,如果父类之上还有父类,则继续向上调用,直到最顶层父类为止,再一层一层向下调用其它父类的构造方法;o当调用完最靠近子类的父类的构造方法时,执行本子类成员对象的构造方法;o执行子类的构造方法。10/24/2022 小结l继承可以实
24、现代码复用继承可以实现代码复用l继承规则继承规则l变量隐藏变量隐藏l方法重写方法重写 (重载的区别)(重载的区别)lthisthis和和supersuper关键字关键字l构造方法的继承和调用顺序构造方法的继承和调用顺序10/24/202227第二讲第二讲 对象转型与多态对象转型与多态第第4 4章章 求租客户信息管理求租客户信息管理10/24/2022引入:什么是对象转型?l引入:父类引入:父类Shape,Shape,子类子类Circle,Circle,有如下定义:有如下定义:lShape s1=new Shape();Circle c1=new Circle();Shape s1=new Sh
25、ape();Circle c1=new Circle();l问题:问题:l(1)s1=c1;(1)s1=c1;赋值是否合法赋值是否合法?l(2)c1=s1;(2)c1=s1;赋值是否合法赋值是否合法?l对象转型对象转型:类型之间的相互转换:类型之间的相互转换10/24/2022一、对象转型l父类变量父类变量直接直接引用子类对象(引用子类对象(向上转型向上转型upcasting)Student stunew Student();Person pnew Student();/父类引用新创建的子类对象父类引用新创建的子类对象 Person p1stu;/父类的引用变量引用子类对象父类的引用变量引用子
26、类对象l父类引用父类引用只能调用父类自己的方法只能调用父类自己的方法,子类新定义的方法不能访问,子类新定义的方法不能访问l父类对象赋给子类变量(父类对象赋给子类变量(向下转型向下转型downcasting)Student s(Student)p1;l必须使用必须使用强制类型转换强制类型转换l必须确保必须确保该父类变量目前引用的是子类对象该父类变量目前引用的是子类对象。10/24/2022示例:对象转型class SuperClassint x;class SubClass extends SuperClassint y;char ch;public class UseSuperSub publ
27、ic static void main(String args)SuperClass sp,sp_ref;SubClass sb,sb_ref;sp=new SuperClass();sb=new SubClass();sp_ref=sb;/向上转型向上转型sb_ref=(SubClass)sp_ref;/向下转型向下转型10/24/2022instanceof运算符应用l可以使用可以使用“引用变量引用变量 instanceof类名类名”来判断该引用变量所来判断该引用变量所“指向指向”的对象的对象是否属于该类或该类的子类是否属于该类或该类的子类l示例:一个处理网上购书系统,其中有这样三个类:示
28、例:一个处理网上购书系统,其中有这样三个类:public double calculate(Book book)if(book instanceof ComputerBook)/处理计算机类书的打折处理计算机类书的打折 if(book instanceof Novel)/处理小说类书的打折处理小说类书的打折 .public class Book/省略细节 public class ComputerBook extends Book/省略细节 public class Novel extends Book/省略细节 在处理程序里有一个方法,接受一个Book类型的对象,计算打折金额。假设两种打折方
29、法不同,而传入的Book对象可能是两种中的任何一种,所以要用instanceof来判断可以用一个方法处理两种子类。10/24/2022课堂实践做一做做一做定义一个学生类Student,包含u属性:学号:no姓名:nameu方法:类Student带参数的构造方法:在构造方法中通过形参完成对成员变量的赋值操作。重写父类(Object)的equals()方法:根据学号判断对象是否相同,若学号相同,则结果为true,否则结果为false.编写一个测试类StudentTest,创建2个对象,判断他们是否相同.10/24/2022二、引入:多态polymorphism/分析下列程序执行过程分析下列程序执行
30、过程Public class Testpublic static void main(String args)Test t=new Test();Animal a=new Animal(“name”);Dog d=new Dog(“dogname”,”black”);Cat c=new Cat(“catname”,”blue”);t.f(a);t.f(d);t.f(c);public void f(Animal a)System.out.println(“name:”+a.name);if(a instanceof Dog)Dog dog=(Dog)a;System.out.println(“
31、fur:”+dog.furColor);else if(a instanceof Cat)Cat cat=(Cat)a;System.out.println(“eyes:”+cat.eyesColor);3310/24/2022面向对象的核心多态l多态分为多态分为静态多态静态多态 (编译时多态编译时多态)和和动态多态动态多态 (运行时多态运行时多态)l静态多态静态多态:编译时多态通过编译时多态通过方法重载实现方法重载实现,本质是用一个方,本质是用一个方法名来命名一组方法,这一组方法在参数个数、参数类型法名来命名一组方法,这一组方法在参数个数、参数类型或次序上有区别,或次序上有区别,编译时编译程
32、序进行匹配,决定调用哪编译时编译程序进行匹配,决定调用哪一个方法一个方法。l动态多态动态多态:运行时多态通过运行时多态通过方法重写实现方法重写实现,是执行期间(而,是执行期间(而非编译期间)判断所引用对象的实际类型,根据实际类型非编译期间)判断所引用对象的实际类型,根据实际类型调用其相应的方法。调用其相应的方法。3410/24/2022多态的使用l运行时多态运行时多态(动态多态动态多态)要满足的条件:要满足的条件:l子类对象的方法调用必须通过一个基类类型的变量进行子类对象的方法调用必须通过一个基类类型的变量进行l调用的方法必须被声明为父类的一个成员调用的方法必须被声明为父类的一个成员l调用的方
33、法必须在子类中被调用的方法必须在子类中被重写重写l子类和父类有相同的方法头部子类和父类有相同的方法头部l子类方法的访问权限不能比基类有更多的限制子类方法的访问权限不能比基类有更多的限制l当使用一个父类变量调用一个方法时,多态会根据当使用一个父类变量调用一个方法时,多态会根据存储的存储的对象的类型对象的类型而不是引用变量的类型来选择要调用的方法。而不是引用变量的类型来选择要调用的方法。l因为父类的变量可以引用任何子类的对象,因此直到程序因为父类的变量可以引用任何子类的对象,因此直到程序执行时才知道引用的对象类型。执行时才知道引用的对象类型。l程序可以在运行时自动适应不同类型的数据并进行相应的程序
34、可以在运行时自动适应不同类型的数据并进行相应的处理。处理。3510/24/2022运行时多态class Aint i,j;A(int i,int j)this.i=i;this.j=j;int add()return i+j;class B extends A B(int i,int j)super(i,j);int multiply()return 0;class C extends B C(int i,int j)super(i,j);int muliply()return i*j;class Inheritance public static void main(String args)
35、B x=new C(6,8);System.out.println(“i*j=”+x.mulitply();/通过x调用子类C重重写的mulitply方法 System.out.println(“i*j=”+x.add();/调用父类add方法,该方法未被子类重写 i*j=48i+j=1410/24/202237小结动态绑定(多态)l多态:不同的对象收到同一个消息可产生完全不同的效果。多态:不同的对象收到同一个消息可产生完全不同的效果。l多态的效果:用户发送一个通用的消息,而实现的细节则多态的效果:用户发送一个通用的消息,而实现的细节则由接收对象自行决定。由接收对象自行决定。l多态的作用:增强
36、了操作的透明性、可理解性和可扩展性;多态的作用:增强了操作的透明性、可理解性和可扩展性;增强了软件的灵活性和重用性。增强了软件的灵活性和重用性。l动态多态动态多态存在的三个存在的三个必要条件必要条件:l要有继承要有继承l要有方法的重写要有方法的重写l父类引用指向子类对象父类引用指向子类对象10/24/2022课堂实践定义类Person及其子类Employee,Employee的子类Manager,每个类定义下列成员变量:uPerson类:姓名、年龄uEmployee类:工号、工资uManager类:职务名称u每个类定义构造方法初始化所有变量,重写toString()方法输出所有成员变量值。定义
37、测试类PolyTest:创建这些类的对象,调用toString()方法进行测试。做一做做一做10/24/202239第三讲第三讲 抽象类与最终类抽象类与最终类第第4 4章章 求租客户信息管理求租客户信息管理10/24/2022一、抽象类和抽象方法l抽象类抽象类 abstract修饰修饰public abstract class 抽象类名 类体;l抽象方法抽象方法 abstract修饰修饰权限修饰符 abstract 返回值类型 方法名(形式参数列表);u图书u计算机类书u散文小说类u工具书uJavauC#u网络定义抽象类的目的:用它作为基类去创建派生类.抽象类的作用是作为一个类族中的共同基类图
38、书类定义为抽象类10/24/202241示例:抽象方法和抽象类abstract class Shapepublic abstract void getArea();class Rect extends Shapedouble width;double height;Rect(double w,double h)width=w;height=h;public void getArea()System.out.println(The area of Rect is:+width*height);class Circle extends Shapedouble radius;final double
39、 pi=Math.PI;Circle(double r)radius=r;public void getArea()System.out.println(The area of Circle is:+pi*radius*radius);public class TestShape static void show(Shape s)s.getArea();public static void main(String args)Rect r=new Rect(1,2);Circle c=new Circle(2);show(r);show(c);10/24/2022抽象类的特点u抽象类抽象类不能用
40、不能用newnew创建抽象类的实例(对象)创建抽象类的实例(对象)。和具体类一样,类中可以有成员变量和成员方法,包括构造和具体类一样,类中可以有成员变量和成员方法,包括构造方法。但与具体类不同的是,抽象类中可以定义抽象方法。方法。但与具体类不同的是,抽象类中可以定义抽象方法。抽象方法只能出现在抽象类抽象方法只能出现在抽象类中,但抽象类中可以没有抽象方中,但抽象类中可以没有抽象方法。法。抽象类中的所有抽象方法必须在其非抽象子类中加以实现,抽象类中的所有抽象方法必须在其非抽象子类中加以实现,否则子类也必须声明为抽象类否则子类也必须声明为抽象类。u抽象方法抽象方法l构造方法构造方法不能被声明为抽象方
41、法。不能被声明为抽象方法。l静态成员方法静态成员方法不能被声明为抽象方法不能被声明为抽象方法(abstract和和static不能同不能同时存在时存在)。l任何包含抽象方法的类必须被声明为抽象类。任何包含抽象方法的类必须被声明为抽象类。10/24/2022二、最终类和最终方法l最终类最终类 final final 修饰修饰l不能被继承不能被继承,即不能声明它的子类,即不能声明它的子类 。l目的:为避免盲目继承。目的:为避免盲目继承。l抽象类不能被声明为最终类抽象类不能被声明为最终类 。l它的方法默认是最终方法它的方法默认是最终方法,但属性可以定义为,但属性可以定义为finalfinal和非和非
42、finalfinal。l最终方法最终方法 final final 修饰修饰 l不能被它的子类覆盖不能被它的子类覆盖(它只是说明这个方法已经固定下来,在当(它只是说明这个方法已经固定下来,在当前类中和该类的子类中都一样)前类中和该类的子类中都一样)。l最终类中的方法默认也是最终方法最终类中的方法默认也是最终方法。final称为最终修饰符,可以用来修饰类,方法,属性,变量。public final class Math extends Object /数数学类,最终类学类,最终类10/24/2022抽象类和最终类l抽象类的目的就是为了被继承抽象类的目的就是为了被继承l最终类的目的是不被继承最终类的
43、目的是不被继承l一个类是一个类是不能用不能用 abstract abstract 和和 final final 同时修饰同时修饰的。的。10/24/2022小结l对象转型对象转型l子类引用父类子类引用父类l父类引用子类父类引用子类linstanceofl多态多态l静态多态静态多态l动态多态动态多态l抽象类抽象类l抽象类和抽象方法抽象类和抽象方法l最终类最终类10/24/202246第四讲第四讲 接口接口第第4 4章章 求租客户信息管理求租客户信息管理10/24/2022一、Java语言的接口(interface)lJAVAJAVA只支持单继承,每个类只能有一个超类。接口用于实只支持单继承,每个
44、类只能有一个超类。接口用于实现多继承,一个类可以实现多个接口,达到多继承的目的。现多继承,一个类可以实现多个接口,达到多继承的目的。l接口定义了若干个抽象方法和常量,形成完成一个特定功接口定义了若干个抽象方法和常量,形成完成一个特定功能的属性集合。能的属性集合。l接口是由接口是由常量和抽象方法常量和抽象方法组成的组成的特殊类特殊类,接口中的属性都,接口中的属性都是用是用finalfinal修饰的常量,方法都是用修饰的常量,方法都是用abstractabstract修饰的修饰的没有方没有方法体法体的抽象方法。的抽象方法。l接口中的方法只提供接口中的方法只提供“做什么做什么”,不提供,不提供“怎么
45、做怎么做”。10/24/202248接口(interface)l接口可用于定义接口可用于定义方法原型和常量值方法原型和常量值。从本质上讲,接口是。从本质上讲,接口是一种一种特殊的抽象类特殊的抽象类,这种抽象类中只包含常量和方法的定,这种抽象类中只包含常量和方法的定义,而没有方法的实现义,而没有方法的实现。通过接口可以实现通过接口可以实现不相关类的相同行为不相关类的相同行为,而不需要考虑,而不需要考虑这些类之间的层次关系。这些类之间的层次关系。通过接口可以指明多个类需要实现的一组方法。通过接口可以指明多个类需要实现的一组方法。通过接口可以在运行时动态定位类所需调用的方法。通过接口可以在运行时动态
46、定位类所需调用的方法。10/24/202249接口的定义l接口(接口(interfaceinterface)作为特殊形式的抽象类,和类)作为特殊形式的抽象类,和类(class)(class)在使用上具有在使用上具有类似的约束。类似的约束。l一个一个publicpublic接口只能定义在同名的接口只能定义在同名的.java.java文件中文件中public interface interfaceName extends SuperInterfaceList /常量定义和方法定义常量定义和方法定义 public static final 类型类型 变量名变量名=常量值常量值;public abst
47、ract native 返回值类型返回值类型 方法名方法名(参数列表参数列表)throws 异常列表异常列表;.public interface MyIfint MAXSIZE=1024;public abstract void mM(String name);10/24/202250接口的定义-interfacel接口体的定义有两部分:属性的声明、方法的声明接口体的定义有两部分:属性的声明、方法的声明l系统默认:系统默认:l属性都是属性都是 public static finalpublic static final,成员变量声明后立即赋值。l方法都是方法都是public abstractp
48、ublic abstractl接口具有接口具有继承性继承性,通过关键字,通过关键字extendsextends声明该接口是某父声明该接口是某父类的派生接口;一个接口可以有类的派生接口;一个接口可以有多个父接口多个父接口,它们之间用,它们之间用逗号分隔逗号分隔10/24/202251接口的实现-implementsl定义定义类类实现接口,用实现接口,用implementsimplements关键字说明该类将要实现哪个关键字说明该类将要实现哪个接口,具体地实现接口中方法所规定的功能接口,具体地实现接口中方法所规定的功能l修饰符class 类名 implements,l说明:说明:l如果某个类实现了
49、接口,这个类就可以访问接口中的常量 l类在实现方法时必须类在实现方法时必须使用修饰符publicl如果实现某个接口的类如果实现某个接口的类不是不是abstractabstract的抽象类的抽象类,则在类的定,则在类的定义部分必须为义部分必须为所有抽象方法定义所有抽象方法定义方法体方法体l如果实现某接口的类如果实现某接口的类是是abstractabstract的的抽象类,则在类的定义部抽象类,则在类的定义部分可以不实现接口的所有方法分可以不实现接口的所有方法10/24/202252举例:接口的定义与简单实现 interface CalArea double pi=3.14;double cal(
50、double r);class a implements CalArea public double cal(double r)return pi*r*r ;10/24/202253课堂实践l定义接口定义接口ShapeShape,其中包含方法,其中包含方法double double getPeremetergetPeremeter()()求周长求周长,double,double getAreagetArea()()求面积求面积l定义一个矩形类,实现此接口,并自行扩充成员变量和方定义一个矩形类,实现此接口,并自行扩充成员变量和方法,定义一个方法一次直接显示长和宽、周长和面积。法,定义一个方法一次