Java编程思想第十章内部类(1).ppt
![资源得分’ 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)
《Java编程思想第十章内部类(1).ppt》由会员分享,可在线阅读,更多相关《Java编程思想第十章内部类(1).ppt(55页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第十章第十章内部类内部类外围类和内部类外围类和内部类外围类和内部类外围类和内部类匿名内部类和嵌套类匿名内部类和嵌套类匿名内部类和嵌套类匿名内部类和嵌套类为什么需要内部类?为什么需要内部类?为什么需要内部类?为什么需要内部类?一、创建内部类一、创建内部类1 1、内部类(内部类(内部类(内部类(innerclassinnerclass)的概念的概念的概念的概念可以将可以将可以将可以将一个类的定义一个类的定义一个类的定义一个类的定义放在另一个类的放在另一个类的放在另一个类的放在另一个类的定义内部,这就是内部类定义内部,这就是内部类定义内部,这就是内部类定义内部,这就是内部类内部类与组合是完全不同的概
2、念内部类与组合是完全不同的概念内部类与组合是完全不同的概念内部类与组合是完全不同的概念一、创建内部类一、创建内部类2 2、内部类的典例内部类的典例内部类的典例内部类的典例参见参见参见参见P191P191非常典型的操作非常典型的操作非常典型的操作非常典型的操作:外部类有一个方法,:外部类有一个方法,:外部类有一个方法,:外部类有一个方法,该方法返回一个指向内部类的引用该方法返回一个指向内部类的引用该方法返回一个指向内部类的引用该方法返回一个指向内部类的引用 publicclassParcel2publicclassParcel2/包裹包裹包裹包裹/内部类指的是:将一个类的定义放在另一个内部类指的
3、是:将一个类的定义放在另一个内部类指的是:将一个类的定义放在另一个内部类指的是:将一个类的定义放在另一个/类的定义内部类的定义内部类的定义内部类的定义内部classContentsclassContents/内容内容内容内容privateinti=11privateinti=11;/数据成员数据成员数据成员数据成员publicintvaluepublicintvalue()()()()/成员函数成员函数成员函数成员函数returnireturni;classDestinationclassDestination/目的地目的地目的地目的地privateStringlabelprivateStri
4、nglabel;/数据成员数据成员数据成员数据成员DestinationDestination(StringwhereToStringwhereTo)/构造函数构造函数构造函数构造函数 label=whereTolabel=whereTo;StringreadLabelStringreadLabel()()()()/成员函数成员函数成员函数成员函数 returnlabelreturnlabel;/通常会在外部类定义一个方法,该方法创建通常会在外部类定义一个方法,该方法创建通常会在外部类定义一个方法,该方法创建通常会在外部类定义一个方法,该方法创建/一个内部类对象,并返回一个内部类对象,并返回一
5、个内部类对象,并返回一个内部类对象,并返回指向该对象指向该对象指向该对象指向该对象的引用的引用的引用的引用publicContentscontentspublicContentscontents()()()()returnnewContentsreturnnewContents();();();();/创建内部类对象,并返回指向该对象的引用创建内部类对象,并返回指向该对象的引用创建内部类对象,并返回指向该对象的引用创建内部类对象,并返回指向该对象的引用publicDestinationtopublicDestinationto(StringsStrings)returnnewDestinati
6、onreturnnewDestination(s s););););/普通方法,创建普通方法,创建普通方法,创建普通方法,创建ContentsContents和和和和DestinationDestination对象对象对象对象publicvoidshippublicvoidship(StringdestStringdest)/邮寄邮寄邮寄邮寄/左边:声明一个指向左边:声明一个指向左边:声明一个指向左边:声明一个指向ContentsContents的引用的引用的引用的引用c c/右边:创建一个对象并返回指向它的引用右边:创建一个对象并返回指向它的引用右边:创建一个对象并返回指向它的引用右边:创建
7、一个对象并返回指向它的引用Contentsc=contentsContentsc=contents();();();();Destinationd=toDestinationd=to(destdest););););System.out.printlnSystem.out.println(d.readLabeld.readLabel();();();();publicstaticvoidmainpublicstaticvoidmain(StringargsStringargs)Parcel2p=newParcel2Parcel2p=newParcel2();();();();p.shipp.s
8、hip(“Tasmania”Tasmania”););););/澳大利亚地名澳大利亚地名澳大利亚地名澳大利亚地名Parcel2q=newParcel2Parcel2q=newParcel2();();();();/自己创建自己创建自己创建自己创建ContentsContents和和和和DestinationDestination对象对象对象对象Parcel2.Contentsc=q.contentsParcel2.Contentsc=q.contents()()()();Parcel2.Destinationd=q.toParcel2.Destinationd=q.to(“Borneo”Bor
9、neo”););););/婆罗洲(分属三个国家的世界第三大岛)婆罗洲(分属三个国家的世界第三大岛)婆罗洲(分属三个国家的世界第三大岛)婆罗洲(分属三个国家的世界第三大岛)归纳:归纳:归纳:归纳:如果想在外部类的某个如果想在外部类的某个如果想在外部类的某个如果想在外部类的某个非静态方法非静态方法非静态方法非静态方法中,创建某个中,创建某个中,创建某个中,创建某个内部类的对象内部类的对象内部类的对象内部类的对象 直接创建即可直接创建即可直接创建即可直接创建即可 典例:分析在典例:分析在典例:分析在典例:分析在contentscontents、toto和和和和shipship这三个非静态这三个非静态
10、这三个非静态这三个非静态方法中,是如何创建内部类对象的方法中,是如何创建内部类对象的方法中,是如何创建内部类对象的方法中,是如何创建内部类对象的 归纳:创建内部类对象的注意事项归纳:创建内部类对象的注意事项归纳:创建内部类对象的注意事项归纳:创建内部类对象的注意事项 否则,必须具体指定这个对象的类型否则,必须具体指定这个对象的类型否则,必须具体指定这个对象的类型否则,必须具体指定这个对象的类型 OutClassName.InnerClassNameOutClassName.InnerClassName外部类名外部类名外部类名外部类名.内部类名内部类名内部类名内部类名 典例:分析典例:分析典例:
11、分析典例:分析mainmain方法中如何创建内部类对象方法中如何创建内部类对象方法中如何创建内部类对象方法中如何创建内部类对象二、链接到外部类二、链接到外部类1 1、外部类(外部类(外部类(外部类(enclosingclassenclosingclass)的概念的概念的概念的概念与内部类的概念相对应与内部类的概念相对应与内部类的概念相对应与内部类的概念相对应外部类也称为外围类外部类也称为外围类外部类也称为外围类外部类也称为外围类二、链接到外部类二、链接到外部类2 2、内部类自动拥有其内部类自动拥有其内部类自动拥有其内部类自动拥有其外部类外部类外部类外部类的所有元素的所有元素的所有元素的所有元素
12、的访问权的访问权的访问权的访问权与与与与C+C+嵌套类的设计非常不同嵌套类的设计非常不同嵌套类的设计非常不同嵌套类的设计非常不同 interfaceSelectorinterfaceSelector/该接口的作用类似于迭代器(该接口的作用类似于迭代器(该接口的作用类似于迭代器(该接口的作用类似于迭代器(iteratoriterator)booleanendbooleanend();();();();/检查序列是否到了末尾检查序列是否到了末尾检查序列是否到了末尾检查序列是否到了末尾ObjectcurrentObjectcurrent();();();();/访问当前对象访问当前对象访问当前对象访
13、问当前对象voidnextvoidnext();();();();/移到下一个对象移到下一个对象移到下一个对象移到下一个对象 publicclassSequencepublicclassSequence/声明一个数组,该数组的数据元素为指向声明一个数组,该数组的数据元素为指向声明一个数组,该数组的数据元素为指向声明一个数组,该数组的数据元素为指向/Object/Object对象的引用对象的引用对象的引用对象的引用privateObjectitemsprivateObjectitems;/next/next表示已使用空间表示已使用空间表示已使用空间表示已使用空间privateintnext=0p
14、rivateintnext=0;/构造函数,构造函数,构造函数,构造函数,sizesize表示分配的大小表示分配的大小表示分配的大小表示分配的大小publicSequencepublicSequence(intsizeintsize)items=newObjectsize;items=newObjectsize;/追加一个数组元素追加一个数组元素追加一个数组元素追加一个数组元素publicvoidaddpublicvoidadd(ObjectxObjectx)ifif(nextitems.lengthnextitems.length)itemsnext+=xitemsnext+=x;/内部类内
15、部类内部类内部类privateclassSequenceSelectorprivateclassSequenceSelectorimplementsSelectorimplementsSelectorprivateinti=0privateinti=0;publicbooleanendpublicbooleanend()()()()returni=returni=items.lengthitems.length;/注意:注意:注意:注意:itemsitems为外部类的数据成员为外部类的数据成员为外部类的数据成员为外部类的数据成员publicObjectcurrentpublicObjectcu
16、rrent()()()()returnreturnitemsiitemsi;publicvoidnextpublicvoidnext()()()()ifif(iiitems.lengthitems.length)i+;i+;/内部类定义结束内部类定义结束内部类定义结束内部类定义结束/通常会在外部类定义一个方法,该方法创建通常会在外部类定义一个方法,该方法创建通常会在外部类定义一个方法,该方法创建通常会在外部类定义一个方法,该方法创建/一个内部类对象,并返回指向该对象的引用一个内部类对象,并返回指向该对象的引用一个内部类对象,并返回指向该对象的引用一个内部类对象,并返回指向该对象的引用publi
17、cSelectorselectorpublicSelectorselector()()()()returnnewSequenceSelectorreturnnewSequenceSelector();();();();publicstaticvoidmainpublicstaticvoidmain(StringargsStringargs)/声明一个指向声明一个指向声明一个指向声明一个指向SequenceSequence对象的引用对象的引用对象的引用对象的引用sequencesequence/创建创建创建创建SequenceSequence对象,返回指向该对象的引用对象,返回指向该对象的引用对
18、象,返回指向该对象的引用对象,返回指向该对象的引用Sequencesequence=newSequenceSequencesequence=newSequence(1010););););forfor(inti=0inti=0;i10i10;i+i+)sequence.addsequence.add(Integer.toStringInteger.toString(i i)/将基类类型将基类类型将基类类型将基类类型intint转换为转换为转换为转换为StringString类型的方法类型的方法类型的方法类型的方法/selector/selector类似于迭代器类似于迭代器类似于迭代器类似于迭代
19、器SelectorselectorSelectorselector=sequence.selector=sequence.selector();();();();/声明一个引用,该引用用来指向一个实现声明一个引用,该引用用来指向一个实现声明一个引用,该引用用来指向一个实现声明一个引用,该引用用来指向一个实现/Selector/Selector接口的类的对象接口的类的对象接口的类的对象接口的类的对象whilewhile(!selector.end!selector.end()()()()printlnprintln(selector.currentselector.current();();()
20、;();selector.nextselector.next();();();();二、链接到外部类二、链接到外部类3 3、问题:问题:问题:问题:内部类自动拥有其外部类的所有元素内部类自动拥有其外部类的所有元素内部类自动拥有其外部类的所有元素内部类自动拥有其外部类的所有元素的访问权,这是怎么做到的?的访问权,这是怎么做到的?的访问权,这是怎么做到的?的访问权,这是怎么做到的?分析:分析:分析:分析:当某个外部类的对象创建了一个内部类对象时,当某个外部类的对象创建了一个内部类对象时,当某个外部类的对象创建了一个内部类对象时,当某个外部类的对象创建了一个内部类对象时,此此此此内部类对象必定会秘密
21、捕获一个内部类对象必定会秘密捕获一个内部类对象必定会秘密捕获一个内部类对象必定会秘密捕获一个,指向那个指向那个指向那个指向那个外部类对象的引用外部类对象的引用外部类对象的引用外部类对象的引用 内部类正是内部类正是内部类正是内部类正是通过该引用来访问外部类成员通过该引用来访问外部类成员通过该引用来访问外部类成员通过该引用来访问外部类成员 注意捕获的时机注意捕获的时机注意捕获的时机注意捕获的时机三、使用三、使用.this和和.new1 1、如果你需要生成对外部类对象的引用,如果你需要生成对外部类对象的引用,如果你需要生成对外部类对象的引用,如果你需要生成对外部类对象的引用,可以使用可以使用可以使用
22、可以使用外部类的名字后面紧跟外部类的名字后面紧跟外部类的名字后面紧跟外部类的名字后面紧跟.this.this典例:典例:典例:典例:P193P193 publicclassDotThispublicclassDotThis/外部类外部类外部类外部类/普通方法普通方法普通方法普通方法 voidfvoidf()()()()System.out.printlnSystem.out.println(“DotThis.fDotThis.f()()()()”;);););)publicclassInner/publicclassInner/内部类内部类内部类内部类publicDotThisouterpub
23、licDotThisouter()()()()returnreturnDotThis.thisDotThis.this;/指向当前外部类的引用指向当前外部类的引用指向当前外部类的引用指向当前外部类的引用/如果仅仅是如果仅仅是如果仅仅是如果仅仅是thisthis,则指向内部类本身,则指向内部类本身,则指向内部类本身,则指向内部类本身 publicInnerinnerpublicInnerinner()()()()returnnewInnerreturnnewInner();();();();publicstaticvoidmainpublicstaticvoidmain(StringargsSt
24、ringargs)DotThisdt=newDotThisDotThisdt=newDotThis();();();();DotThis.Innerdti=dt.innerDotThis.Innerdti=dt.inner();();();();/创建一个内部类对象创建一个内部类对象创建一个内部类对象创建一个内部类对象dti.outer.fdti.outer.f();();();();/值得注意的语句值得注意的语句值得注意的语句值得注意的语句三、使用三、使用.this和和.new2 2、创建内部类的原则创建内部类的原则创建内部类的原则创建内部类的原则必须明确的是:内部类对象是不能直接必须明确的
25、是:内部类对象是不能直接必须明确的是:内部类对象是不能直接必须明确的是:内部类对象是不能直接创建的创建的创建的创建的三、使用三、使用.this和和.new必须先创建一个外部类对象,再由这个必须先创建一个外部类对象,再由这个必须先创建一个外部类对象,再由这个必须先创建一个外部类对象,再由这个外部类对象来创建内部类对象外部类对象来创建内部类对象外部类对象来创建内部类对象外部类对象来创建内部类对象这样处理是为了体现内部类对象是依存这样处理是为了体现内部类对象是依存这样处理是为了体现内部类对象是依存这样处理是为了体现内部类对象是依存外部类对象存在的,即外部类对象存在的,即外部类对象存在的,即外部类对象
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 编程 思想 第十 部类
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内