资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,10/26/2014,#,抽象类和接口,Abstract Class and Interface,学习目标,设计和使用抽象类,(14.2),使用,Calendar,类和,GregorianCalendar,类处理日历,(14.3),使用接口指定对象共有的行动(,14.4,),定义接口以及实现接口的类,(14.4),使用,Comparable,接口定义自然顺序,(14.5),使用,ActionListener,接口实现对象对动作事件的监听(,14.6),使用,Cloneable,接口使对象成为可克隆的(,14.7,),探究抽象类和接口的相同点和不同点(,14.8,),使用包装类创建基本类型值对象(,14.9),创建一个通用的排序方法(,14.10,),使用基本类型与包装类类型之间的自动转化来简化程序设计(,14.11,),使用,BigInteger,和,BigDecimal,类计算任意精度的大数字(,14.12,),设计,Rational,类来定义,Rational,类型(,14.13,),学习流程,设计和使用抽象类,为什么要使用抽象类?,举例:几何体类、圆类和矩形类,使用抽象类的注意点,Calendar,类和,GregorianCalendar,类处理日历,接口,接口的作用?,举例:,comparable,接口,举例:,ActionListener,接口,匿名类对象的创建,接口与抽象类区别,抽象类,Abstract Class,在继承的层次结构中,随着新子类的出现,类会变得越来越明确和具体。如果从一个子类追溯到父类,父类会变得更通用,更加不明确。,类的设计应该,确保父类包含它的子类的共同特征,。,有时,一个父类设计得非常抽象,以至于不能用它创建任何具体的对象时,这样的类称为,抽象类,(,Abstract Class),抽象类的设计,11,章父类与子类的设计,修改后父类与子类的设计,getArea(),与,getPerimeter(),都不能在父类中直接实现,因为实现取决于几何体的具体类型。,对于这样无法实现的方法,用,abstract,修饰,称为,抽象方法,。,如果类中有抽象方法,则这个类也变为,抽象类,,需要在类头用,abstract,修饰类。,public,abstract,class GeometricObject,public String toString(),return created on +dateCreated+ncolor:+color+and filled:+filled;,public,abstract,double getArea();,public,abstract,double getPerimeter();,抽象类及抽象方法的写法,抽象类的定义,添加,abstract,修饰抽象方法,添加,abstract,修饰抽象类,抽象类无法直接用,new,实例化对象,即只能使用抽象类创建子类,可以将抽象类的构造方法声明为,protected,,因为它只被子类使用。,没有,abstract,抽象方法,也可以声明为抽象类,子类继承抽象类的方法,子类继承抽象类有两种实现方法,实现父类中所有的抽象方法,可以用,new,实例化子类的对象,不实现父类抽象方法,则声明子类为,abstract,类,仍然为抽象类,无法实例化对象,抽象类,GeometricObject,为几何对象定义了共同特征(数据和方法),并且提供了正确的构造方法。因为不知道计算几何对象的面积和周长,所以,getArea(),和,getPerimeter(),定义为抽象方法,在子类中实现。,继承自抽象类的子类实现,一般子类要实现父类所有的抽象方法,使用抽象方法的好处,可以进行动态绑定,举例:写方法测试两个几何体面积是否相同。,public static boolean isSameArea(GeometricObject obj1,GeometricObject obj2),if(obj1.getArea()=obj2.getArea(),return true;,else,return false;,如果,obj2,是,Rectangle,类,则,obj2.getArea(),根据动态绑定的原则,会调用,Rectangle,重写后的,getArea,方法,如果,getArea(),没有在父类,GeometricObject,中定义,则无法调用,GeometricObject,obj2.getArea(),方法,关于抽象类的几个注意点,若类中有抽象方法,则类必须为抽象类,抽象方法不能是静态的。,即,public,static abstract,void method();,是错的。,抽象类不能使用,new,操作符来初始化。,但抽象类可以有构造方法,在子类构造时调用,没有抽象方法,一个类也可以声明为抽象类。这种类用于生成子类,父类可以是具体,子类可以是抽象的。,如,Object,是具体,但,GeometricObject,类是抽象的。,使用系统定义的,GregorianCalendar,类显示日历,GregorianCalendar,介绍,可以提取出详细的日历信息,父类,Calendar,中有一个,get(int field),方法,例:,求当前时间?,求当前月份的天数?,求今天是星期几?,接口,接口是为了定义多个类,(,特别是不相关的类,),的共同行为。,与类相似,但只包含常量和抽象方法。,public,interface,Taxable,public,static,final,double,rate=0.2;,public,abstract,double payTax();,只能是公共静态常量,一定是公共的抽象方法,接口中,public static final,以及,public abstract,可以省略。,接口继承,(interface inheritance),举例接口应用,P377,例题,定义,Edible,接口,让某些动物或水果拥有食用方法。,总结:,当一个类继承接口,(,implements,),时,该类实现接口所有抽象方法,如果类继承接口,却没有实现接口中抽象方法,则该类声明为抽象类,可以用接口作为数据类型,在使用方式上与类相同。,Comparable,接口,/This interface is defined in,/java.,lang package,package java.lang;,public interface,Comparable,public int,compareTo(Object o),;,例:要比较两个圆的大小,或者把一个圆的数组进行排序。,那圆的类必须要实现,Comparable,接口,Circle cirs=,new Circle(2),new Circle(1),new Circle(5),new Circle(4);,Arrays.,sort(cirs);,练习:写,max,()方法,找出任意两个“可比较对象”中的大者。,Cloneable,接口,经常会出现需要创建一个对象拷贝的情况。,Circle c1=new Circle(3);,Circle c2=c1;,/,不是,copy,,,c2,与,c1,指向同一对象。,Cloneable,接口是一个空接口。,一个带空体的接口称为标记接口,(marker interface),标记接口既没有常量也没有方法,只表示一个类拥有特定属性。,实现了,Cloneable,的类为可克隆的,它的对象可以使用,Object,类中定义的,clone,方法进行克隆。,Java,库中有很多类实现了,Cloneable,,如,ArrayList,Calendar,Date(,测试数组,),实现,Cloneable,接口,类继承,Cloneable,接口,覆盖,Object,类中的,clone(),方法,把,clone,方法的可见性提升至,public,Object,的,clone,方法将原始对象的每个数据域复制给目标对象。如果一个数据域是基本类型,复制的就是值。如果一个数据域 是对象,则复制的是该域的引用,(,没有真正复制到内容,这称为,shallow copy,)。如果数据域是对象,需要做深复制即,deep copy,public class Circle extends GeometricObject implements Cloneable,Override,public Object clone()throws CloneNotSupportedException,return super.clone();/,浅复制,/,深复制,Object obj=,super.clone();,(Circle)obj).setDateCreated(,new Date();,return obj;,ActionListener,接口,ActionListener,事件监听接口,实现了该接口的类可以对动作事件做处理。,1.,点击按钮,source object,,触发一个事件,事件,2.,事件,ActionEvent,是一个对象,监听器,3.,监听器对象处理,listener,这个事件,能让按钮响应事件的步骤:,1.,创建,listener,对象,且该对象必须是继承,ActionListener,接口的类的一个实例。,2.,将,listener,注册给,source object,,,source.addActionListener(listener),内部类,匿名内部类,接口与抽象类的比较,In an interface,the data must be constants;an abstract class can have all types of data.,Each method in an interface has only a signature without implementation;an abstract class can have concrete methods.,Variables,Constructors,Methods,Abstract class,No restrictions,Constructors are invoked by subclasses through constructor chaining.An abstract class cannot be instantiated using the new operator.,No restrictions.,Interface,All variables must be,public,static,final,No constructors.An interface cannot be instantiated using the new operator.,All methods must be public abstract instance methods,接口与抽象类的比较,Java,只允许单一继承类,但可以同时实现多个接口,public class,NewClass,extends,BaseClass,implements,Interface1,Interface2,/,下略,接口也可以继承,其他接口(不是类,),,这样的接口称为子接口,public interface,MyInterface,extends,Comparable,Cloneable,一个类实现了,MyInterface,则必须实现所有,Comparable,Coneable,以及,MyInterface,中定义的所有抽象方法,。,所有类共享同一个根类,Object,,但接口没有共同的根,作业,自学,14.9-14.13,实验,4 Abstract Classes and Interfaces,
展开阅读全文