Java13_07高级类特性02

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

高级类特性高级类特性高级java软件工程师培训讲义本课内容•多态•instanceof运算符•对象的造型(cast)•内部类•修饰符的适用范围多态(Polymorphism)•多态:在Java中,子类的对象可以替代父类的对象使用•在Java中,对象变量是多态的。一个类型为Aclass的变量既可以指向类型为Aclass的对象,又可以指向Aclass的任何子类的对象•以多态的形式来传递参数,增强了参数类型的灵活性多态(Polymorphism)•一个对象只能有一种确切的数据类型ƒ一个引用类型变量可能指向(引用)多种不同类型的对象Personp=newStudent();Objecto=newPerson();o=newStudent();多态(Polymorphism)•一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法Studentm=newStudent();m.school=“Harvard;//合法Persone=newStudent();e.school=“Oxford;//非法虚方法调用虚方法调用(VirtualMethodInvocation)•正常的方法调用Personp=newPerson();p.showName();Students=newStudent();s.showName();•虚拟方法调用(多态情况下)Personp=newStudent();p.showName();•编译时类型和运行时类型多态性应用多态性应用ƒ同类收集(homogenouscollections)MyDate[]m=newMyDate[2];m[0]=newMyDate(22,12,1964);m[1]=newMyDate(22,7,1964);ƒ异类收集(heterogeneouscollections)Person[]p=newPerson[3];p[0]=newStudent();p[1]=newPerson();p[2]=newGraduate();多态性应用多态性应用ƒ方法声明的参数类型为父类类型,可以使用子类的对象作为实参调用该方法publicclassTest{publicvoidmethod(Persone){//……e.getInfo();}publicstaticvoidmain(Stirngargs[]){Testt=newTest();Studentm=newStudent();t.method(m);}}instanceof运算符•使用运算符instanceof可以得到对象的类型•使用格式:引用类型变量instanceof引用类型instanceofinstanceof操作符操作符publicclassPersonextendsObject{…}publicclassStudentextendsPerson{…}publicclassGraduateextendsPerson{…}----------------------------------------------------------------------publicvoidmethod1(Persone){if(einstanceofStudent){//处理Student类型及其子类类型对象}elseif(einstanceofGraduate){//处理Graduate类型及其子类类型对象}else{//处理Person类型对象}}对象造型(CastingCasting)•所谓造型就是Java对象间的类型转换•Java的对象造型可以分为两种情况:自动造型强制造型•从子类到父类的类型转换可以自动进行•从父类到子类的类型转换必须通过造型(强制类型转换)实现•在造型前可以使用instanceof运算符测试一个对象的类型•对象的造型只用在有继承关系的对象之间,无继承关系的引用类型间的转换是非法的内部类(innerclassinnerclass)ƒ在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类(innerclassinnerclass),也称为“嵌套类”•这样的一组类在逻辑上是一个整体,内部类和外层封装它的类之间存在逻辑上的从属关系••InnerclassInnerclass一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。InnerclassInnerclass的名字不能与包含它的类名相同;••InnerclassInnerclass可以使用包含它的类的静态和实例成员变量,也可以使用它所在方法的局部变量,即对其封装类的内部成员有访问权限。内部类举例内部类举例(1)(1)publicclassA{privateints;publicclassB{publicvoidmb(){s=100;System.out.println(在内部类B中s=+s);}}publicvoidma(){Bi=newB();i.mb();}}publicclassTestInner1{publicstaticvoidmain(Stringargs[]){Ao=newA();o.ma();}}内部类演示内部类演示(1)(1)main栈内存o0A类对象publicclassA{privateints;publicclassB{publicvoidmb(){s=100;//TheinnSystem.out.println(s);}}publicvoidma(){Bi=newB();i.mb();}}publicclassTestInner1{publicstaticvoidmain(Stringa[]){Ao=newA();o.ma();}}s堆内存处内存状态内部类演示内部类演示(2)(2)main栈内存oB类对象0A类对象publicclassA{privateints;publicclassB{publicvoidmb(){s=100;//TheinnSystem.out.println(s);}}publicvoidma(){Bi=newB();i.mb();}}publicclassTestInner1{publicstaticvoidmain(Stringa[]){Ao=newA();o.ma();}}smathisiA.this堆内存处内存状态内部类演示内部类演示(3)(3)main栈内存oB类对象0A类对象publicclassA{privateints;publicclassB{publicvoidmb(){s=100;//TheinnSystem.out.println(s);}}publicvoidma(){Bi=newB();i.mb();}}publicclassTestInner1{publicstaticvoidmain(Stringa[]){Ao=newA();o.ma();}}smathisimbthisA.this堆内存处内存状态内部类举例内部类举例(2)(2)publicclassA{privateints;publicclassB{publicvoidmb(){System.out.println(s);}}}publicclassTestInner2{publicstaticvoidmain(String[]args){Aa=newA();//创建一个依赖于a而存在的bA.Bb=a.newB();b.mb();}}栈内存aB类对象0A类对象sbthis堆内存处内存状态mainmbA.this内部类举例内部类举例(3)(3)publicclassOuter{privateintsize;/*定义一个内部类,名为Inner*/publicclassInner{publicvoiddoStuff(){//内部类可以访问外部类的私有属性size++;}publicintgetOuterSize(){returnsize;}}publicvoidtestTheInner(){Inneri=newInner();i.doStuff();}}publicclassTestInner3{publicstaticvoidmain(String[]args){Outer.Inneroi=newOuter().newInner();oi.doStuff();System.out.println(oi.getOuterSize());}}实例化内部类•实例化内部类的两种方法:---写法一:Outer.Innerin=newOuter().newInner();---写法二:Outero=newOuter();Outer.InnerI=o.newInner();如果内部类是static的,也可以用下面方法:Outer.Innerin=newOuter.Inner();局部内部类•类的名字只能在定义的范围内使用•Inner类也可以定义在方法的内部。方法中final类型的局部变量,都可以被Inner类的方法访问。内部类特性ƒInnerclass可以声明为抽象类,因此可以被其它的内部类继承。也可以声明为final的。ƒ和外层类不同,Innerclass可以声明为private或protected;ƒInnerclass可以声明为static的,但此时就不能再使用外层封装类的非static的成员变量;ƒ非static的内部类中的成员不能声明为static的,只有在static的内部类中才可声明static成员;修饰符适用范围classclass属性属性方法方法构造器构造器自由块自由块内部类内部类publicYYYYYYYYYYYprotectedYYY(Default)YYYYYprivateYYYfinalYYYabstractYYstaticYYY

1 / 22
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功