资源描述
JavaJava语言程序设计语言程序设计-抽象抽象类和接口类和接口-(1)-(1)内内 容容抽象类抽象类通用超类通用超类对象的类型识别对象的类型识别对象的类型转换对象的类型转换接口接口嵌套类嵌套类2Java Programming抽象类抽象类抽象类抽象类(abstract classabstract class)使用关键字使用关键字abstractabstract定义定义不能被实例化的类不能被实例化的类public abstract class Animal Animal aAnimal=new Animal();错错3Java Programming抽象方法抽象方法抽象方法抽象方法(abstract methodabstract method)声明了,但没有被实现的方法声明了,但没有被实现的方法没有方法体没有方法体抽象类通过抽象方法为其子类定义公共接口抽象类通过抽象方法为其子类定义公共接口迟早要派生出一个非抽象的子类,实现了全部抽象方法,从而生成迟早要派生出一个非抽象的子类,实现了全部抽象方法,从而生成该类型的对象该类型的对象抽象方法不能指定为抽象方法不能指定为private或或static或或final因为此类方法不能在子类中重新定义,即不能被覆盖因为此类方法不能在子类中重新定义,即不能被覆盖public abstract class Animal public abstract void sound();4Java Programming抽象类与抽象方法抽象类与抽象方法抽象类可以不包含抽象方法抽象类可以不包含抽象方法使用使用abstract就可以定义抽象类就可以定义抽象类包含抽象方法的类一定是抽象类包含抽象方法的类一定是抽象类抽象方法可以是在自己内部声明的抽象方法可以是在自己内部声明的抽象类的子类也可以是抽象类抽象类的子类也可以是抽象类也可以是从超类继承的也可以是从超类继承的抽象类的子类也可以不实现继承的抽象方法抽象类的子类也可以不实现继承的抽象方法5Java Programming抽象类与多态抽象类与多态从从 类类 的角度分离接口和实现的角度分离接口和实现基类定义公共接口基类定义公共接口子类实现该接口子类实现该接口sound()Animalsound()Dogsound()Catsound()Duck定义了一个公共接口定义了一个公共接口实现公共接口实现公共接口6Java Programming通用超类通用超类通用超类通用超类java.lang.Objectjava.lang.Object是所有定义的类的超类是所有定义的类的超类不需要明确指定不需要明确指定ObjectObject类型的变量可以存储任何类型对象的引用类型的变量可以存储任何类型对象的引用Object obj;Object objArray;Object7Java ProgrammingObjectObject的方法成员的方法成员ObjectObject只有下面的方法成员只有下面的方法成员被所有的类继承被所有的类继承public String toString()/返回描述对象的返回描述对象的String对象对象public boolean equals(Object obj)/比较两对象的引用比较两对象的引用public int hashCode()/计算对象的散列码,并以计算对象的散列码,并以int类型返回类型返回public final Class getClass()/返回一个返回一个Class对象,以识别对象的类对象,以识别对象的类public final void notify()/唤醒一个与当前对象关联的线程唤醒一个与当前对象关联的线程public final void notifyAll()/唤醒所有与当前对象关联的线程唤醒所有与当前对象关联的线程public final void wait()/导致一个线程等待当前对象中发生的变化导致一个线程等待当前对象中发生的变化protected Object clone()/复制当前对象复制当前对象protected void finalize()/在销毁对象时被调用,用于清理工作在销毁对象时被调用,用于清理工作8Java ProgrammingObjectObject的的toString()toString()方法方法toString()toString()方法方法举例举例注释注释Animal的的toString()方法方法Animal继承继承Object的的toString()方法方法编译运行编译运行TestPolymorphism可以看到可以看到Object的的toString()方方法如何输出对象法如何输出对象Dog19821f对象的类名对象的类名对象的散列码对象的散列码9Java Programming确定对象的类型确定对象的类型ClassClass类型的对象类型的对象getClass()方法会返回一个方法会返回一个Class类型的对象类型的对象用来识别一个对象的类型用来识别一个对象的类型class TryClass public static void main(String args)System.out.println(new Dog(小黑小黑).getClass().getName();Object str=A String;System.out.println(str.getClass().getName();Dogjava.lang.String类类Class的成员,返回完整的成员,返回完整的类名(带包名)的类名(带包名)Class对象返回对象实际对对象返回对象实际对应的类应的类10Java ProgrammingClassClass对象对象ClassClass类型的对象类型的对象在系统装载程序(类文件)时自动为每个类创建在系统装载程序(类文件)时自动为每个类创建Class对象对象不能自己创建不能自己创建Class对象对象,因为类,因为类Class没有提供构造函数没有提供构造函数class TryClass public static void main(String args)throws ClassNotFoundException System.out.println(Dog.class);System.out.println(int.class);System.out.println(Integer.class.getName();System.out.println(Class.forName(java.lang.String);class Dogintjava.lang.Integerclass java.lang.String获得类的获得类的ClassClass对象对象 .class .class Class.forName()11Java ProgrammingClassClass对象对象利用利用ClassClass对象检测对象的类型对象检测对象的类型每个类都有每个类都有唯一的唯一的Class对象对象Animal pet=new Duck(“小鸭小鸭”);if(pet.getClass()=Duck.class)两者引用同一个对象两者引用同一个对象12Java Programminginstanceofinstanceof运算符运算符利用利用instanceofinstanceof运算符检测对象的类型运算符检测对象的类型判断一个对象是否是某一个类的实例判断一个对象是否是某一个类的实例Spaniel obj=new Spaniel(小狗小狗);if(obj instanceof Animal)System.out.println(该对象是该对象是Animal的实例的实例);if(obj instanceof Dog)System.out.println(该对象是该对象是Dog的实例的实例);if(obj instanceof Spaniel)System.out.println(该对象是该对象是Spaniel的实例的实例);该对象是该对象是Animal的实例的实例该对象是该对象是Dog的实例的实例该对象是该对象是Spaniel的实例的实例13Java Programming对象的复制对象的复制用从用从ObjectObject继承的方法继承的方法clone()clone()复制对象复制对象要求被复制对象的类允许被复制要求被复制对象的类允许被复制该类必须实现该类必须实现Cloneable接口接口生成一个与当前对象类型相同的新的对象生成一个与当前对象类型相同的新的对象新对象中的每个成员域都设置成与当前对象对应的成员域相同的值新对象中的每个成员域都设置成与当前对象对应的成员域相同的值如果成员域是引用类型,那么他所引用的对象并不被复制如果成员域是引用类型,那么他所引用的对象并不被复制举例举例让类让类Dog实现实现Cloneable接口,使其对象可被复制接口,使其对象可被复制public class Dog extends Animal implements Cloneable 14Java Programming对象的复制举例对象的复制举例举例举例定义类定义类TryClone创建一个创建一个Dog对象对象调用该对象的调用该对象的Clone()方法复制一个方法复制一个Dog对象对象class TryClone public static void main(String args)throws CloneNotSupportedException Dog aDog=new Dog(白雪白雪);System.out.println(创建了一个对象:创建了一个对象:n+aDog);Dog bDog=(Dog)aDog.clone();System.out.println(复制了一个对象:复制了一个对象:n+bDog);15Java Programming对象的类型强制转换对象的类型强制转换可以把一个对象的类型强制转换为另一种类型可以把一个对象的类型强制转换为另一种类型当前对象的实际类型和新类型必须位于相同的派生类层次结构中当前对象的实际类型和新类型必须位于相同的派生类层次结构中一个是另一个的超类一个是另一个的超类AnimalCatDogDuckObjectSpaniel向上类型转换向上类型转换向下类型转换向下类型转换对象的引用对象的引用16Java Programming向上类型转换向上类型转换向上类型转换(向上类型转换(upupcastcastinging)需要执行多态的方法时,把对象的引用存储在基类类型的变量中需要执行多态的方法时,把对象的引用存储在基类类型的变量中忽略特定类型的细节忽略特定类型的细节把可能拥有多个子类的对象传递给方法把可能拥有多个子类的对象传递给方法编译器会在必要时为对象自动插入强制类型转换编译器会在必要时为对象自动插入强制类型转换Spaniel aPet=new Spaniel(“白雪白雪”);Animal theAnimal=(Animal)aPet;可以省略不写可以省略不写17Java Programming向下类型转换向下类型转换向下类型转换(向下类型转换(downcasting)为了执行特定类的方法为了执行特定类的方法扩展了类,打算向下类型转换访问扩展部分扩展了类,打算向下类型转换访问扩展部分Java在运行时用在运行时用instanceof进行类型转换检查进行类型转换检查要转换到的类必须是该对象的实际类型或超类要转换到的类必须是该对象的实际类型或超类Dog aDog=(Dog)theAnimal;Dog是是theAnimal对象的超类对象的超类18Java Programming对象的类型强制转换举例对象的类型强制转换举例举例举例修改类修改类Duck的定义,增加方法的定义,增加方法layEgg()该方法是该方法是Duck类特有的类特有的public class Duck extends Animal public void layEgg()System.out.println(下蛋下蛋);19Java Programming对象的类型强制转换举例对象的类型强制转换举例举例举例定义类定义类TestCastclass TestCast public static void main(String args)Duck aDuck=new Duck(唐纳唐纳,美国鸭美国鸭);Animal aPet=aDuck;aPet.layEgg();/不能编译不能编译 (Duck)aPet).layEgg();此处只能调用此处只能调用Animal中声明中声明的(多态)方法的(多态)方法20Java Programming对象的类型强制转换举例对象的类型强制转换举例分析分析layEgg()sound()Animalsound()Dogsound()Catsound()DuckAnimal aPet;可以访问可以访问Animal定定义的公共接口义的公共接口(Duck)aPet).layEgg();可以访问可以访问Duck定定义的扩展接口义的扩展接口扩展接口扩展接口公共接口公共接口21Java Programming使用使用finalfinal修饰符修饰符finalfinal此物不准动此物不准动修饰数据成员以固定其值修饰数据成员以固定其值修饰方法成员以阻止被子类中的方法覆盖修饰方法成员以阻止被子类中的方法覆盖修饰类以阻止派生出子类修饰类以阻止派生出子类22Java Programming接口接口接口接口(interface)接口声明了一组方法,表示一个特定的公共接口接口声明了一组方法,表示一个特定的公共接口这些方法都没有定义方法体,即抽象的这些方法都没有定义方法体,即抽象的任何类都可以实现任何类都可以实现(implementimplement)某个接口某个接口实现该接口的类要实现接口中的所有方法,即定义该方法的主体实现该接口的类要实现接口中的所有方法,即定义该方法的主体使用该接口类型的变量来多态调用其中的方法使用该接口类型的变量来多态调用其中的方法举例举例定义接口定义接口StockWatcher,股票观察员,股票观察员声明方法声明方法valueChanged(),某支股票的价格改变了,某支股票的价格改变了public interface StockWatcher void valueChanged(String tickerSymbol,double newValue);23Java Programming接口与抽象类接口与抽象类接口好似一个纯抽象类接口好似一个纯抽象类接口与抽象类的区别接口与抽象类的区别接口不能实现任何方法,而抽象类可以接口不能实现任何方法,而抽象类可以类可以实现许多接口,但只能有一个直接超类类可以实现许多接口,但只能有一个直接超类接口不是类层次结构的一部分,不相关的类可以实现相同的接口接口不是类层次结构的一部分,不相关的类可以实现相同的接口24Java Programming定义接口定义接口定义接口定义接口存储在存储在.java文件中,编译生成文件中,编译生成.class文件文件例如例如StockWatcher.javaStockWatcher.java,编译后生成,编译后生成StockWatcher.classStockWatcher.classpublic interface StockWatcher /常量和方法的声明常量和方法的声明接口的头部接口的头部接口的主体接口的主体25Java Programming接口的访问属性接口的访问属性接口的访问属性接口的访问属性public 可以被任何接口和类访问可以被任何接口和类访问空空 可以被同一包中的接口和类访问可以被同一包中的接口和类访问26Java Programming接口的主体接口的主体接口的主体接口的主体包含所有方法和常量的声明包含所有方法和常量的声明所有方法被隐式的声明为所有方法被隐式的声明为 public和和abstract类型类型常量被隐式的声明为常量被隐式的声明为 public、static和和final类型类型public interface StockWatcher String sunTicker=SUN;String oracleTicker=ORACLE;String ciscoTicker=CISCO;void valueChanged(String tickerSymbol,double newValue);不需要明确指定不需要明确指定必须指定初值必须指定初值27Java Programming接口的实现接口的实现类实现接口类实现接口使用关键字使用关键字implements类继承了接口声明的常量类继承了接口声明的常量类要么实现接口的所有方法,要么就是抽象类类要么实现接口的所有方法,要么就是抽象类类必须为实现的方法指定类必须为实现的方法指定public访问属性访问属性因为接口中的方法都是因为接口中的方法都是public的的public class StockWatcherClass implements StockWatcher public void valueChanged(String tickerSymbol,double newValue)28Java Programming接口的实现接口的实现类实现多个接口类实现多个接口类可以实现多个接口类可以实现多个接口(Java的多重继承)的多重继承)接口名用逗号隔开接口名用逗号隔开public class StockWatcherClassimplements StockWatcher,Cloneable 29Java Programming接口的维护接口的维护接口定义好之后,最好不要做修改接口定义好之后,最好不要做修改一旦被修改,将使得已实现该接口的类无效一旦被修改,将使得已实现该接口的类无效可以通过创建新的接口来扩展可以通过创建新的接口来扩展public interface StockWatcher String sunTicker=SUN;String oracleTicker=ORACLE;String ciscoTicker=CISCO;void valueChanged(String tickerSymbol,double newValue);double currentValue(String tickerSymbol);public interface StockTracker extends StockWatcher double currentValue(String tickerSymbol);30Java Programming接口的扩展接口的扩展接口的扩展接口的扩展在一个接口的基础上定义新的接口在一个接口的基础上定义新的接口派生派生扩展后的接口从原接口处获得全部常量和方法扩展后的接口从原接口处获得全部常量和方法接口的多重继承接口的多重继承一个接口可以继承多个其他接口的成员一个接口可以继承多个其他接口的成员注意:一个接口中声明的方法与继承的方法中如果两个方法的签注意:一个接口中声明的方法与继承的方法中如果两个方法的签名相同,那么其返回对象类型也必须相同。名相同,那么其返回对象类型也必须相同。public interface MyStockWatcherextends StockWatcher,Cloneable 31Java Programming接口的使用接口的使用将接口作为类型使用将接口作为类型使用定义一个新的接口,就是定义了一种新的类型定义一个新的接口,就是定义了一种新的类型能够通过一组实现相同接口的类产生多态能够通过一组实现相同接口的类产生多态public class StockMonitor public void watchStock(StockWatcher watcher,String tickerSymbol,double delta)一个对象有多种类型(名称)一个对象有多种类型(名称)类名:自身类,超类类名:自身类,超类接口名:自身类实现的接口,超类实现的接口接口名:自身类实现的接口,超类实现的接口实现了实现了StockWatcher接口的任何类的接口的任何类的对象对象32Java Programming接口的使用举例接口的使用举例举例举例用用接口接口RemoteControl定义了一组家用电器应该具备的遥控操定义了一组家用电器应该具备的遥控操作作定义定义类类TV、VCR分别表示电视机和录像机分别表示电视机和录像机让类让类TV和和VCR实现接口实现接口RemoteControl那么就可以定义那么就可以定义RemoteControl类型的类型的变量变量rc引用引用TV和和VCR对对象象变量变量rc类似一个通用遥控器,用它可以对类似一个通用遥控器,用它可以对TV和和VCR对象(或任何对象(或任何实现了实现了RemoteControl接口的类的对象)进行遥控操作接口的类的对象)进行遥控操作33Java Programming嵌套类嵌套类嵌套类嵌套类(nested classnested class)在另一个类的内部定义的类在另一个类的内部定义的类嵌套类的内部还可以定义类嵌套类的内部还可以定义类举例举例嵌套类嵌套类InSide的类文件为的类文件为OutSide$InSide.classpublic class OutSide public class InSide 顶层类:不是嵌套类。顶层类:不是嵌套类。它也是它也是InSide的外部类,的外部类,可以直接引用类名可以直接引用类名InSide。是其外部类的成员。是其外部类的成员。可以直接访问外部类中定可以直接访问外部类中定义的成员。义的成员。其外部引用名是:其外部引用名是:OutSide.InSide34Java Programming非静态嵌套类的对象非静态嵌套类的对象创建非静态嵌套类的对象创建非静态嵌套类的对象在外部类的外部在外部类的外部public class TryNestedClass public static void main(String args)OutSide outer=new OutSide();/error:OutSide.InSide inner=new OutSide.InSide();OutSide.InSide inner=outer.new InSide();没有生成没有生成InSide对象对象生成与生成与OutSide对象对象outer相关联的相关联的InSide对象对象35Java Programming非静态嵌套类的对象非静态嵌套类的对象创建非静态嵌套类的对象创建非静态嵌套类的对象在外部类的内部在外部类的内部不能在外部类的静态方法中使用不能在外部类的静态方法中使用关于非静态嵌套类关于非静态嵌套类不能定义静态成员不能定义静态成员非静态类对象一定与一个外部类对象相关联非静态类对象一定与一个外部类对象相关联被称为内部类被称为内部类(inner class)InSide inner=new InSide();36Java Programming静态嵌套类静态嵌套类静态嵌套类静态嵌套类用用static可以定义静态成员可以定义静态成员在静态方法中不能访问外部类的非静态成员在静态方法中不能访问外部类的非静态成员public class OutSide public static class StaticInSide 37Java Programming静态嵌套类的对象静态嵌套类的对象创建静态嵌套类的对象创建静态嵌套类的对象在外部类的外部在外部类的外部public class TryNestedClass public static void main(String args)OutSide.StaticInSide sinner=new OutSide.StaticInSide();生成与生成与OutSide对象没有对象没有关联的关联的InSide对象对象38Java Programming嵌套类的使用嵌套类的使用何时使用嵌套类何时使用嵌套类一般用于定义与其外部类的对象有很强关联的对象一般用于定义与其外部类的对象有很强关联的对象在外部类中对相关联的类进行分组在外部类中对相关联的类进行分组39Java Programming局部嵌套类局部嵌套类局部嵌套类局部嵌套类在方法中定义的类在方法中定义的类只能在该类的定义所在的方法中创建局部嵌套类的对象只能在该类的定义所在的方法中创建局部嵌套类的对象使用使用例如例如GUI应用程序中的事件监听器类应用程序中的事件监听器类例例5-1340Java Programming接口定义中的嵌套类接口定义中的嵌套类在接口定义中的定义的类在接口定义中的定义的类隐含定义为隐含定义为public和和static类型类型实现接口的类与该接口的嵌套类没有直接联系实现接口的类与该接口的嵌套类没有直接联系只需要实现接口声明的方法只需要实现接口声明的方法但可以创建嵌套类的对象但可以创建嵌套类的对象interface Port class Info 其类型名:其类型名:Port.Info41Java Programming匿名类匿名类匿名类匿名类(anonymous classanonymous class)何时需要何时需要仅仅为了创建一个对象而定义类仅仅为了创建一个对象而定义类这个对象的唯一作用就是将它作为实参传递给方法这个对象的唯一作用就是将它作为实参传递给方法 例例5-14该类扩展已存在的类或实现接口该类扩展已存在的类或实现接口可以包含数据成员和方法,但不包含构造函数可以包含数据成员和方法,但不包含构造函数public void tryAnonymousClass()watchStock(new StockWatcher()public void valueChanged(String s,double v);,SUN,12.0);如果是扩展类则根据类如果是扩展类则根据类的构造函数给定参数的构造函数给定参数42Java Programming小小 结结面向对象编程的三大特征面向对象编程的三大特征抽象抽象继承继承多态多态OOP抽象抽象继承继承多态多态多样化多样化重用重用类,封装类,封装43Java Programming进入夏天,少不了一个热字当头,电扇空调陆续登场,每逢此时,总会想起进入夏天,少不了一个热字当头,电扇空调陆续登场,每逢此时,总会想起那一把蒲扇。蒲扇,是记忆中的农村,夏季经常用的一件物品。记忆中的故那一把蒲扇。蒲扇,是记忆中的农村,夏季经常用的一件物品。记忆中的故乡,每逢进入夏天,集市上最常见的便是蒲扇、凉席,不论男女老少,个个手持乡,每逢进入夏天,集市上最常见的便是蒲扇、凉席,不论男女老少,个个手持一把,忽闪忽闪个不停,嘴里叨叨着一把,忽闪忽闪个不停,嘴里叨叨着“怎么这么热怎么这么热”,于是三五成群,聚在大树,于是三五成群,聚在大树下,或站着,或随即坐在石头上,手持那把扇子,边唠嗑边乘凉。孩子们却在周下,或站着,或随即坐在石头上,手持那把扇子,边唠嗑边乘凉。孩子们却在周围跑跑跳跳,热得满头大汗,不时听到围跑跑跳跳,热得满头大汗,不时听到“强子,别跑了,快来我给你扇扇强子,别跑了,快来我给你扇扇”。孩。孩子们才不听这一套,跑个没完,直到累气喘吁吁,这才一跑一踮地围过了,这时子们才不听这一套,跑个没完,直到累气喘吁吁,这才一跑一踮地围过了,这时母亲总是,好似生气的样子,边扇边训,母亲总是,好似生气的样子,边扇边训,“你看热的,跑什么?你看热的,跑什么?”此时这把蒲扇,此时这把蒲扇,是那么凉快,那么的温馨幸福,有母亲的味道!蒲扇是中国传统工艺品,在是那么凉快,那么的温馨幸福,有母亲的味道!蒲扇是中国传统工艺品,在我国已有三千年多年的历史。取材于棕榈树,制作简单,方便携带,且蒲扇的表我国已有三千年多年的历史。取材于棕榈树,制作简单,方便携带,且蒲扇的表面光滑,因而,古人常会在上面作画。古有棕扇、葵扇、蒲扇、蕉扇诸名,实即面光滑,因而,古人常会在上面作画。古有棕扇、葵扇、蒲扇、蕉扇诸名,实即今日的蒲扇,江浙称之为芭蕉扇。六七十年代,人们最常用的就是这种,似圆非今日的蒲扇,江浙称之为芭蕉扇。六七十年代,人们最常用的就是这种,似圆非圆,轻巧又便宜的蒲扇。蒲扇流传至今,我的记忆中,它跨越了半个世纪,圆,轻巧又便宜的蒲扇。蒲扇流传至今,我的记忆中,它跨越了半个世纪,也走过了我们的半个人生的轨迹,携带着特有的念想,一年年,一天天,流向长也走过了我们的半个人生的轨迹,携带着特有的念想,一年年,一天天,流向长长的时间隧道,袅长的时间隧道,袅结束
展开阅读全文