类的层次结构.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《类的层次结构.pptx》由会员分享,可在线阅读,更多相关《类的层次结构.pptx(77页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、本章目录3.1类的继承3.2Final类3.3多态3.4抽象类3.5接口3.6内部类3.7匿名类第1页/共77页3.1类的继承3.1.1 使用extends继承3.1.2 super与派生类对象的构造3.1.3 继承中的方法覆盖3.1.4 super的其他用法3.1.5 super关于变量隐藏的优势3.1.6 final方法第2页/共77页3.1.1 使用extends继承继承是面对象程序设计的重要特性,因为有了继承,使得类和类之间形成了一种层次关系。如子类对象和父类对象之间是一种is-a的关系。在继承的过程中,子类对父类的定义作出某些修改,要么改变同一方法的内部操作;要么增加新的操作。同时因
2、为继承,父类可以提供的方法,子类也因为继承而具备。第3页/共77页Pro3_1:classStudentprivateintAge;privateStringStudentNo;publicbooleanSetAge(intvalue)if(value17)Age=value;returntrue;elsereturnfalse;publicintGetAge()returnAge;publicbooleanSetSno(Stringvalue)StudentNo=value;returntrue;publicStringGetSno()returnStudentNo;第4页/共77页clas
3、s GirlStudent extends Studentprivate int ShapeCourseGrade;public boolean SetShapeCourseGrade(int value)if(value=0)ShapeCourseGrade=value;return true;else return false;public int GetShapeCourseGrade()return ShapeCourseGrade;第5页/共77页public class test public static void main(String args)GirlStudent stu
4、=new GirlStudent();boolean ageFlag=stu.SetAge(18);boolean gradeFlag=stu.SetShapeCourseGrade(78);if(ageFlag)&(gradeFlag)System.out.println(stu.GetAge();System.out.println(stu.GetShapeCourseGrade();else System.out.println(输入信息不符合规范!);第6页/共77页Pro3_1中,女学生(GirlStudent)因为继承自学生(Student),所以学生类的所有方法,女学生都因为继承
5、而具备,当我们创建女学生的实例时,可以使用SetAge和GetAge 方法等。同时也可以使用女学生类新增的方法:SetShapeCourseGrade和GetShapeCourseGrade。所以继承使得代码可以得到复用。父类的数据成员也可以被子类继承。如:第7页/共77页class Locationint x,y;Location(int x,int y)this.x=x;this.y=y;void show()System.out.println(this.x+this.y);class Point123 extends Locationboolean visible;Point123(i
6、nt x,int y,boolean tf)super(x,y);this.visible=tf;void moveTo(int x,int y)this.x=x;this.y=y;输出结果:100 100public class TestPointCircle public static void main(String args)Point123 p=new Point123(100,100,false);p.show();第8页/共77页3.1.2 super与派生类对象的构造构造方法可以在对象创建的时候给对象的数据成员进行初始赋值,也可以执行某些行为(通过构造方法里面的语句)。那么子类
7、若在派生父类的基础上新增了数据成员,需要进行初始赋值或者子类有其需要在创建对象时就实施的某种行为,那么子类也需要定义构造方法。此处需要考虑的问题是,父类的构造方法如何能够在子类的构造方法执行时也能够相应的被执行呢?所以我们可以使用super在子类的构造方法里面调用父类构造方法,使得父类的构造方法得以执行。第9页/共77页class Value1int x,y;Value1(int x,int y)this.x=x;this.y=y;System.out.println(我是从Value1的构造方法输出的);int GetX()return x;class Value2 extends Valu
8、e1Value2(int x,int y)super(x,y);System.out.println(我是从Value2的构造方法输出的);第10页/共77页public class Var public static void main(String args)int t;Value2 v2=new Value2(10,20);t=v2.GetX()+v2.GetX();System.out.print(add=+t);输出:我是从Value1的构造方法输出的我是从Value2的构造方法输出的add=20第11页/共77页子类对象的内存空间里存放着父类对象的数据。如不调用父类对象的构造方法,
9、则表明父类对象并未构造“完全”,也即是没能正确构造父类的对象,这块父类的实际数据是不正确的,所以在创建子类的对象时候,必须先调用父类对象的构造方法,再调用子类的构造方法。子类对象的构造方法可以针对对那些从父类继承的成员再次设定值。第12页/共77页class BaseClassprivate String hostName;BaseClass()hostName=Amy!;public String GetName()return hostName;class DerivedClass extends BaseClasspublic class TestInherit public stati
10、c void main(String args)DerivedClass d=new DerivedClass();System.out.println(d.GetName();其中BaseClass的构造方法被调用,hostName数据成员的值为Amy!所以输出为:Amy!第13页/共77页当父类提供了多个构造方法的时候:一个不带参数的构造方法和其它带参数的构造方法,子类仍可以不定义任何构造方法,因为系统会给子类提供缺省构造方法,且在实例化子类对象的时候、会根据super的参数去选择调用父类的哪一个构造方法。第14页/共77页输出结果:Tom!输出结果:Amy!class BaseClass
11、private String hostName;BaseClass()hostName=Amy!;BaseClass(String s)hostName=s;public String GetName()return hostName;classDerivedClassextendsBaseClassDerivedClass(Strings)super(s);public class Test public static void main(String args)DerivedClass d=new DerivedClass(Tom!);System.out.println(d.GetNam
12、e();super();输出结果:Amy!等价为:super();第15页/共77页系统会总是默认提供构造方法吗?如果父类不存在缺省构造方法时候(当显示定义了带参数的其它构造方法时)或者没有定义不带参数的构造方法时,则子类中必须要有super()之类的语句来调用父类的这个非缺省构造方法。如下例:第16页/共77页class BaseClassprivate String hostName;BaseClass(Strings)hostName=s;public String GetName()return hostName;class DerivedClass extends BaseClass
13、DerivedClass(Strings)super(s);第17页/共77页根据super的参数去选择调用父类的构造方法。class BaseClassprivate String hostName;BaseClass(String s)hostName=s;public String GetName()return hostName;class DerivedClass extends BaseClassDerivedClass(String s)super(s);public class TestInherit public static void main(String args)De
14、rivedClass d=new DerivedClass(Tom!);System.out.println(d.GetName();输出结果:Tom!第18页/共77页子类对象的构造方法可以针对对那些从父类继承的成员再次设定值。class BaseClassStringhostName;BaseClass()hostName=Amy!“;public String GetName()return hostName;class DerivedClass extends BaseClassDerivedClass()super.hostName=Bob;super();public class
15、Test public static void main(String args)DerivedClassd=new DerivedClass();System.out.println(d.GetName();Constructorcallmustbethefirststatementinaconstructor第19页/共77页3.1.3 继承中的方法覆盖子类继承父类,如果需要改写父类的某个功能(方法),只用在子类的定义中重写该方法即可。第20页/共77页class BaseClassprivate String hostName;BaseClass(String s)hostName=s;
16、public String GetName()return hostName;classDerivedClassextendsBaseClassDerivedClass(Strings)super(s);publicStringGetName()returnName:+super.GetName();public class Test public static void main(String args)DerivedClass d=new DerivedClass(Tom!);System.out.println(d.GetName();输出结果为:Name:Tom!第21页/共77页3.
17、1.4 super的其他用法super在类的层次中还可以用来指明父类中和子类同名的方法和成员变量。当子类的方法成员或数据成员同名覆盖了对应父类的成员的时候,如果需要调用父类的同名方法或同名数据,可以使用super。第22页/共77页class Value1int x,y;public int Getx()return x;public int Gety()return y;class Value2 extends Value1int x;void show()super.x=10;this.x=100;this.y=100;System.out.println(super.Getx()+,+s
18、uper.Gety()+,+Getx();public int Getx()return x;public class Var public static void main(String args)Value2 v2=new Value2();v2.show();10,100,100System.out.println(super.Getx()+,+Getx()+,+this.Getx();System.out.println(super.Gety()+,+Gety()+,+this.Gety();10,100,100100,100,100第23页/共77页3.1.5 super关于变量隐藏
19、的优势子类如定义了一个和父类同名的变量,则父类的这个变量将无法在子类对象中直接使用。第24页/共77页class Value1public int x=10,y=20;class Value2 extends Value1private int x;/父类的成员变量被隐藏publicclassSimplepublicstaticvoidmain(Stringargs)Value2v2=newValue2();System.out.print(v2.x);此例中v2.x是错误的,因为x被修饰为private,所以x对于类的使用者来看,是”不存在”的。第25页/共77页public class T
20、est public static void main(String args)Value2v2=new Value2();System.out.print(v2.getX();class Value1public int x=10,y=20;class Value2 extends Value1private int x;public int getX()return x;0第26页/共77页class Value1int x=10,y=20;class Value2 extends Value1private int x;public int GetX()return this.x;pub
21、lic int GetOriginX()return super.x;public class one public static void main(String args)Value2v2=new Value2();System.out.println(v2.GetOriginX();System.out.println(v2.GetX();100第27页/共77页3.1.6 final方法父类中如有方法被修饰为final的,在继承层次中,所有子类均不能覆盖这个方法。所以能够有效的保证某个方法不被“改写”。如:第28页/共77页Pro3_6:classBaseClasspublicStri
22、nghostName=WPUIC;finalpublicStringGetName()returnhostName;classDerivedClassextendsBaseClasspublicStringGetName()return“wpu”;将出现编译时错误:Cannotoverridethefinalmethod子类不能覆盖父类中修饰符为final的方法。所以父类中GetName方法是最终“版本”的方法。第29页/共77页3.2Final类用修饰符为Final的类不能被继承,不能有子类。第30页/共77页classDerivedClassextendsBaseClasspublicvo
23、idMyFunc()finalclassBaseClasspublicvoidMyFunc()在缺省情况下,所有的方法成员和实例变量都可以被子类覆盖。如果你希望你的变量或方法不再被子类覆盖,可以把它们声明为final。所以设计final类可以提升安全性。第31页/共77页设想一个定义的基类的引用变量指向一个派生自该基类的派生类的对象,如:BaseClass d=new DerivedClass();s=d.GetName();如果BaseClass类没有被修饰为final,且DerivedClass类改写了GetName方法,则此处父类的GetName方法将不会被调用。第32页/共77页3.3
24、多态3.3.1 子类覆盖父类的方法3.3.2 方法重载3.3.3 向上类型转换第33页/共77页3.3.1 子类覆盖父类的方法(override)子类继承自父类,子类覆盖了父类的方法,表明相同的行为名但父类对象和子类对象执行的行为却各不同。第34页/共77页Pro3_8:classFathervoidspeak()System.out.println(IamFather);classSonextendsFathervoidspeak()System.out.println(IamSon!);publicclassonepublicstaticvoidmain(Stringargs)Father
25、f=newFather();f.speak();Sons=newSon();s.speak();父类和子类中均有speak方法,但各自speak方法的实现,即方法体中的语句是不一样的,本例的输出结果为:IamFatherIamSon!IamFatherIamSon!第35页/共77页3.3.2 方法重载同一类中同名方法、但不同参数列表的方法重载。也属于是一种同名但行为不同的多态。第36页/共77页Pro3_9:classFathervoidspeak()System.out.println(IamFather);voidspeak(Strings)System.out.println(s);p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 层次 结构
![提示](https://www.deliwenku.com/images/bang_tan.gif)
限制150内