Java编程思想第十章内部类课件

上传人:风*** 文档编号:241760071 上传时间:2024-07-21 格式:PPT 页数:31 大小:131.67KB
返回 下载 相关 举报
Java编程思想第十章内部类课件_第1页
第1页 / 共31页
Java编程思想第十章内部类课件_第2页
第2页 / 共31页
Java编程思想第十章内部类课件_第3页
第3页 / 共31页
点击查看更多>>
资源描述
第十章第十章内部类内部类外部类和内部类外部类和内部类外部类和内部类外部类和内部类匿名内部类和嵌套类匿名内部类和嵌套类匿名内部类和嵌套类匿名内部类和嵌套类为什么需要内部类?为什么需要内部类?为什么需要内部类?为什么需要内部类?第十章 内部类 外部类和内部类110.6、匿名内部类、匿名内部类P1961 1、匿名内部类的概念匿名内部类的概念匿名内部类的概念匿名内部类的概念 匿名内部类是没有名字的内部类匿名内部类是没有名字的内部类匿名内部类是没有名字的内部类匿名内部类是没有名字的内部类2 2、什么情况下可以使用匿名内部类?什么情况下可以使用匿名内部类?什么情况下可以使用匿名内部类?什么情况下可以使用匿名内部类?只用到类的一个实例只用到类的一个实例只用到类的一个实例只用到类的一个实例 类在定义后马上用到类在定义后马上用到类在定义后马上用到类在定义后马上用到类非常小(类非常小(类非常小(类非常小(SUNSUN推荐是在推荐是在推荐是在推荐是在4 4行代码以下)行代码以下)行代码以下)行代码以下)给类命名并不会导致代码更容易被理解给类命名并不会导致代码更容易被理解给类命名并不会导致代码更容易被理解给类命名并不会导致代码更容易被理解 10.6、匿名内部类 P1961、匿名内部类的概念23 3、匿名内部类的使用原则匿名内部类的使用原则匿名内部类的使用原则匿名内部类的使用原则匿名内部类不能有构造函数匿名内部类不能有构造函数匿名内部类不能有构造函数匿名内部类不能有构造函数构造函数与类名一致,但是现在这个类构造函数与类名一致,但是现在这个类构造函数与类名一致,但是现在这个类构造函数与类名一致,但是现在这个类连名字都没有连名字都没有连名字都没有连名字都没有匿名内部类一定是跟在匿名内部类一定是跟在匿名内部类一定是跟在匿名内部类一定是跟在newnew的后面的后面的后面的后面用以隐含实现一个接口或继承一个类用以隐含实现一个接口或继承一个类用以隐含实现一个接口或继承一个类用以隐含实现一个接口或继承一个类3、匿名内部类的使用原则3(匿名匿名匿名匿名)内部类中不能定义任何静态的成员内部类中不能定义任何静态的成员内部类中不能定义任何静态的成员内部类中不能定义任何静态的成员因匿名内部类为内部类,所以内部类的所有限因匿名内部类为内部类,所以内部类的所有限因匿名内部类为内部类,所以内部类的所有限因匿名内部类为内部类,所以内部类的所有限制都对其生效,匿名内部类对象可以(不)依附制都对其生效,匿名内部类对象可以(不)依附制都对其生效,匿名内部类对象可以(不)依附制都对其生效,匿名内部类对象可以(不)依附外部类对象。外部类对象。外部类对象。外部类对象。interfaceContentsinterfaceContents intvalue();intvalue();(匿名)内部类中不能定义任何静态的成员41 1、publicclassParcel7/P197publicclassParcel7/P197publicContentscont()publicContentscont()/创建一个继承自创建一个继承自创建一个继承自创建一个继承自ContentsContents的匿名类的对象的匿名类的对象的匿名类的对象的匿名类的对象returnreturnnewContentsnewContents()()()()publicintvaluepublicintvalue()()()()return11return11;/匿名内部类定义结束,需要一个分号匿名内部类定义结束,需要一个分号匿名内部类定义结束,需要一个分号匿名内部类定义结束,需要一个分号/cont/cont方法定义结束方法定义结束方法定义结束方法定义结束publicstaticvoidmainpublicstaticvoidmain(StringargsStringargs)Parcel7p=newParcel7Parcel7p=newParcel7();();();();Contentsc=p.contContentsc=p.cont();();();();1、public class Parcel7 52 2、上述例子中匿名的内部类只使用一次、上述例子中匿名的内部类只使用一次、上述例子中匿名的内部类只使用一次、上述例子中匿名的内部类只使用一次 匿名内部类的定义和使用形式:匿名内部类的定义和使用形式:匿名内部类的定义和使用形式:匿名内部类的定义和使用形式:returnreturnnewnew 基类或者接口基类或者接口基类或者接口基类或者接口(参数列表)(参数列表)(参数列表)(参数列表)匿名内部类的定义匿名内部类的定义匿名内部类的定义匿名内部类的定义;(2)(2)匿名内部类的执行过程匿名内部类的执行过程匿名内部类的执行过程匿名内部类的执行过程 首先:使用首先:使用首先:使用首先:使用newnew关键字创建匿名类对象,关键字创建匿名类对象,关键字创建匿名类对象,关键字创建匿名类对象,并且并且并且并且返回一个指向该匿名内部类对象的引用返回一个指向该匿名内部类对象的引用返回一个指向该匿名内部类对象的引用返回一个指向该匿名内部类对象的引用 然后:再自动向上转型为指向基类或者基接口然后:再自动向上转型为指向基类或者基接口然后:再自动向上转型为指向基类或者基接口然后:再自动向上转型为指向基类或者基接口的引用的引用的引用的引用 2、上述例子中匿名的内部类只使用一次6(3)(3)匿名内部类的层次结构匿名内部类的层次结构匿名内部类的层次结构匿名内部类的层次结构 或者:匿名内部类实现了基接口或者:匿名内部类实现了基接口或者:匿名内部类实现了基接口或者:匿名内部类实现了基接口 或者:匿名内部类是基类的子类或者:匿名内部类是基类的子类或者:匿名内部类是基类的子类或者:匿名内部类是基类的子类 匿名内部类的创建对象匿名内部类的创建对象匿名内部类的创建对象匿名内部类的创建对象 创建对象仍然符合构造器的调用原则:首先调用创建对象仍然符合构造器的调用原则:首先调用创建对象仍然符合构造器的调用原则:首先调用创建对象仍然符合构造器的调用原则:首先调用基类构造器,然后再调用子类构造器基类构造器,然后再调用子类构造器基类构造器,然后再调用子类构造器基类构造器,然后再调用子类构造器 匿名内部类只有默认构造器匿名内部类只有默认构造器匿名内部类只有默认构造器匿名内部类只有默认构造器(3)匿名内部类的层次结构73 3、如果调用基类带参数的构造器,应该怎么办、如果调用基类带参数的构造器,应该怎么办、如果调用基类带参数的构造器,应该怎么办、如果调用基类带参数的构造器,应该怎么办?对比分析:前面的例子为基接口,所以不存在对比分析:前面的例子为基接口,所以不存在对比分析:前面的例子为基接口,所以不存在对比分析:前面的例子为基接口,所以不存在构造器,更不存在带参构造器的问题构造器,更不存在带参构造器的问题构造器,更不存在带参构造器的问题构造器,更不存在带参构造器的问题publicclassWrapping/P197publicclassWrapping/P197privateintiprivateinti;publicWrappingpublicWrapping(intxintx)i=xi=x;/带参数的构造器带参数的构造器带参数的构造器带参数的构造器publicintvaluepublicintvalue()()()()returnireturni;3、如果调用基类带参数的构造器,应该怎么办?8publicclassParcel8publicclassParcel8publicWrappingwrappublicWrappingwrap(intxintx)returnnewreturnnew WrappingWrapping(x x)/子类只有缺省构造器。子类只有缺省构造器。子类只有缺省构造器。子类只有缺省构造器。publicintvaluepublicintvalue()()()()returnsuper.valuereturnsuper.value()()()()*47*47;/子类的子类的子类的子类的valuevalue方法中将调用基类的方法中将调用基类的方法中将调用基类的方法中将调用基类的valuevalue方法方法方法方法;publicstaticvoidmain(Stringargs)publicstaticvoidmain(Stringargs)Parcel8p=newParcel8();Parcel8p=newParcel8();Wrappingw=p.wrap(10);w.value();Wrappingw=p.wrap(10);w.value();publicclassWrappingpublicclassWrappingprivateintiprivateinti;publicWrappingpublicWrapping(intxintx)i=xi=x;publicintvaluepublicintvalue()()()()returnireturni;public class Parcel8public 9 首先分析包含匿名类的方法:首先分析包含匿名类的方法:首先分析包含匿名类的方法:首先分析包含匿名类的方法:基类或者基接口基类或者基接口基类或者基接口基类或者基接口 方法名(参数列表)方法名(参数列表)方法名(参数列表)方法名(参数列表)returnnewreturnnew基类或者基接口(参数列表)基类或者基接口(参数列表)基类或者基接口(参数列表)基类或者基接口(参数列表)匿名内部类的定义匿名内部类的定义匿名内部类的定义匿名内部类的定义;Java编程思想第十章内部类课件10 执行过程的分析:执行过程的分析:执行过程的分析:执行过程的分析:使用使用使用使用newnew关键字创建匿名类对象,关键字创建匿名类对象,关键字创建匿名类对象,关键字创建匿名类对象,创建对象仍然符合构造器的调用原则:先调用基类构创建对象仍然符合构造器的调用原则:先调用基类构创建对象仍然符合构造器的调用原则:先调用基类构创建对象仍然符合构造器的调用原则:先调用基类构造器,再调用匿名子类的默认构造器造器,再调用匿名子类的默认构造器造器,再调用匿名子类的默认构造器造器,再调用匿名子类的默认构造器.(2)(2)返回一个指向该匿名内部类对象的返回一个指向该匿名内部类对象的返回一个指向该匿名内部类对象的返回一个指向该匿名内部类对象的wrappingwrapping基类基类基类基类的引用的引用的引用的引用(向上转型向上转型向上转型向上转型)结论:如果你的基类存在一个带参数的构造器结论:如果你的基类存在一个带参数的构造器结论:如果你的基类存在一个带参数的构造器结论:如果你的基类存在一个带参数的构造器,只只只只需要简单地传递合适的参数给基类的构造器即可需要简单地传递合适的参数给基类的构造器即可需要简单地传递合适的参数给基类的构造器即可需要简单地传递合适的参数给基类的构造器即可 本例中:将本例中:将本例中:将本例中:将wrapwrap(intxintx)方法中的参数)方法中的参数)方法中的参数)方法中的参数x x,传递给传递给传递给传递给newWrappingnewWrapping(x x)执行过程的分析:114 4、对匿名类中的数据成员进行初始化操作:、对匿名类中的数据成员进行初始化操作:、对匿名类中的数据成员进行初始化操作:、对匿名类中的数据成员进行初始化操作:publicclassParcel9/P198publicclassParcel9/P198publicDestinationdest(publicDestinationdest(finalfinal StringStringd d)returnnewDestinationreturnnewDestination()()()()/匿名内部类匿名内部类匿名内部类匿名内部类/在匿名内部类中定义数据成员在匿名内部类中定义数据成员在匿名内部类中定义数据成员在匿名内部类中定义数据成员privateStringlabel=dprivateStringlabel=d;publicStringreadLabelpublicStringreadLabel()()()()returnlabelreturnlabel;;4、对匿名类中的数据成员进行初始化操作:publ12 归纳:归纳:归纳:归纳:匿名内部类,要使用匿名内部类,要使用匿名内部类,要使用匿名内部类,要使用外部类或外部类或外部类或外部类或函数中定义成员,编函数中定义成员,编函数中定义成员,编函数中定义成员,编译器会要求它们是译器会要求它们是译器会要求它们是译器会要求它们是finalfinal型的,可使用外部类一切成员型的,可使用外部类一切成员型的,可使用外部类一切成员型的,可使用外部类一切成员 可以使用初始化块,初始化匿名类中的成员。可以使用初始化块,初始化匿名类中的成员。可以使用初始化块,初始化匿名类中的成员。可以使用初始化块,初始化匿名类中的成员。returnnewDestination()returnnewDestination()privateintcost;privateintcost;cost=Math.round(6.288);/cost=Math.round(6.288);/四舍五入四舍五入四舍五入四舍五入取整取整 ;匿名内部类不能既扩展类,又实现接口,也不能实现多匿名内部类不能既扩展类,又实现接口,也不能实现多匿名内部类不能既扩展类,又实现接口,也不能实现多匿名内部类不能既扩展类,又实现接口,也不能实现多个接口。个接口。个接口。个接口。可以不依附于外部类的对象。可以不依附于外部类的对象。可以不依附于外部类的对象。可以不依附于外部类的对象。归纳:1310.7嵌套类嵌套类P2011 1、嵌套类(嵌套类(嵌套类(嵌套类(nestedclassnestedclass)也称为也称为也称为也称为静态内部类静态内部类静态内部类静态内部类如果如果如果如果不需要内部类对象与其外部类对象之间有联系不需要内部类对象与其外部类对象之间有联系不需要内部类对象与其外部类对象之间有联系不需要内部类对象与其外部类对象之间有联系,可以将内部类声明为可以将内部类声明为可以将内部类声明为可以将内部类声明为staticstatic的。的。的。的。普通的内部类对象隐式保存了一个引用,指向创建普通的内部类对象隐式保存了一个引用,指向创建普通的内部类对象隐式保存了一个引用,指向创建普通的内部类对象隐式保存了一个引用,指向创建它的外部类对象它的外部类对象它的外部类对象它的外部类对象 然而,当内部类是然而,当内部类是然而,当内部类是然而,当内部类是staticstatic时,时,时,时,静态内部类对象中没有静态内部类对象中没有静态内部类对象中没有静态内部类对象中没有连接外部类对象的引用连接外部类对象的引用连接外部类对象的引用连接外部类对象的引用,要创建嵌套类的对象,要创建嵌套类的对象,要创建嵌套类的对象,要创建嵌套类的对象,并不并不并不并不需要外部类的对象需要外部类的对象需要外部类的对象需要外部类的对象 10.7 嵌套类 P2011、嵌套类(ne14普通内部类的数据成员与成员函数,只能放在普通内部类的数据成员与成员函数,只能放在类的外部层次上,因此普通内部类不能有静态成类的外部层次上,因此普通内部类不能有静态成员,不能包含嵌套类。员,不能包含嵌套类。(但可定义普通类型的常(但可定义普通类型的常静态数据成员,要求是编译时期的静态常量)静态数据成员,要求是编译时期的静态常量)publicclassP11protectedstaticclassPD/PD/PD必须是静态内部类必须是静态内部类必须是静态内部类必须是静态内部类staticclassAL/静态内部类中定义的静态内部类静态内部类中定义的静态内部类静态内部类中定义的静态内部类静态内部类中定义的静态内部类/静态内部类可以用权限修饰符静态内部类可以用权限修饰符静态内部类可以用权限修饰符静态内部类可以用权限修饰符publicstaticvoidmain(Stringargs)PD.ALd=newPD.AL();/不依附于任何外部类不依附于任何外部类不依附于任何外部类不依附于任何外部类/内层静态内部类的全称是内层静态内部类的全称是内层静态内部类的全称是内层静态内部类的全称是P11.PD.ALP11.PD.AL 普通内部类的数据成员与成员函数,只能放在类的外部152 2、嵌套类的性质嵌套类的性质嵌套类的性质嵌套类的性质(1)(1)静态内部类的对象可以直接生成,并不需要通过静态内部类的对象可以直接生成,并不需要通过静态内部类的对象可以直接生成,并不需要通过静态内部类的对象可以直接生成,并不需要通过生成外部类对象来生成,例如:生成外部类对象来生成,例如:生成外部类对象来生成,例如:生成外部类对象来生成,例如:Outer.Innerin=newOuter.InnerOuter.Innerin=newOuter.Inner();();();();从嵌套类访问外部类的原则(类似静态成员函数)从嵌套类访问外部类的原则(类似静态成员函数)从嵌套类访问外部类的原则(类似静态成员函数)从嵌套类访问外部类的原则(类似静态成员函数)嵌套类可以访问外部类的一切静态成员嵌套类可以访问外部类的一切静态成员嵌套类可以访问外部类的一切静态成员嵌套类可以访问外部类的一切静态成员(定义在外部类体内)(定义在外部类体内)(定义在外部类体内)(定义在外部类体内)但不能够访问外部类的非静态成员但不能够访问外部类的非静态成员但不能够访问外部类的非静态成员但不能够访问外部类的非静态成员(没有指向外部类对象的引用)(没有指向外部类对象的引用)(没有指向外部类对象的引用)(没有指向外部类对象的引用)2、嵌套类的性质16publicclassOuter/publicclassOuter/外部类外部类外部类外部类privatestaticprivatestaticinti=1inti=1;privateintj=10privateintj=10;publicpublicstaticstaticvoidouter_f1voidouter_f1()()()()publicvoidouter_f2publicvoidouter_f2()()()()public class Outer /17staticstaticclassInnerclassInner/静态内部类(嵌套类)静态内部类(嵌套类)静态内部类(嵌套类)静态内部类(嵌套类)staticvoidinner_fstaticvoidinner_f()()()()/静态内部类只能访问外部类的静态成员静态内部类只能访问外部类的静态成员静态内部类只能访问外部类的静态成员静态内部类只能访问外部类的静态成员System.out.printlnSystem.out.println(“Outer.i”+i“Outer.i”+i););););outer_f1outer_f1();();();();/静态内部类不能访问外部类的非静态成员静态内部类不能访问外部类的非静态成员静态内部类不能访问外部类的非静态成员静态内部类不能访问外部类的非静态成员/包括非静态变量和非静态方法包括非静态变量和非静态方法包括非静态变量和非静态方法包括非静态变量和非静态方法/!System.out.printlnSystem.out.println(“Outer.i”+j“Outer.i”+j););););/!outer_f2outer_f2();();();();newOuter().outer_f2();newOuter().outer_f2();/静态内部类定义结束静态内部类定义结束静态内部类定义结束静态内部类定义结束 /外部类定义结束外部类定义结束外部类定义结束外部类定义结束 static class Inner /18七、嵌套类七、嵌套类从外部类访问嵌套类的原则从外部类访问嵌套类的原则从外部类访问嵌套类的原则从外部类访问嵌套类的原则(适用于普通内部类)(适用于普通内部类)(适用于普通内部类)(适用于普通内部类)访问嵌套类静态成员的方法访问嵌套类静态成员的方法访问嵌套类静态成员的方法访问嵌套类静态成员的方法访问嵌套类非静态成员的方法访问嵌套类非静态成员的方法访问嵌套类非静态成员的方法访问嵌套类非静态成员的方法 七、嵌套类 从外部类访问嵌套类的原则19 publicclassouterpublicclassouter/外部类访问内部类的静态成员的方法:内部类外部类访问内部类的静态成员的方法:内部类外部类访问内部类的静态成员的方法:内部类外部类访问内部类的静态成员的方法:内部类.静态成员静态成员静态成员静态成员staticclassInnerstaticclassInner/静态内部类(嵌套类)静态内部类(嵌套类)静态内部类(嵌套类)静态内部类(嵌套类)/静态内部类中可以定义静态或者非静态的成员静态内部类中可以定义静态或者非静态的成员静态内部类中可以定义静态或者非静态的成员静态内部类中可以定义静态或者非静态的成员privateprivatestaticinti=100staticinti=100;privateprivatevoidfvoidf()()()()System.out.printlnSystem.out.println(“Inner.i”+i“Inner.i”+i););););public class outer20/外部类访问内部类的非静态成员的方法:外部类访问内部类的非静态成员的方法:外部类访问内部类的非静态成员的方法:外部类访问内部类的非静态成员的方法:/先将内部类实例化即可先将内部类实例化即可先将内部类实例化即可先将内部类实例化即可voidouterf()voidouterf()/外部类的初始化语句块,访问内部类的私有成员外部类的初始化语句块,访问内部类的私有成员外部类的初始化语句块,访问内部类的私有成员外部类的初始化语句块,访问内部类的私有成员System.out.printlnSystem.out.println(Inner.iInner.i););););Inneri=newInnerInneri=newInner();();();();i.fi.f();();();();/外部类访问内部类的非静态成员的方法:2110.7.210.7.2、接口内部的类接口内部的类接口内部的类接口内部的类P202P202在正常情况下,不能在接口内部放置任何代码在正常情况下,不能在接口内部放置任何代码在正常情况下,不能在接口内部放置任何代码在正常情况下,不能在接口内部放置任何代码 但但但但嵌套类可以作为接口的一部分,接口中任何类都是嵌套类可以作为接口的一部分,接口中任何类都是嵌套类可以作为接口的一部分,接口中任何类都是嵌套类可以作为接口的一部分,接口中任何类都是staticstatic和和和和publicpublic的的的的 publicinterfaceClassInInterfacepublicinterfaceClassInInterfacevoidhowdy();voidhowdy();classTestimplementsClassInInterfaceclassTestimplementsClassInInterface/静态内部类实现了接口静态内部类实现了接口静态内部类实现了接口静态内部类实现了接口publicvoidhowdy()publicvoidhowdy()System.out.println(Howdy!);System.out.println(Howdy!);10.7.2、接口内部的类 P20222为什么要使用接口内部的类?为什么要使用接口内部的类?为什么要使用接口内部的类?为什么要使用接口内部的类?接口的静态内部类接口的静态内部类接口的静态内部类接口的静态内部类,可以被某些实现接口的不,可以被某些实现接口的不,可以被某些实现接口的不,可以被某些实现接口的不同类所共有同类所共有同类所共有同类所共有,那么使用接口内部的嵌套类会显得,那么使用接口内部的嵌套类会显得,那么使用接口内部的嵌套类会显得,那么使用接口内部的嵌套类会显得很方便很方便很方便很方便publicclassAimplementsClassInInterfaceprivateTestt=newTest();/直接生成静态内部类对象,不必使用外部接口名,直接生成静态内部类对象,不必使用外部接口名,/因为因为A类实现了接口类实现了接口publicvoidhowdy()t.howdy();为什么要使用接口内部的类?2310.7.210.7.2、从多层嵌套类中访问外部类的成员从多层嵌套类中访问外部类的成员从多层嵌套类中访问外部类的成员从多层嵌套类中访问外部类的成员P203P203一个嵌套类被嵌套了多少层并不重要一个嵌套类被嵌套了多少层并不重要一个嵌套类被嵌套了多少层并不重要一个嵌套类被嵌套了多少层并不重要,它能透明访它能透明访它能透明访它能透明访问所有它所嵌入的外部类的所有成员问所有它所嵌入的外部类的所有成员问所有它所嵌入的外部类的所有成员问所有它所嵌入的外部类的所有成员classMAclassMAprivatevoidf()privatevoidf()classAclassAprivatevoidg()privatevoidg()publicclassBpublicclassBvoidh()voidh()g();f();g();f();publicstaticvoidmain(Stringpublicstaticvoidmain(Stringarg)arg)MAma=newMA();MAma=newMA();MA.Amaa=ma.newA();MA.Amaa=ma.newA();MA.A.Bmaab=maa.newMA.A.Bmaab=maa.newB();B();maab.h();maab.h();10.7.2、从多层嵌套类中访问外部类的成员 P22410.8、为什么需要内部类、为什么需要内部类P2041 1、引入内部类的重要作用在于:引入内部类的重要作用在于:引入内部类的重要作用在于:引入内部类的重要作用在于:内部类能够独立实现某个接口内部类能够独立实现某个接口内部类能够独立实现某个接口内部类能够独立实现某个接口 如果外部类所拥有的仅仅是抽象的类或具体如果外部类所拥有的仅仅是抽象的类或具体如果外部类所拥有的仅仅是抽象的类或具体如果外部类所拥有的仅仅是抽象的类或具体的类的类的类的类(同时继承两个类同时继承两个类同时继承两个类同时继承两个类),而不是接口,那么,而不是接口,那么,而不是接口,那么,而不是接口,那么,只能使用内部类才能实现多重继承只能使用内部类才能实现多重继承只能使用内部类才能实现多重继承只能使用内部类才能实现多重继承 10.8、为什么需要内部类 P2041、引入内部类25 classD/P205classD/P205abstractclassEabstractclassEclassZextendsDclassZextendsDEmakeEEmakeE()()()()returnnewEreturnnewE()()()()实现实现实现实现E E类抽象函数类抽象函数类抽象函数类抽象函数;/该匿名内部类的父类为抽象类该匿名内部类的父类为抽象类该匿名内部类的父类为抽象类该匿名内部类的父类为抽象类E E class D /P2052610.8.1、闭包与回调、闭包与回调P2052 2、闭包(闭包(闭包(闭包(closureclosure)是一个记录一些信息的对象,)是一个记录一些信息的对象,)是一个记录一些信息的对象,)是一个记录一些信息的对象,这些信息来源于创建它的作用域。内部类是闭包。这些信息来源于创建它的作用域。内部类是闭包。这些信息来源于创建它的作用域。内部类是闭包。这些信息来源于创建它的作用域。内部类是闭包。3 3、回调(回调(回调(回调(callbackcallback):对象携带的信息允许它在后):对象携带的信息允许它在后):对象携带的信息允许它在后):对象携带的信息允许它在后面的某个时刻调用创建它的对象面的某个时刻调用创建它的对象面的某个时刻调用创建它的对象面的某个时刻调用创建它的对象interfaceIncrementable/P206interfaceIncrementable/P206voidincrement();voidincrement();classCallee2classCallee2privateinti=0;privateinti=0;publicvoidincrement()publicvoidincrement()i+;System.out.println(i);i+;System.out.println(i);10.8.1、闭包与回调 P2052、闭包(clo27privateclassClosureimplementsIncrementable/内部类内部类publicvoidincrement()Callee2.this.increment();/回调外部类函数,实现接口回调外部类函数,实现接口IncrementablegetCallback()returnnewClosure();Callee2c=newCallee2();Callee2c=newCallee2();Incrementablecb=c.getCallback();Incrementablecb=c.getCallback();cb.increment();cb.increment();private class Closure imple2810.9内部类的继承内部类的继承P212继承一个内部类的时候,内部类中存在指向外继承一个内部类的时候,内部类中存在指向外部类的引用,子类对象却没有可依附的外部类对部类的引用,子类对象却没有可依附的外部类对象,必须采用特殊的语法,明确建立这种关联。象,必须采用特殊的语法,明确建立这种关联。10.9内部类的继承 P212 继承一个内部类的时候,29classWithInnerclassInnerpublicclassInheritInnerextendsWithInner.InnerInheritInner(WithInnerw)w.super();publicstaticvoidmain(Stringargs)WithInnerwi=newWithInner();InheritInnerii=newInheritInner(wi);wi.super()作用:作用:调用调用InheritInner的父类的父类WithInner.Inner的构造函数,初始化从父类中继承的的构造函数,初始化从父类中继承的WithInner.this引用,使其指向为引用,使其指向为wi所指向的外部类对象所指向的外部类对象class WithInner 30局部内部类不能有访问权限符局部内部类不能有访问权限符,它并不直接属于,它并不直接属于外部类,但是它可以访问当前代码内的常量和外部类,但是它可以访问当前代码内的常量和外部类的成员。外部类的成员。作业:作业:P195练习练习6、7P199练习练习12P202练习练习18局部内部类不能有访问权限符,它并不直接属于外部类,但是它可以31
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!