《抽象类和接口》PPT课件.ppt

上传人:小飞机 文档编号:5515609 上传时间:2023-07-15 格式:PPT 页数:40 大小:327.50KB
返回 下载 相关 举报
《抽象类和接口》PPT课件.ppt_第1页
第1页 / 共40页
《抽象类和接口》PPT课件.ppt_第2页
第2页 / 共40页
《抽象类和接口》PPT课件.ppt_第3页
第3页 / 共40页
《抽象类和接口》PPT课件.ppt_第4页
第4页 / 共40页
《抽象类和接口》PPT课件.ppt_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《《抽象类和接口》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《抽象类和接口》PPT课件.ppt(40页珍藏版)》请在三一办公上搜索。

1、第10章 抽象类和接口,10.1 引言10.2 抽象类10.3 日历类Calendar和公历类GregorianCanlendar10.4 接口10.5 将基本数据类型值处理为对象10.6 基本类型和包装类之间的自动转换,10.1 引言,抽象类:将父类设计得非常抽象,让它包含所有子类的共同属性、方法,以至于它没有具体的实例。接口:实现多重继承,10.2 抽象类,存在意义抽象类是类层次中较高层次的概括,抽象类的作用是让其他类来继承它的抽象化的特征抽象类中可以包括被它的所有子类共享的公共行为抽象类中可以包括被它的所有子类共享的公共属性在程序中不能用抽象类作为模板来创建对象;在用户生成实例时强迫用户

2、生成更具体的实例,保证代码的安全性,抽象类的格式abstract class 类名 抽象方法的语法形式为abstract(.);抽象方法的优点隐藏具体的细节信息,所有的子类使用的都是相同的方法头,其中包含了调用该方法时需要了解的全部信息强迫子类完成指定的行为,规定其子类需要用到的“标准”行为通用程序设计(一般程序设计),例1,问:抽象类GeometricObject中的抽象方法可否删除?,各种图形都需要实现绘图方法,可在抽象父类中声明一个draw抽象方法abstract class GraphicObject int x,y;void moveTo(int X,int Y).abstract

3、void draw();然后在每一个子类中重写draw方法,例如:class Circle extends GraphicObject void draw().class Rectangle extends GraphicObject void draw().,public class Test public static void main()GraphicObject ob1=Cirlce();GraphicObject ob2=Cirlce();ob1.draw();ob2.draw();,例2,将所有图形的公共属性及方法抽象到抽象类Shape。再将2D及3D对象的特性分别抽取出来,形成

4、两个抽象类TwoDimensionalShape及ThreeDimensionalShape2D图形包括Circles、Triangles、Rectangles和Squares3D图形包括Cube、Sphere、或Tetrahedron在UML中,抽象类的类名为斜体,以与具体类相区别,例3,贷款(Loan)分为许多种类,如租借(Lease)、抵押(Mortgage)、房屋贷款(HouseLoan)、汽车贷款(CarLoan)等将Loan声明为抽象类,并指定所有的子类对象都应具有的行为,如计算月还款值(calculateMonthlyPayment),还款(makePayment),取得客户信息

5、(getClientInfo),其中前两个因贷款种类不同计算方法也不同,可声明为抽象方法,Loan的所有子类都必须对这两个抽象方法进行重写public abstract class Loan public abstract float calculateMonthlyPayment();public abstract void makePayment(float amount);public Client getClientInfo(),例4,注意:1 抽象类前需加修饰符abstract2 不能使用new方法进行实例化,故,抽象类必须被继承3 抽象类可包含常规类能够包含的任何东西,例如构造方法

6、等非抽象方法,其构造方法在子类的构造方法中调用4 没有抽象方法的类也可被声明为抽象类5 包含抽象方法的类必须声明为抽象类6 若子类没有实现父类的全部抽象方法,它也必须声明为抽象类7 抽象方法必须是非静态的,子类中的实现也必须是非静态的,否则无法覆盖8 即便父类是具体类,子类也可能是抽象类9 抽象类虽然无法用new实例化,但可以用作数据类型例:抽象类 x;抽象类 a5=new 抽象类5;x=new 子类();ai=new 子类();,10.3 日历类Calendar和公历类GregorianCanlendar,10.4 接口,Java不支持多重继承,是为了使语言本身结构简单,层次清楚,易于管理,

7、更安全可靠,避免冲突。但同时也就限制了语言的功能。为了在实际应用中借助多重继承的功能,共享一些公用的常量和一些常用的方法,Java使用接口来弥补。一个类可以实现多个接口,达到多重继承的效果。接口可以看作是常量和没有实现的方法的集合。接口与抽象类相似,接口中的方法只是做了声明,而没有定义任何具体的操作方法。,声明接口的格式,修饰符 interface 接口名/*常量*/*抽象方法*/,方法自动为public abstract,变量自动为public static final,public interface Comparablepublic int compareTo(Object);,例如,p

8、ackage java.lang,public final class String extends Object implements Serializable,Comparable,CharSequencepublic int compareTo(String anotherString),public class Date extends Object implements Serializable,Cloneable,Comparablepublic int compareTo(DateanotherDate),类和都实现了Comparable接口,右边的表达式都成立,s instan

9、ceof Strings instanceof Objects instanceof Comparable,pareTo(“china”)返回0“china”.compareTo(s)返回0“china”.compareTo(“japan”)返回-7,public class Maxpublic static Comparable max(Comparable o1,Comparable o2)if(pareTo(o2)0)return o1;else return o2;,应用:例如 String maxString=(String)Max.max(s,”japan”),若String s=

10、“china”;应用例如,P277的图a和图b问:为什么说图a更鲁棒?,接口与抽象类一样都是定义多个类的共同属性使抽象的概念更深入了一层,是一个“纯”抽象类,它只提供一种形式,并不提供实现允许创建者规定方法的基本形式:方法名、参数列表以及返回类型,但不规定方法主体。方法自动为public abstract也可以包含基本数据类型的数据成员,但它们都自动为public static final,接口允许我们在看起来不相干的对象之间定义共同行为,接口的作用是面向对象的一个重要机制实现多继承,同时免除C+中的多继承那样的复杂性建立类和类之间的“协议”把类根据其实现的功能来分别代表,而不必顾虑它所在的类

11、继承层次;这样可以最大限度地利用动态绑定,隐藏实现细节实现不同类之间的常量共享,接口的语法声明格式为public interface 接口名称 extends 父接口名/方法的原型声明或静态常量接口的数据成员一定要赋初值,且此值将不能再更改,允许省略public static final关键字接口中的方法必须是“抽象方法”,不能有方法体,允许省略public abstract关键字,接口也可以继承,接口的实现,接口的实现接口不能用new运算符直接产生对象,必须利用其特性设计新的类,再用新类来创建对象利用接口设计类的过程,称为接口的实现,使用implements关键字语法如下public cla

12、ss 类名称 implements 接口名称/*Bodies for the interface methods*/*Own data and methods.*/必须实现接口中的所有方法实现接口的方法必须声明成public,例1,声明一个接口Shape2D,可利用它来实现二维的几何形状类Circle和Rectangle把计算面积的方法声明在接口里pi值是常量,把它声明在接口的数据成员里interface Shape2D/声明Shape2D接口 final double pi=3.14;/数据成员一定要初始化 public abstract double area();/抽象方法在接口的声明中

13、,允许省略一些关键字,也可声明如下interface Shape2D double pi=3.14;double area();,例2,class Circle implements Shape2D double radius;public Circle(double r)radius=r;public double area()return(pi*radius*radius);,class Rectangle implements Shape2D int width,height;public Rectangle(int w,int h)width=w;height=h;public dou

14、ble area()return(width*height);,声明Circle与Rectangle两个类实现Shape2D接口,测试类public class InterfaceTester public static void main(String args)Rectangle rect=new Rectangle(5,6);System.out.println(Area of rect=+rect.area();Circle cir=new Circle(2.0);System.out.println(Area of cir=+cir.area();运行结果Area of rect=3

15、0.0Area of cir=12.56,声明接口类型的变量,并用它来访问对象public class VariableTester public static void main(String args)Shape2D var1,var2;var1=new Rectangle(5,6);System.out.println(Area of var1=+var1.area();var2=new Circle(2.0);System.out.println(Area of var2=+var2.area();输出结果Area of var1=30.0Area of var2=12.56,多重继承

16、Java的设计以简单实用为导向,不允许一个类有多个父类但允许一个类可以实现多个接口,通过这种机制可实现多重继承一个类实现多个接口的语法如下类修饰符 class 类名称 implements 接口1,接口2,Car类可以实现接口Insurable,Drivable,Sellablepublic class Car implements Insurable,Drivable,Sellable.,例3,声明Circle类实现接口Shape2D和ColorShape2D具有pi与area()方法,用来计算面积Color则具有setColor方法,可用来赋值颜色通过实现这两个接口,Circle类得以同时

17、拥有这两个接口的成员,达到了多重继承的目的interface Shape2D/声明Shape2D接口 final double pi=3.14;/数据成员一定要初始化 public abstract double area();/抽象方法interface Color void setColor(String str);/抽象方法,例4,class Circle implements Shape2D,Color/实现Circle类 double radius;String color;public Circle(double r)/构造方法 radius=r;public double are

18、a()/定义area()的处理方式 return(pi*radius*radius);public void setColor(String str)/定义setColor()的处理方式 color=str;System.out.println(color=+color);,测试类public class MultiInterfaceTester public static void main(String args)Circle cir;cir=new Circle(2.0);cir.setColor(blue);System.out.println(Area=+cir.area();输出结

19、果color=blueArea=12.56,接口的多重扩展接口可通过扩展的技术派生出新的接口原来的接口称为基本接口(base interface)或父接口(super interface)派生出的接口称为派生接口(derived interface)或子接口(sub interface)派生接口不仅可以保有父接口的成员,同时也可加入新成员以满足实际问题的需要实现接口的类也必须实现此接口的父接口接口扩展的语法interface 子接口的名称 extends 父接口1,父接口2,,接口的扩展,public interface I1public void m1();,public interface

20、 I2 extends I1public void m2();,public interface I3 public void m3();,public class A implements I2,I3 public void m1()/implementspublic void m2()/implementspublic void m3()/implements,I1.java,I2.java,I3.java,A.java,当一个类实现多个接口时,这个类可以是多种类型的实例。如下列表达式都返回trueA a=new A();a instanceof I1a instanceof I2a in

21、stanceof I3a instanceof ObjectI1 i1=new A();I2 i2=new A();I3 i3=new A();,Cloneable接口,Java定义了Cloneable接口,任何想实现克隆功能的类必须实现该接口,同时改写从Object类继承的clone方法,并将访问属性改为public但Cloneable接口为空接口,其定义为package java.lang;public interface Cloneable 空接口称为标记接口(markup interface)空接口唯一作用:允许用instanceof检查对象的类型:if(obj instanceof

22、Cloneable),protected native Object clone()throws CloneNotSupportedException;,类中有,class A implements Cloneable protected A clone()try return(A)super.clone();catch(CloneNotSupportedException ex)return null;public class T public static void main(Strings)A a1=new A();A a2=a1.clone();,想用clone类A需要:(1)实现Cl

23、oneable(2)覆盖Object中的clone()方法至少是protected返回的是A,是Object的子类,也能覆盖,class A implements Cloneable protected A clone()throws CloneNotSupportedException return(A)super.clone();public class T public static void main(Strings)throws CloneNotSupportedException A a1=new A();A a2=a1.clone();,class Bclass A extend

24、s B implements Cloneable protected A clone()throws CloneNotSupportedException return(A)super.clone();public class T public static void main(Strings)throws CloneNotSupportedException B a1=new A();A a2=a1.clone();,编译错。B类没有实现Cloneable接口,没有重写clone()方法,何时用抽象类?何时用接口?,抽象类:“强是一种关系”类继承接口:“弱是一种关系”不同类的对象共有的属性、

25、行为,动物,哺乳动物,非哺乳动物,电器,家用电器,非家用电器,寿命,P278,接口与抽象类,10.5 将基本数据类型值处理为对象,Double dObject=new Double(5.0);Integer iObject=new Integer(1);long l=dObject.longValue();int i=iObject.intValue();,Comparable,Object,Number,Character,Boolean,Double,Float,Long,Integer,Short,Byte,10.6 基本类型和包装类之间的自动转换,Integer intObject=2

26、;等价于 Integer intObject=new Integer(2);Integer iArray=1,2,3;自动执行了Integer iObject=Integer.valueOf(“12”);/字符串变整数并构建对象System.out.println(iArray0)中,自动将iArray0转换为int类型Integer.parseInt(“12”)/返回12,字符串转换成整数Double.parseDouble(“12.3”)/返回12.3,字符串转换成double型,iArray0=new Integer(1);iArray1=new Integer(2);iArray2=new Integer(3);,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号