已阅读5页,还剩49页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 Part3 非访问控制符 接口内部类与匿名类 2 本章内容 非访问控制符Java类的static成员final关键字abstract关键字 抽象类 接口内部类与匿名类 3 非访问控制符 4 关键字static 在Java类中声明变量 方法和内部类时 可使用关键字static做为修饰符 static标记的变量或方法由整个类 所有实例 共享 如果访问控制权限允许 可不必创建该类对象而直接用类名加 调用 static成员也称类成员或静态成员 如 类属性 类方法 静态方法等 5 类属性 classAttributes 类属性由该类的所有实例共享 publicclassPerson privateintid publicstaticinttotal 0 publicPerson total id total 6 类属性应用举例 classPerson privateintid publicstaticinttotal 0 publicPerson total id total publicclassOtherClass publicstaticvoidmain Stringargs Person total 100 System out println Person total Personc newPerson System out println Person total 7 类变量与实例变量的区别 类变量与类绑定在一起 实例变量与实例绑定在一起 类变量在内存中只有一个拷贝 运行时只为类变量分配一次内存 对于实例变量 每创建一个实例 就为该实例分配一次内存 类变量被所有的实例共享 8 类方法 static标记的方法由整个类 所有实例 共享 如果访问控制权限允许 可不必创建该类对象而直接用类名加 调用 类方法中不能访问成员变量 在类方法中不能使用this和super static方法只能处理类变量 或者调用类方法 但是实例方法中可以处理类变量 调用类方法 9 类方法应用举例 1 classPerson privateintid privatestaticinttotal 0 publicstaticintgetTotalPerson returntotal publicPerson total id total publicclassTestPerson publicstaticvoidmain String args System out println Numberoftotalis Person getTotalPerson Personp1 newPerson System out println Numberoftotalis Person getTotalPerson Theoutputis Numberoftotalis0Numberoftotalis1 10 类方法应用举例 2 classWrong intx voidmethod publicstaticvoidmain String args 编译错误x 9 method 11 static的应用模型Singleton设计模板 单子 classSingle privatestaticSingleonlyone newSingle publicstaticSinglegetSingle returnonlyone privateSingle publicclassTestSingle publicstaticvoidmain Stringargs Singles1 Single getSingle Singles2 Single getSingle if s1 s2 System out println s1isequalstos2 12 静态初始化器 classPerson publicstaticinttotal static total 100 为total赋初值 其它属性或方法声明 由static 构成 在类的定义体中 方法的外部可包含static语句块 static语句块仅在其所属的类被载入时执行一次static块通常用于初始化static 类 属性如果有多个static块 在类的初始化时会依次执行 13 静态初始化举例Person java classPerson publicstaticinttotal static total 100 System out println instaticblockone total publicstaticvoidmain String args System out println total Person total System out println total Person total static System out println instaticblockTwo 14 Static初始化带来的问题 publicclassTest static System out println 111111 运行结果为 111111Exceptioninthread main java lang NoSuchMethodError main 15 static与继承 子类不能继承父类中的static成员子类可以定义与父类的static变量同名的变量子类不能定义与父类static方法同名的成员方法 但是子类可以定义与父类static方法同名的static方法父类的非静态方法不能被子类覆盖为静态注意与访问控制符的结合 16 static与继承举例 publicclassFather staticinti 1 staticvoidmethod classSonextendsFather inti 1 合法voidmethod 非法staticvoidmethod 合法 注意访问控制符 17 关键字final 在Java中声明类 属性和方法时 可使用关键字final来修饰 表示 最终 不可变 final标记的变量 成员变量或局部变量 即成为常量 只能赋值一次 final常与static一起表示多个对象的公有常量 当你在类中定义变量时 在其前面加上final关键字 对基本类型来说是其值不可变 而对于对象变量来说其引用不可再变 即地址不变 但对象本身可变 其初始化可以在两个地方 一是其定义处 也就是说在final变量定义时直接给其赋值 二是在构造函数中 这两个地方只能选其一 要么在定义时给值 要么在构造函数中给值 不能同时既在定义时给了值 又在构造函数中给另外的值 18 关键字final应用举例 importjava io publicfinalclassTest publicstaticinttotalNumber 5 publicfinalintid publicTest id totalNumber publicstaticvoidmain String args Testt newTest System out println t id finalinti 10 finalintj j 20 j 30 非法 19 final与继承 final标记的类不能被继承 final标记的方法不能被子类重写 不能编译 此处与private标记的方法以及static方法不同 finalclassString finalvoidshow 20 final成员与方法 publicclassFinal finalinta Final a 5 finalvoidb classTestFinalextendsFinal finalinta 5 合法finalvoidb 非法 21 final与继承 当你将final用于类身上时 你就需要仔细考虑 因为一个final类是无法被任何人继承的 那也就意味着此类在一个继承树中是一个叶子类 并且此类的设计已被认为很完美而不需要进行修改或扩展 对于final类中的成员 你可以定义其为final 也可以不是final 而对于方法 由于所属类为final的关系 自然也就成了final型的 你也可以明确的给final类中的方法加上一个final 但这显然没有意义 22 程序设计举例 类族的设计 实现下图中的Shape层次结构 每个TwoDimensionalShape类应包括成员函数getArea每个ThreeDimensionalShape类包含成员函数getVolume编写一个程序 用一个数组乘放各种图形类对象 并输出对象得相应信息要能判断每个图形到底属于TwoDimensionalShape还是属于ThreeDimenionalShape 如果某个图形是TwoDimensionalShape就显示其面积 如果某个图形是ThreeDimenionalShape 则显示其体积 将来如何使用这一类族 有一个类AllShapes类似Canvas 可用于添加和显示图形classAllShapes privateArrayListshapes newArrayList 图形集合publicvoidaddShape Shapes 添加一个新图形shapes add s publicvoidshowAll 显示所有图形的信息for inti 0 i shapes size i shapes get i show 25 创建4个图形对象Cubecube1 newCube 3 Cubecube2 newCube 2 Circlecircle1 newCircle 5 Circlecircle2 newCircle 4 向 AllShapes 添加这4个图形AllShapesa newAllShapes a addShape cube2 a addShape cube1 a addShape circle1 a addShape circle2 a showAll 程序设计举例 抽象类与抽象函数 刚才的例子中Shape类的show函数事实上函数体是永远不会被执行的Shape类事实上也永远没有必要被实例化Shape类的存在是为了构造 类族 实现多态ThreeDimensionalShape TwoDimensionalShape这两个类也有这样的特点 28 abstract关键字 abstract可以修饰类 方法 表示抽象 无法实例化 没有具体化 abstract方法必须位于abstract类中 29 抽象类 abstractclass 用abstract关键字来修饰一个类时 这个类叫做抽象类 用abstract来修饰一个方法时 该方法叫做抽象方法 抽象方法只需声明 无方法体 abstractreturnTypemethodName paramlist 例如 abstractclassA abstractvoidmethod inta 含有抽象方法的类必须被声明为抽象类 抽象类不能被实例化 须说明 30 抽象类的继承 abstract不能与final并列修饰同一类abstract不能与private static final或并列修饰同一方法 抽象类 抽象方法 是为继承而设计的 子类继承父类 抽象类 则子类应重写父类所有的抽象方法 称为 实现 子类如果没有实现某一抽象方法 则子类也应声明为抽象类 否则编译错误 没有抽象构造方法 31 抽象类举例 abstractclassA abstractvoidm1 publicvoidm2 System out println A类中定义的m2方法 classBextendsA voidm1 System out println B类中定义的m1方法 publicclassTest publicstaticvoidmain Stringargs Ac newB 抽象例实例化的特例c m1 c m2 32 理解Abstract 如果一个类中没有包含足够的信息来描绘一个具体的对象 这样的类就是抽象类 抽象类往往用来表征我们在对问题领域进行分析 设计中得出的抽象概念 是对一系列看上去不同 但是本质上相同的具体概念的抽象 抽象的概念在问题领域没有对应的具体概念 所以用以表征抽象概念的抽象类是不能够实例化的 33 34 Whyinterface java不允许多重继承 也就是说一个子类只能有一个父类 SonextendsFatherA FatherB是错误的为了弥补这点不足 java允许实现多个接口 接口就是给出一些没有内容的方法 类似于C 中的虚类 但这只是其中的一个原因 35 接口 1 接口 interface 是抽象方法和常量值的定义的集合 从本质上讲 接口是一种特殊的抽象类 这种抽象类中只包含常量和方法的定义 而没有变量和方法的实现 接口定义举例publicinterfaceRunner intid 1 publicvoidstart publicvoidrun publicvoidstop 接口同class一样 保存在 java文件中 编译后可生成 class文件 36 接口 3 多个无关的类可以实现同一个接口一个类可以实现多个无关的接口与继承关系类似 接口与实现类之间存在多态性实现接口的Java类的语法格式 class extends implements 接口的抽象方法的访问限制符都已指定为public 所以类在实现方法时 必须显式地使用public修饰符 37 接口 2 声明接口的语法如下 public interface接口名 extends父接口名列表 多个 常量域声明 修饰符默认 必须被赋初值 public static final 域类型域名 常量 抽象方法声明 修饰符默认 public abstract 返回值方法名 参数列表 38 接口应用举例 1 publicinterfaceRunnable publicvoidstart publicvoidrun publicvoidstop publicclassPersonimplementsRunnable publicvoidstart 准备工作 弯腰 蹬腿 咬牙 瞪眼 开跑 publicvoidrun 摆动手臂 维持直线方向 publicvoidstop 减速直至停止 喝水 39 接口应用举例 3 interfaceRunnable publicvoidrun interfaceSwimmable publicdoubleswim classAnimal publicvoideat 非法 为什么 classPersonextendsAnimalimplementsRunnable Swimmable publicvoidrun publicdoubleswim publicvoideat publicclassTestInterface publicstaticvoidmain Stringargs TestInterfacet newTestInterface Personp newPerson t m1 p t m2 p t m3 p publicvoidm1 Runnablef f run publicvoidm2 Swimmables s swim publicvoidm3 Animala a eat 40 接口应用举例 2 StopWatch getSpeed Runnabler 41 abstractclass和interface abstractclass和interface之间在对于抽象类定义的支持方面具有很大的相似性 甚至可以相互替换 因此很多开发者在进行抽象类定义时对于abstractclass和interface的选择显得比较随意 其实 两者之间还是有很大的区别的 42 abstractclass和interface 从编程的角度来看 abstractclass和interface都可以用来实现 designbycontract 的思想 但是在具体的使用上面还是有一些区别的 首先 abstractclass在Java语言中表示的是一种继承关系 一个类只能使用一次继承关系 但是 一个类却可以实现多个interface 其次 在abstractclass的定义中 我们可以赋予方法的默认行为 但是在interface的定义中 方法却不能拥有默认行为 为了绕过这个限制 必须使用委托 但是这会增加一些复杂性 有时会造成很大的麻烦 43 44 内部类 在Java中 允许一个类的定义位于另一个类的内部 前者称为内部类 innerclass 而后者称为外部类 Outerclass Innerclass一般用在定义它的类或方法之内 在Outerclass外部引用它时必须给出完整的名称 Innerclass的名字不能与包含它的类名相同 内部类和外层封装它的类之间存在逻辑上的所属关系Innerclass可以直接访问outerclass的所有的静态和实例成员变量 包括private成员 45 内部类举例 1 classA Outerclassprivateints publicclassB innerclasspublicvoidmb s 100 System out println 在内部类B中s s publicvoidma Bi newB i mb publicclassTest publicstaticvoidmain Stringargs Ao newA o ma 46 内部类举例 2 publicclassA privateints publicclassB publicvoidmb System out println s publicclassTest publicstaticvoidmain String args Aa newA 创建一个依赖于a而存在的bA Bb a newB b mb 栈内存 a B类对象 0 A类对象 s b this 堆内存 处内存状态 main mb A this 47 thisreference 当我们建立一个innerclass时 其对象就拥有了与外部类对象之间的一种关系 这是通过一个特殊的thisreference形成的 当内部类的成员方法中访问某个变量 方法时 如果在该方法和内部类中都没有定义过这个变量 调用就会被传递给内部类中保存的那个外部类对象的引用 OuterClass this 通过那个外部类对象的引用去调用这个变量 48 内部类举例 3 publicclassA privateints 111 publicclassB privateints 222 publicvoidmb ints System out println s 局部变量sSystem out println this s 内部类对象的属性sSystem out println A this s 外层类对象属性s publicstaticvoidmain Stringargs Aa newA A Bb a newB b mb 333 49 内部类与继承 可以参读 thinkinginJava 带有内部类的外部类发生继承 内部类的访问控制符 访问控制符包括public protected 默认及private内部类前面用final修饰 表明该内部类不能被继承内部类是抽象类内部类前面用abstract修饰 表明不能实例化外部类依然可以是非abstract的内部接口的实现 50 静态的内部类 内部类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 部编版二年级语文下册句子通顺性修改专项练习
- 港口舞台音箱租赁合同
- 屏风背景墙合同
- 大学生见习合同
- 2026届山东省菏泽市部分重点学校高一化学第一学期期末考试模拟试题含解析
- 2025年新余辅警招聘考试题库及答案详解1套
- 2025年平顶山辅警协警招聘考试备考题库及一套答案详解
- 2025年三亚辅警协警招聘考试备考题库附答案详解(培优a卷)
- 2025年大理州辅警招聘考试题库含答案详解(巩固)
- 2025年沈阳辅警招聘考试题库及答案详解(名校卷)
- 幼儿阿拉伯数字描红(0-100)打印版
- 了不起的我课件完整版
- 三菱HOPE电梯的故障码
- 抖音企业号操作文档最新版
- YC/T 145.2-2012烟用香精相对密度的测定
- GB/T 5709-1997纺织品非织造布术语
- GB/T 16823.3-2010紧固件扭矩-夹紧力试验
- 量子信息与量子计算课件
- 小学道德与法治一年级集体备课记录表(一年级)
- 原材料检验不合格评估报告
- 分子生物学第八章真核基因表达调控课件
评论
0/150
提交评论