《类的继承性精选文档.ppt》由会员分享,可在线阅读,更多相关《类的继承性精选文档.ppt(68页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、类的继承性类的继承性本讲稿第一页,共六十八页本讲稿第二页,共六十八页本讲稿第三页,共六十八页本讲稿第四页,共六十八页本讲稿第五页,共六十八页访问控制权限了解访问控制权限了解 本讲稿第六页,共六十八页第第3讲讲 面向对象编程(高级篇)面向对象编程(高级篇)本讲稿第七页,共六十八页 面向对象编程(基础篇)知识回顾面向对象编程(基础篇)知识回顾本讲稿第八页,共六十八页主要内容主要内容3.1 继承性继承性 3.2 多态性多态性3.3 抽象类抽象类3.4接口接口3.5内部类和匿名类内部类和匿名类3.1 继承的作用3.2 子类对象的创建3.3 在子类中访问父类的成员3.4 覆盖父类的方法本讲稿第九页,共六
2、十八页3.1.1 继承继承Person-name:String-age :String+getName():String+setName(String n):void+getAge():String+setAge(int a):voidStudent-name:String-age :String-school :String+getName():String+setName(String n):void+getAge():String+setAge(int a):void+getSchool():String+setSchool(String s):void1.模仿人类的思维方式模仿人类的思
3、维方式人类的继承性人类的继承性本讲稿第十页,共六十八页n nPersonPerson类类类类class Personclass Person private String name;private String name;private int age;private int age;public String getName()public String getName()return name;return name;public void setName(String n)public void setName(String n)name=n;name=n;public int getA
4、ge()public int getAge()return age;return age;public void setAge(int a)public void setAge(int a)age=a;age=a;n nStudentStudent类类类类class Studentclass Student private String name;private String name;private int age;private int age;private String school;private String school;public String getName()public
5、 String getName()return name;return name;public void setName(String n)public void setName(String n)name=n;name=n;public int getAge()public int getAge()return age;return age;public void setAge(int a)public void setAge(int a)age=a;age=a;public String getSchool public String getSchool return school;ret
6、urn school;public void setSchool(String s)public void setSchool(String s)school=s;school=s;本讲稿第十一页,共六十八页3.1.1 继承继承1.模仿人类的思维方式模仿人类的思维方式人类的继承性人类的继承性2.程序的代码重用性程序的代码重用性少写代码少写代码本讲稿第十二页,共六十八页继承关系格式:继承关系格式:class class 父类父类父类父类class class 子类子类子类子类 extendsextends 父类父类父类父类本讲稿第十三页,共六十八页QQ牧场的设计牧场的设计目的:了解在真实系统中进
7、行设计时如何进行继承层次的设计?本讲稿第十四页,共六十八页 找出对象的共同属性和行为找出对象的共同属性和行为 这个程序必须能够在任何时候加入新类型的动物。这个程序必须能够在任何时候加入新类型的动物。这个程序必须能够在任何时候加入新类型的动物。这个程序必须能够在任何时候加入新类型的动物。首先要辨别出所有动物都有的、抽象的共同特征,然首先要辨别出所有动物都有的、抽象的共同特征,然首先要辨别出所有动物都有的、抽象的共同特征,然首先要辨别出所有动物都有的、抽象的共同特征,然后以这些共同特征设计出能够让所有动物加以扩充的后以这些共同特征设计出能够让所有动物加以扩充的后以这些共同特征设计出能够让所有动物加
8、以扩充的后以这些共同特征设计出能够让所有动物加以扩充的类。类。类。类。考虑:考虑:这这6种动物有什么共同特点?种动物有什么共同特点?这些类型有什么相关性?这些类型有什么相关性?本讲稿第十五页,共六十八页 找出对象的共同属性和行为找出对象的共同属性和行为n n5 5个实例变量:个实例变量:个实例变量:个实例变量:picture:picture:动物动物动物动物JPEGJPEG图像的名称图像的名称图像的名称图像的名称foodfood:此动物所吃的食物:此动物所吃的食物:此动物所吃的食物:此动物所吃的食物(meat/grass)(meat/grass)hungerhunger:代表饥饿程度的:代表饥
9、饿程度的:代表饥饿程度的:代表饥饿程度的intint值。会根据动物吃了多少食物而改变。值。会根据动物吃了多少食物而改变。值。会根据动物吃了多少食物而改变。值。会根据动物吃了多少食物而改变。boundaries:boundaries:代表动物活动范围区域的长宽。代表动物活动范围区域的长宽。代表动物活动范围区域的长宽。代表动物活动范围区域的长宽。location:location:动物在活动区域中的位置。动物在活动区域中的位置。动物在活动区域中的位置。动物在活动区域中的位置。n n4 4个实例方法:个实例方法:个实例方法:个实例方法:makeNoise():makeNoise():动物发出声音的行
10、为和程序。动物发出声音的行为和程序。动物发出声音的行为和程序。动物发出声音的行为和程序。eat():eat():动物遇到食物时的行为程序。动物遇到食物时的行为程序。动物遇到食物时的行为程序。动物遇到食物时的行为程序。sleep():sleep():睡眠的行为程序。睡眠的行为程序。睡眠的行为程序。睡眠的行为程序。roam():roam():不在进食或睡眠时的行为程序。不在进食或睡眠时的行为程序。不在进食或睡眠时的行为程序。不在进食或睡眠时的行为程序。本讲稿第十六页,共六十八页 设计代表共同状态与行为的类设计代表共同状态与行为的类Animal-String pictual-String food-
11、int hunger-Position boudaries-Position locationvoid makeNoise()void eat()void sleep()void roam()LionCatTiggerHippoDogWolf本讲稿第十七页,共六十八页决决定定子子类类是是否否需需要要让让某某项项行行为为有有特特定的不同的运行方式定的不同的运行方式Animal成员变量。void makeNoise()void eat()void sleep()void roam()Lionvoid makeNoise()void eat()Catvoid makeNoise()void eat(
12、)TiggerHippoDogWolf本讲稿第十八页,共六十八页决决定定子子类类是是否否需需要要让让某某项项行行为为有有特特定的不同的运行方式定的不同的运行方式Animal成员变量。void makeNoise()void eat()void sleep()void roam()Lionvoid makeNoise()void eat()Catvoid makeNoise()void eat()Tiggervoid makeNoise()void eat()Dogvoid makeNoise()void eat()Hippovoid makeNoise()void eat()Wolfvoid
13、makeNoise()void eat()本讲稿第十九页,共六十八页寻找更多抽象化的机会寻找更多抽象化的机会Animal成员变量。void makeNoise()void eat()void sleep()void roam()Lionvoid makeNoise()void eat()Catvoid makeNoise()void eat()Tiggervoid makeNoise()void eat()Dogvoid makeNoise()void eat()Hippovoid makeNoise()void eat()Wolfvoid makeNoise()void eat()本讲稿第二
14、十页,共六十八页完成类的继承层次完成类的继承层次Animal。Lionvoid makeNoise()void eat()Catvoid makeNoise()void eat()Tiggervoid makeNoise()void eat()Dogvoid makeNoise()void eat()Hippovoid makeNoise()void eat()Wolfvoid makeNoise()void eat()Felineroam()Canineroam()本讲稿第二十一页,共六十八页完成类的继承层次完成类的继承层次寻找更多抽象化的机会寻找更多抽象化的机会决决定定子子类类是是否否需需
15、要要让让某某项项行行为为有有特特定定的的 不同的运行方式不同的运行方式 设计代表共同状态与行为的类设计代表共同状态与行为的类如何进行继承层次的设计如何进行继承层次的设计 -自下而上的设计自下而上的设计 找出对象的共同属性和行为找出对象的共同属性和行为本讲稿第二十二页,共六十八页子类对象调用成员的原则子类对象调用成员的原则AnimalmakeNoise()eat()sleep()roam()Wolfvoid makeNoise()void eat()Canineroam()创建大野狼对象Wolf w=new Wolf();调用大野狼的方法w.makeNoise();调用犬科的方法w.roam()
16、;调用动物的方法w.sleep()本讲稿第二十三页,共六十八页 添加子类的新成员添加子类的新成员 改造父类的成员改造父类的成员 继承父类的成员继承父类的成员已知父类如何进行子类设计已知父类如何进行子类设计 -自上而下的设计自上而下的设计 本讲稿第二十四页,共六十八页访问控制权限了解访问控制权限了解 本讲稿第二十五页,共六十八页 添加子类的新成员添加子类的新成员 改造父类的成员改造父类的成员 继承父类的成员继承父类的成员已知父类如何进行子类设计已知父类如何进行子类设计 -自上而下的设计自上而下的设计 本讲稿第二十六页,共六十八页3.1.2 子类对象的创建子类对象的创建 一、子类对象的实例化过程一
17、、子类对象的实例化过程二、二、super的作用的作用本讲稿第二十七页,共六十八页3.1.2 子类的创建子类的创建 一、子类对象的实例化过程一、子类对象的实例化过程class Personclass Personpublic Person()public Person()System.out.println(“System.out.println(“父类构造父类构造父类构造父类构造”)”);class Studentclass Studentpublic Student()public Student()System.out.println(“System.out.println(“子类构造子类
18、构造子类构造子类构造”)”);本讲稿第二十八页,共六十八页3.1.2 子类对象的创建子类对象的创建 一、子类对象的实例化过程一、子类对象的实例化过程public class TestDemo11public class TestDemo11public static void main(String args)public static void main(String args)Student stu=new Student();Student stu=new Student();运行结果:运行结果:?本讲稿第二十九页,共六十八页3.1.2 子类对象的创建子类对象的创建 一、子类对象的实例化
19、过程一、子类对象的实例化过程 1、先自动调用父类构造函数(父类中的无参构造函数)先自动调用父类构造函数(父类中的无参构造函数)2、然后调用子类构造函数、然后调用子类构造函数注注意意:如如果果父父类类中中有有多多个个构构造造方方法法时时,如如何何才才能能调调用用父父类类中某个特定的构造方法呢?中某个特定的构造方法呢?其其做做法法是是在在子子类类的的构构造造方方法法中中通通过过super()来来调调用用父父类特定的构造方法。类特定的构造方法。本讲稿第三十页,共六十八页3.1.2 创建子类创建子类二、二、二、二、super()super()、super()super()class Personcla
20、ss Personprivate String name;private String name;private int age;private int age;public Person()public Person()System.out.println(“System.out.println(“调用调用调用调用PersonPerson类的无参构造方法类的无参构造方法类的无参构造方法类的无参构造方法”)”);public Peron(String name,int age)public Peron(String name,int age)System.out.println(“System
21、.out.println(“调用了调用了调用了调用了PersonPerson类的有参构造方法类的有参构造方法类的有参构造方法类的有参构造方法”)”);this.name=name;this.name=name;this.age=age;this.age=age;public void show()public void show()System.out.println(“System.out.println(“姓名:姓名:姓名:姓名:”+name+”+name+”年龄:年龄:年龄:年龄:”+age);”+age);本讲稿第三十一页,共六十八页3.1.2 子类对象的创建子类对象的创建class
22、Student extends Personclass Student extends Personprivate String department;private String department;public Student()public Student()System.out.println(“Student System.out.println(“Student 无参构造无参构造”)”);public Student(String name,int age,String dep)public Student(String name,int age,String dep)super
23、(name,age);super(name,age);department=dep;department=dep;System.out.println(“System.out.println(“我是我是”+department+”+department+”的学生的学生”);”);System.out.println(“StudentSystem.out.println(“Student有参构造有参构造”)”);本讲稿第三十二页,共六十八页3.1.2 子类对象的创建子类对象的创建public class TestDemo1public class TestDemo1public static v
24、oid main(String args)public static void main(String args)Student stu1=new Student();Student stu1=new Student();Student stu2=new Student(“Student stu2=new Student(“李四李四”,23,”,23,”计算机系计算机系”);”);stu1.show();stu1.show();stu2.show();stu2.show();本讲稿第三十三页,共六十八页3.1.2 子类对象的创建子类对象的创建(1)(1)省略红色字体省略红色字体super(na
25、me,age)super(name,age),父类中的构造方法哪个会被调用?,父类中的构造方法哪个会被调用?(2)(2)子类构造方法中调用父类构造方法的子类构造方法中调用父类构造方法的super super 语句位置有没有限制语句位置有没有限制?(3)(3)如果父类中只定义了有参的构造方法,而子类的构造方法中并没有如果父类中只定义了有参的构造方法,而子类的构造方法中并没有显式的用显式的用supersuper()来调用父类中特定的构造方法,程序此时会有问()来调用父类中特定的构造方法,程序此时会有问题吗?题吗?(4)(4)找出找出thisthis和和supersuper的相同点和不同点。的相同点
26、和不同点。思考!思考!!找出继承中构造方法的调用规则找出继承中构造方法的调用规则本讲稿第三十四页,共六十八页3.1.3 3.1.3 成员变量的隐藏和方法的覆写成员变量的隐藏和方法的覆写成员变量的隐藏和方法的覆写成员变量的隐藏和方法的覆写(1)当在子类中定义的成员变量和父类中的成员变量同名同名时,此时称子类的成员变量隐藏了父类的成员变量隐藏了父类的成员变量。(2)当子类中定义了一个方法,并且这个方法的名字,返回类型,参数个数以及类型和父类的某个方法完全相同完全相同时,父类的这个方法将被隐藏,这时我们说重写了父类的方法重写了父类的方法。子类通过成员变量的隐藏和方法的重写可以把父类的状态和行为改变为
27、子类通过成员变量的隐藏和方法的重写可以把父类的状态和行为改变为自身的状态和行为。自身的状态和行为。本讲稿第三十五页,共六十八页3.1.3 3.1.3 成员变量的隐藏和方法的覆写成员变量的隐藏和方法的覆写成员变量的隐藏和方法的覆写成员变量的隐藏和方法的覆写例如下面的这段程序就是这样的情况:class SuperClass /父类 int y;void setY()y=0;class SubClass extends SuperClass int y;/父类变量y被隐藏 void setY()/重写父类的方法setY()y=1;public TestDemo3public static void
28、main(String args)SubClass ss=new SubClass();ss.setY();本讲稿第三十六页,共六十八页 子类在隐藏了父类的成员变量或重写了父类的方法后,常常还要用到父类的成员变量,或在重写的方法中使用父类中被重写的方法以简化代码的编写,这时就要访问父类的成员变量或调用父类的方法,Java中通过super来实现对父类成员的访问。this用来引用当前对象,与this类似,super用来引用当前对象的父类当前对象的父类。super的使用可以分为下面三种情况:1)用来访问父类被隐藏的成员变量,如:super.y 2)用来调用父类中被重写的方法,如:super.setY
29、()3)用来调用父类的构造方法,如:super(paramlist);3.1.3 3.1.3 成员变量的隐藏和方法的覆写成员变量的隐藏和方法的覆写成员变量的隐藏和方法的覆写成员变量的隐藏和方法的覆写思考:方法的重载与覆写非常类似,找出它们的区别!思考:方法的重载与覆写非常类似,找出它们的区别!本讲稿第三十七页,共六十八页课后讨论课后讨论n n讨论二类的继承性与多态性(讨论二类的继承性与多态性(讨论二类的继承性与多态性(讨论二类的继承性与多态性(1 1)主题一:方案设计分析主题一:方案设计分析主题一:方案设计分析主题一:方案设计分析主题三:知识原理掌握主题三:知识原理掌握主题三:知识原理掌握主题
30、三:知识原理掌握构造方法的重载构造方法的重载构造方法的重载构造方法的重载思考:思考:思考:思考:(1 1)找出父类向子类派生时,构造方法的调用规律)找出父类向子类派生时,构造方法的调用规律)找出父类向子类派生时,构造方法的调用规律)找出父类向子类派生时,构造方法的调用规律(2 2)找出方法的重载与重写的区别)找出方法的重载与重写的区别)找出方法的重载与重写的区别)找出方法的重载与重写的区别本讲稿第三十八页,共六十八页主题一:方案设计分析主题一:方案设计分析n n写出你所能想到的所有二维、三维形状,并用它们组写出你所能想到的所有二维、三维形状,并用它们组写出你所能想到的所有二维、三维形状,并用它
31、们组写出你所能想到的所有二维、三维形状,并用它们组成一个形状层次结构。层次结构把成一个形状层次结构。层次结构把成一个形状层次结构。层次结构把成一个形状层次结构。层次结构把ShapeShapeShapeShape当作超类,并当作超类,并当作超类,并当作超类,并从中派生出从中派生出从中派生出从中派生出TwoDimensionalShapeTwoDimensionalShapeTwoDimensionalShapeTwoDimensionalShape类和类和类和类和ThreeDimensionalShapeThreeDimensionalShapeThreeDimensionalShapeThre
32、eDimensionalShape类。设计这个层次结构,并定类。设计这个层次结构,并定类。设计这个层次结构,并定类。设计这个层次结构,并定义它的所有类。画出相应的类层次结构图。接下来考义它的所有类。画出相应的类层次结构图。接下来考义它的所有类。画出相应的类层次结构图。接下来考义它的所有类。画出相应的类层次结构图。接下来考虑如果将虑如果将虑如果将虑如果将ShapeShapeShapeShape类变成类变成类变成类变成abstractabstractabstractabstract超类,超类,超类,超类,TwoDimensionalShapeTwoDimensionalShapeTwoDimens
33、ionalShapeTwoDimensionalShape类和类和类和类和hreeDimensionalShapehreeDimensionalShapehreeDimensionalShapehreeDimensionalShape类也类也类也类也是是是是abstractabstractabstractabstract类。进行相应的派生后,要求在第三层的类。进行相应的派生后,要求在第三层的类。进行相应的派生后,要求在第三层的类。进行相应的派生后,要求在第三层的类中计算出每个类对应对象的面积和体积。类中计算出每个类对应对象的面积和体积。类中计算出每个类对应对象的面积和体积。类中计算出每个类对应
34、对象的面积和体积。本讲稿第三十九页,共六十八页主题三:知识原理掌握主题三:知识原理掌握构造方法的重载构造方法的重载n n建立一个人类(建立一个人类(建立一个人类(建立一个人类(PersonPersonPersonPerson)和学生类()和学生类()和学生类()和学生类(StudentStudentStudentStudent),功能要求如下:),功能要求如下:),功能要求如下:),功能要求如下:n n(1 1 1 1)PersonPersonPersonPerson中包含中包含中包含中包含4 4 4 4个保护型的数据成员个保护型的数据成员个保护型的数据成员个保护型的数据成员namenamen
35、amename、addraddraddraddr、sexsexsexsex、ageageageage,表示姓名、地址、性别和年龄。用一个,表示姓名、地址、性别和年龄。用一个,表示姓名、地址、性别和年龄。用一个,表示姓名、地址、性别和年龄。用一个4 4 4 4参构造方法、一参构造方法、一参构造方法、一参构造方法、一个两参构造方法、一个无参构造方法来实例化对象,用一个输个两参构造方法、一个无参构造方法来实例化对象,用一个输个两参构造方法、一个无参构造方法来实例化对象,用一个输个两参构造方法、一个无参构造方法来实例化对象,用一个输出方法显示出方法显示出方法显示出方法显示4 4 4 4种属性。种属性。
36、种属性。种属性。n n(2 2 2 2)StudentStudentStudentStudent类继承类继承类继承类继承PersonPersonPersonPerson类,并增加输出成员类,并增加输出成员类,并增加输出成员类,并增加输出成员mathmathmathmath、englishenglishenglishenglish存放数学、英语成绩。用一个存放数学、英语成绩。用一个存放数学、英语成绩。用一个存放数学、英语成绩。用一个6 6 6 6参构造方法、一个两参构造方法、一个两参构造方法、一个两参构造方法、一个两参构造方法、一个无参构造方法来实例化对象,另外重写输参构造方法、一个无参构造方法
37、来实例化对象,另外重写输参构造方法、一个无参构造方法来实例化对象,另外重写输参构造方法、一个无参构造方法来实例化对象,另外重写输出方法用于显示出方法用于显示出方法用于显示出方法用于显示6 6 6 6种属性。种属性。种属性。种属性。本讲稿第四十页,共六十八页第第3章章 面向对象高级程序设计面向对象高级程序设计3.1 继承继承 3.2多态性多态性3.3 抽象类和抽象方法抽象类和抽象方法3.4接口接口3.5内部类和匿名类内部类和匿名类本讲稿第四十一页,共六十八页3.2多态性多态性 多态多态(Polymorphism)(Polymorphism)的意思就是用相同的名字来定义不同的方的意思就是用相同的名
38、字来定义不同的方法。在法。在JavaJava中,普通类型的多态为重载,这就意味着可以使几个不中,普通类型的多态为重载,这就意味着可以使几个不同的方法使用相同的名字,这些方法以参数的个数不同、参数的同的方法使用相同的名字,这些方法以参数的个数不同、参数的类型不同等方面来进行区分,以使得编译器能够进行识别。类型不同等方面来进行区分,以使得编译器能够进行识别。也可以这样讲,重载是同一个方法具有不同的版本,每个版本之间在也可以这样讲,重载是同一个方法具有不同的版本,每个版本之间在参数特征方面有差异。重载是参数特征方面有差异。重载是JavaJava实现多态性的方式之一。实现多态性的方式之一。例如:例如:
39、family()family()方法可以有三个版本,如下:方法可以有三个版本,如下:family()family()family(String ch)address=ch;family(String ch)address=ch;family(String ch,float n)address=ch;pay=n;family(String ch,float n)address=ch;pay=n;这些方法并存于程序中,编译时,编译器根据实参的类型和这些方法并存于程序中,编译时,编译器根据实参的类型和个数来区分从而调用那个方法。如果这些方法作为函数或过程个数来区分从而调用那个方法。如果这些方法作为函
40、数或过程同时出现在其它语言的程序中,如同时出现在其它语言的程序中,如C C,那将导致灾难性的错误。,那将导致灾难性的错误。本讲稿第四十二页,共六十八页3.2多态性多态性【例例例例3-63-6】构造方法重载的例子构造方法重载的例子class person class person String name=Johnson;/String name=Johnson;/姓名姓名 int age=45;/int age=45;/年龄年龄 person()person()person(String a)name=a;person(String a)name=a;person(String a,int b)
41、name=a;age=b;person(String a,int b)name=a;age=b;public voiddisplay()System.out.println(Name=+public voiddisplay()System.out.println(Name=+name+,+Age=+age);name+,+Age=+age);public class Polypublic class Poly public static void main(String args)public static void main(String args)person ko1=new person
42、();person ko1=new person();person ko2=new person(Mike);person ko2=new person(Mike);person ko3=new person(Willian,50);person ko3=new person(Willian,50);ko1.display();ko2.display();ko3.display();ko1.display();ko2.display();ko3.display();本讲稿第四十三页,共六十八页3.2多态性多态性 在Java语言中,多态性主要体现在两个方面:由方法重载实现的静态多态性(编译时多态
43、)和方法重写实现的动态多态性(运行时多态),如下:1)编译时多态在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。2)运行时多态由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。如果子类重写了父类的方法,那么重写方法的调用原则如下:Java运行时系统根据调用该方法的实例,来决定调用哪个方法。对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法;如果子类继承了父类的方法(未重写),则运行时系统调用父类的方法。另外,
44、方法重写时应遵循的原则如下:改写后的方法不能比被重写的方法有更严格的访问权限。改写后的方法不能比被重写的方法有更严格的访问权限。改写后的方法不能比被重写的方法产生更多的异常改写后的方法不能比被重写的方法产生更多的异常。进行方法重写时必须遵从这两个原则,否则编译器会指出程序出错。本讲稿第四十四页,共六十八页3.2多态性多态性【例3-7】方法重写的例子class Parent public void function()System.out.println(I am in Parent!);class Child extends Parent private void function()Syst
45、em.out.println(I am in Child!);public class RTpolyTest public static void main(String args)Parent pl=new Parent();Parent p2=new Child();p1.function();p2.function();本讲稿第四十五页,共六十八页3.2多态性多态性编译过程如下:D:userchap05Javac RTpolyTest.javaRTpolyTest.java:8:function()in Child cannot override function()in Parent;
46、attempting to assign weaker access privileges;was public private void function()RTpolyTest.java:16:cannot find symbolsymbol :variable p1location:class RTpolyTest p1.function();2 errors可以看出,该程序中实例p2调用function()方法时会导致访问权限的冲突。本讲稿第四十六页,共六十八页第第3章章 面向对象高级程序设计面向对象高级程序设计3.1 继承继承 3.2多态性多态性3.3 抽象类和抽象方法抽象类和抽象方
47、法3.4接口接口3.5内部类和匿名类内部类和匿名类本讲稿第四十七页,共六十八页3.3 抽象类和抽象方法抽象类和抽象方法 Java语言中,用abstract关键字来修饰一个类时,这个类叫做抽象类。一个abstract 类只关心它的子类是否具有某种功能,并不关心该功能的具体实现,功能的具体行为由子类负责实现的。例如:public abstract class Drawing public abstract void drawDot(int x,int y);public void drawLine(int x1,int y1,int x2,int y2)用abstract来修饰一个方法时,该方法叫
48、做抽象方法。与final类和方法相反,abstract类必须被继承,abstract方法必须被重写。本讲稿第四十八页,共六十八页3.3 抽象类和抽象方法抽象类和抽象方法 当一个类的定义完全表示抽象的概念时,它不应该被实例化为一个对象。例如Java中的Number类就是一个抽象类,它只表示数字这一抽象概念,只有当它作为整数类Integer或实数类Float等的父类时才有意义。定义一个抽象类的格式如下:abstract class abstractClass 由于抽象类不能被实例化,因此下面的语句会产生编译错误:new abstractClass();抽象类中可以包含抽象方法,为所有子类定义一个统
49、一的接口,对抽象方法只需声明,而不需实现,因此它没有方法体。其格式如下:abstrac returnType abstractMethod(paramlist);本讲稿第四十九页,共六十八页使用abstract的另一例子abstract class AA abstract void callme();void metoo()System.out.println(InsideAs metoo()method);class BB extends AA void callme()System.out.println(Inside Bs callme()method);public class AAb
50、stract public static void main(String args)AA cc=new BB();/cc为上转型对象 cc.callme();cc.metoo();本讲稿第五十页,共六十八页第第3章章 面向对象高级程序设计面向对象高级程序设计3.1 继承继承 3.2多态性多态性3.3 抽象类和抽象方法抽象类和抽象方法3.4接口接口3.5内部类和匿名类内部类和匿名类本讲稿第五十一页,共六十八页3.4 接口接口3.4.1接口声明接口声明3.4.2使用接口的优点使用接口的优点本讲稿第五十二页,共六十八页3.4.1接口声明接口声明从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含