已阅读5页,还剩54页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4课对象和类 构造方法重载方法覆盖方法访问控制static变量 方法和初始代码块this引用的用途final类 方法和变量abstract类和方法 接口解释如何以及何时使用内部类降级 以及如何把Java程序从JDK的低版本升级到高版本 参考 Java语言与面向对象程序设计 的第4 5章 interfaceMyIFC voidmethod1 voidmethod1 inta abstractclassBase publicvoidmethod1 System out println hi protectedabstractvoidmethod2 classSubextendsBaseimplementsMyIFC privateinta privatestaticintb publicstaticfinalintC 1 Sub this 1 Sub inta this a a publicvoidmethod1 a publicvoidmethod1 inta this a a publicvoidmethod2 a publicstaticvoidmethod3 b 构造方法 声明构造方法的语法规则重载构造方法 参见Employee java默认构造方法 参见Sample1 java子类调用父类的构造方法 参见Son java 构造方法的语法规则 一个新对象的初始化的最终步骤是去调用对象的构造方法 构造方法必须满足以下条件 方法名必须与类名称完全相匹配 不要声明返回类型 不能被static final synchronized abstract native修饰 publicclassSample intx publicSample No argconstructorx 1 publicSample intx int argconstructorthis x x 构造方法的语法规则 publicclassSample intx publicvoidSample x 1 publicstaticvoidmain Stringargs Samples newSample System out println s x 重载构造方法 publicclassEmployee privateStringname privateintsalary publicEmployee Stringn ints name n salary s publicEmployee Stringn this n 0 publicEmployee this Unknown Employeetom newEmployee Tom 1000 Employeejack newEmployee Jack Employeesomeone newEmployee 默认构造方法 默认构造方法是没有参数的构造方法 你可以显式定义类的默认构造方法 为了保证每个类至少有一个构造方法 如果定义的类中一个构造方法也没有写 Java将自动提供一个默认构造方法 该构造方法没有参数 用public修饰 而且方法体为空 格式如下 publicClassName 只要类中显式定义了一个或多个构造方法 而且所有显式定义的构造方法都带参数 那么将失去默认构造方法 默认构造方法 publicclassSample1 publicclassSample2 publicSample2 inta System out println MyConstructor publicclassSample3 publicSample3 System out println MyDefaultConstructor Sample1s1 newSample1 Sample2s2 newSample2 非法Sample2s22 newSample2 1 Sample3s3 newSample3 在构造子类对象时 JVM会先调用父类的构造方法子类构造方法中通过super语句调用父类构造方法如果子类构造方法中没有通过super语句调用父类构造方法 那么JVM会调用父类的默认构造方法 如果不存在默认构造方法 将导致编译错误 子类调用父类构造方法 classFather StringfatherName Father this fatherName 未知 Father StringfatherName this fatherName fatherName classSonextendsFather StringsonName Son StringsonName this sonName sonName Son StringsonName StringfatherName super fatherName this sonName sonName 子类调用父类构造方法 Sonson1 newSon 王小毛 王大毛 Sonson2 newSon 张三 System out println son1 sonName System out println son1 fatherName System out println son2 sonName System out println son2 fatherName 修饰符 修饰符的类型访问控制修饰符 public protected private static abstract final修饰符的修饰内容 类 方法 变量 修饰符的作用使用修饰符的限制 成员变量或成员方法的访问控制 修饰符同类同包子类不同包public是是是是protected是是是默认是是private是 成员变量或成员方法的访问控制 包1 包2 publicintv1 protectedintv2 intv3privateintv4 ClassA ClassB ClassC ClassDextendsClassA ClassB ClassC ClassD分别可以访问ClassA的哪些成员变量 类的访问控制 顶层类只能是public或默认访问级别public级别的类可以被同一个包或者其他包中的类访问默认级别的类只能被同一个包中的类访问 publicclassSample public级别classSample 默认访问级别protectedclassSample 非法privateclassSample 非法 static关键字 类 static 变量 参见Count java类 static 方法 参见Wrong java静态初始化程序 参见StaticBlock java 静态变量和实例变量 静态变量在装载类的时候被分配内存并初始化 类只能被装载一次 所以静态变量在内存中只有一个拷贝实例变量在创建实例时被分配内存并初始化 所以每个实例都有各自的实例变量同一个类的实例之间共享静态变量 静态变量和实例变量 publicclassCount privateintserialNumber privatestaticintcounter publicCount counter serialNumber counter System out println MyserialNumberis serialNumber publicstaticvoidmain Stringargs System out println Atfirst counter counter Countcount1 newCount System out println aftercreatcount1 counter counter Countcount2 newCount System out println Atlastcounter counter System out println count1 serialNumber count1 serialNumber System out println count2 serialNumber count2 serialNumber System out println count1 counter count1 counter System out println count2 counter count2 counter System out println Count counter Count counter 静态变量和实例变量 堆区 Count对象 serialNumber 1 方法区 Count的类型信息 counter 1 count1引用变量 堆区 Count对象 serialNumber 1 方法区 Count的类型信息 counter 2 count1引用变量 count2引用变量 Count对象 serialNumber 2 Countcount1 newCount Countcount2 newCount Count counter 合法Count serialNumber 非法 静态方法和实例方法 成员方法分为类方法和实例方法 用static修饰的方法叫类方法 或静态方法 静态方法也和静态变量一样 不需创建类的实例 可以直接通过类名被访问 static方法不能被修饰成protected和abstract publicclassGeneralFunction publicstaticintaddUp intx inty returnx y publicclassUseGeneral publicvoidmethod inta 9 intb 10 intc GeneralFunction addUp a b System out println addUp gives c 静态方法和实例方法 publicclassWrong intx voidmethod x publicstaticvoidtest x 1 非法method 非法 publicstaticvoidmain Stringargs x 9 非法method 非法 堆区 Wrong对象实例变量x Wrong对象实例变量x Wrong test 静态方法中不允许直接访问实例变量和实例方法 静态方法和实例方法 publicclassCorrect intx voidmethod x 合法 publicstaticvoidmain Stringargs Correctr1 newCorrect r1 x 9 合法r1 method 合法Correctr2 newCorrect r2 x 10 合法r2 method 合法System out println r1 x System out println r2 x 堆区 Correct对象实例变量x Correct对象实例变量x 引用变量r1 引用变量r2 this关键字 this关键字引用当前实例在static方法中不能使用this关键字 publicclassSample intx Sample intx this x x method this voidmethod Samples s x 合法 publicstaticvoidtest this x 非法 Samples1 newSample 1 Samples2 newSample 2 System out println s1 x System out println s2 x 堆区 Sample对象实例变量x Sample对象实例变量x 引用变量s1 引用变量s2 静态初始化程序 类中可以包含静态代码块 它不存在于任何方法体中 当类被装载时 静态代码块只被执行一次 类中不同的静态块按它们在类中出现的顺序被依次执行 publicclassSample staticinti 5 static System out println FirstStaticcodei i static System out println SecondStaticcodei i publicstaticvoidmain Stringargs Samples1 newSample Samples2 newSample System out println Atlast i i 打印FirstStaticcodei 5SecondStaticcodei 6Atlast i 7 final关键字 final类 不能被继承final方法 不能被子类覆盖final变量 必须被显式的初始化 并且只能初始化一次 参见InitFinal0 java publicfinalclassA publicclassBextendsA 非法 publicclassA publicfinalintmethod return1 publicclassBextendsA publicintmethod 非法return2 final变量例 Whatwillhappenwhencompilethefollowingcode publicclassTest finalintx 0 Test x 1 非法 finalintaMethod returnx final变量例 Whatwillhappenwhencompilethefollowingcode 1 classFinalTest 2 finalintq 3 4 FinalTest 5 this 0 6 q 1 7 8 FinalTest intx 9 q x 10 11 FinalTestf newFinalTest final变量例 Whatwillhappenwhencompilethefollowingcode 1 classFinalTest 2 finalintq 3 4 FinalTest 5 6 FinalTest intx 7 q x 8 9 FinalTestf newFinalTest native关键字 native只用来修饰方法 native方法用其它语言 如C语言 实现 所以没有程序代码块 publicstaticnativeintmyNativeMethod intp extends关键字和类的继承 继承是复用程序代码的有力手段 当多个类 Sub1 Sub2 Sub100 之间存在相同的属性和方法 可从这些类中抽象出父类Base 在父类Base中定义这些相同的属性和方法 所有的Sub类无需重新定义这些属性和方法 只需通过extends语句来声明继承Base类 publicclassSubextendsBase Sub类就会自动拥有在Base类中定义的属性和方法 Java中不支持多继承publicclassClassCextendsClassA ClassB 非法 abstract关键字 abstract修饰符可用来修饰类和成员方法 用abstract修饰的类表示抽象类 抽象类位于继承树的抽象层 抽象类不能被实例化 即不允许创建抽象类本身的实例 没有用abstract修饰的类称为具体类 具体类可以被实例化 用abstract修饰的方法表示抽象方法 抽象方法没有方法体 抽象方法用来描述系统具有什么功能 但不提供具体的实现 没有用abstract修饰的方法称为具体方法 具体方法具有方法体 publicabstractclassBase Base是抽象类abstractvoidmethod1 抽象方法voidmethod2 具体方法System out println method2 abstract关键字 一个类中有抽象方法 这个类必须是抽象类抽象类中可以没有抽象方法 abstractclassBase abstractvoidmethod1 abstractvoidmethod2 classSubextendsBase 编译出错 Sub类必须声明为抽象类voidmethod1 System out println method1 接口 在Java语言中 接口有两种意思 一是指概念性的接口 即指系统对外提供的所有服务 类的所有能被外部使用者访问的方法构成了类的接口 二是指用interface关键字定义的实实在在的接口 也称为接口类型 它用于明确的描述系统对外提供的所有服务 它能够更加清晰的把系统的实现细节与接口分离 publicinterfaceTransparency publicstaticfinalintOPAQUE 1 publicstaticfinalintBITMASK 2 publicstaticfinalintTRANSLUCENT 3 publicintgetTransparency 接口的特征 接口中只能包含public static final类型的成员变量和public abstract类型的成员方法 接口中不能有非抽象方法 publicinterfaceA intvar 编译出错voidmethod1 System out println method1 编译出错protectedvoidmethod2 编译出错staticvoidmethod3 System out println method3 编译出错 接口的特征 接口之间允许存在继承关系interfaceA voidmethod1 interfaceB voidmethod2 interfaceDextendsA B 合法interfaceEimplementsA B 错误 接口的实现 接口由类来实现一个类能实现许多接口 publicclassMyAppletextendsAppletimplementsRunnable MouseListener 接口的实现 interfaceSayHello voidprintMessage classSayHelloImplimplementsSayHello publicvoidprintMessage System out println Hello 接口的实现 interfaceSayHello voidprintMessage voidreceiveMessage abstractclassSayHelloImplimplementsSayHello publicvoidprintMessage System out println Hello 方法重载 overload 对于类的方法 包括从父类中继承的方法 如果有两个方法的方法名相同 但参数不一致 那么可以说 一个方法是另一个方法的重载方法 重载方法必须满足以下条件 方法名相同 方法的参数类型 个数 顺序至少有一项不相同 方法的返回类型可以不相同 方法的修饰符可以不相同 java lang Math类的用于取最大值的max方法 有多个重载方法 publicstaticintmax inta intb publicstaticlongmax longa longb publicstaticfloatmax floata floatb publicstaticdoublemax doublea doubleb inta Math max 1 2 doubled Math max 1 2 0 方法重载 overload 以下Sample类中已经定义了一个amethod 方法 publicclassSample publicvoidamethod inti Strings 加入其他方法 下面哪些方法可以加入到Sample类中 并且保证编译正确呢 A publicvoidamethod Strings inti 可以B publicintamethod inti Strings return0 不可以C privatevoidamethod inti Stringmystring 不可以D publicvoidAmethod inti Strings 可以E abstractvoidamethod inti 不可以 方法覆盖 override 方法覆盖是指子类重新实现了父类中的方法以下代码中子类覆盖了父类的一个方法 然后定义了一个重载方法 publicclassParent publicvoidmethod System out println Parent publicclassChildextendsParent publicvoidmethod System out println Child overridepublicintmethod inta overloadreturn0 方法覆盖的约束条件 子类方法的名称 参数签名和返回类型必须与父类方法的名称 参数签名和返回类型一致 publicclassBase publicvoidmethod publicclassSubextendsBase publicintmethod 编译错误 返回类型不一致return0 方法覆盖的约束条件 子类方法不能缩小父类方法的访问权限 但可以扩大访问权限 publicclassParent publicvoidmethod publicclassChildextendsParent privatevoidmethod 编译错误 方法覆盖的约束条件 子类方法不能抛出比父类方法更多的异常classExceptionAextendsException classExceptionBextendsExceptionA classExceptionCextendsExceptionB publicclassParent voidmethod throwsExceptionB publicclassChild1extendsParent voidmethod throwsExceptionA 非法 publicclassChild2extendsParent voidmethod throwsExceptionC 合法 多态性 Java语言允许某个类型的引用变量引用子类的实例 而且可以对这个引用变量进行类型转换 Animalanimal newDog Dogdog Dog animal 向下转型 把Animal类型转换为Dog类型Creaturecreature animal 向上转型 把Animal类型转换为Creature类型animal newCat 如果把引用变量转换为子类类型 称为向下转型 如果把引用变量转换为父类类型 称为向上转型 在进行引用变量的类型转换时 会受到各种限制 而且在通过引用变量访问它所引用的实例的静态属性 静态方法 实例属性 实例方法 以及从父类中继承的方法和属性时 Java虚拟机会采用不同的绑定机制 多态性 参见Tester java classFathers Stringvar FatherVar staticStringstaticVar StaticFatherVar voidmethod System out println Fathermethod staticvoidstaticMethod System out println StaticFathermethod classSonsextendsFathers Stringvar SonVar staticStringstaticVar StaticSonVar voidmethod System out println Sonmethod staticvoidstaticMethod System out println StaticSonmethod StringsonVar null voidsonMethod 多态性 参见Tester java publicclassTester publicvoidtest Fathersf newSons Fathersf newFathers Sonsf newSons Sonsf Sons newFathers System out println f var System out println f staticVar f method f staticMethod publicstaticvoidmain Stringargs newTester test 多态性 参见Tester java对于一个引用类型的变量 编译器按照它声明的类型处理 例如以下代码编译出错 Fathersf newSons f sonVar 123 f sonMethod 如果要访问Sons的成员 必须通过强制转换 Sons f sonVar 123 Sons f sonMethod Fathers varmethod staticVarstaticMethod Sons varmethod staticVarstaticMethod sonVarsonMethod 多态性 对于一个引用类型的变量 运行时按照它实际引用的对象处理 例如以下代码虽然编译可以通过 但运行时会抛出ClassCastException Fathers varmethod staticVarstaticMethod Sons varmethod staticVarstaticMethod sonVarsonMethod Fathersf newFathers Sonss Sons f throwexceptionwhenrun Animala newDog Catc Cat a throwexceptionwhenrun 多态性 成员变量 静态方法按照引用变量声明的类型静态绑定 实例方法按照引用变量引用的实例动态绑定例如 对于以下这段代码 Fathersf newSons System out println f var f var System out println f staticVar f staticVar f method f staticMethod 运行时将会输出如下结果 f var FatherVarf staticVar StaticFaterVarSonmethodStaticFathermethod Fathers varmethod staticVarstaticMethod Sons varmethod staticVarstaticMethod sonVarsonMethod 例 Whatwillbewrittentothestandardoutputwhenthefollowingprogramisrun 参见PolyTester java 参见PolyTester java classBase inti Base add 1 voidadd intv i v voidprint System out println i classExtensionextendsBase Extension add 2 voidadd intv i v 2 publicclassPolyTester publicstaticvoidmain Stringargs bogo newExtension staticvoidbogo Baseb b add 8 b print 例 Whatwillbewrittentothestandardoutputwhenthefollowingprogramisrun 参见PolyTester java 以上代码创建的是Extension类的实例 所以在运行时 所有调用add 方法的过程 将始终和Extension类的add 方法动态绑定 以下是程序依次对变量i的改变过程 初试值 i 0step1 创建实例newExtension 先调用父类的默认构造方法Base 父类的默认构造方法中执行add 1 i 0 1 2 i 2 再调用子类的默认构造方法Extension 子类的默认构造方法中执行add 2 i 2 2 2 i 6 step2 执行add 8 i 6 8 2 i 22 本例子考察知识点 方法动态绑定子类调用父类的构造方法 内部类 内部类 是在一个类的内部定义的类 匿名类是一种特殊的内部类 内部类的特性内部类的实例化 参见InnerInit java 内部类 interfaceOuterIFC voidmethod publicclassOuter publicclassInner1 实例内部类publicstaticclassInner2 静态内部类privateOuterIFCo newOuterIFC inti 1 voidmethod i 一个实现了OuterIFC接口的匿名类OuterIFCgetInstance returno voidouterMethod classInner3 局部内部类Inner3in newI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新公司注册及筹备策划书目录
- 小学加法计算专项训练题及讲解
- 建筑设计管理报告范本及写作技巧
- 小学语文教学工作阶段性总结
- 2025-2030智慧农业技术应用推广研究及农村电商发展模式分析报告
- 2025-2030智慧农业技术应用与农产品供应链优化调研规划分析
- 2025-2030智慧农业信息服务行业市场分析及行业现状评估与商业模式创新研究
- 2025-2030智慧农业产业链供需现状分析创新投资机会研究报告
- 2025-2030智慧养老院行业市场发展现状供求态势及投资风险评估规划分析研究报告
- 2025-2030智慧养老行业市场发展趋势及康复机器人投资前景深度研究
- 拌料机安全操作规程模版(3篇)
- 2024-2025学年重庆高二数学复习试题(含答案)
- 2024年内蒙古高考地理试卷(甲卷)
- 12SS508混凝土模块式室外给水管道附属构筑物
- 黑龙江省齐齐哈尔市2023-2024学年高二上学期期中英语试题(含答案)
- 抱养孩子协议书有效模板
- 2024年印尼放射治疗患者定位设备市场竞争态势与及未来趋势预测报告
- 各种阀门规格尺寸表大全
- 人工智能在智能交通的应用案例分析
- 小学数学四年级上册第二单元《公顷和平方千米》单元测试卷4份
- 产后修复课件
评论
0/150
提交评论