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