已阅读5页,还剩108页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 2020年2月2日星期日 第5章 继承与多态 2 2020年2月2日星期日 继承性与多态性是面向对象程序设计的另外两个重要特性 在Java语言中 提供了能够实现继承性与多态性的完备技术 这使得更多的人们愿意将Java作为软件开发语言 进而充分地施展面向对象抽象性 封装性 继承性与多态性的优势 为构筑新时代的软件开发理念奠定了坚固基础 3 2020年2月2日星期日 7 1类的继承 继承机制是面向对象程序设计不可缺少的关键概念 是实现软件可重用的根基 是提高软件系统的可扩展性与可维护性的主要途径 继承是一种由已有的类创建新类的机制 所谓继承是指一个类的定义可以基于另外一个已经存在的类 即子类基于父类 从而实现父类代码的重用 由继承而得到的类称为子类 被继承的类称为父类或超类 Java不支持多重继承 子类只能有一个父类 4 2020年2月2日星期日 继承关系的UML图形符号表示法 两个类的继承关系可以用 isa 表示 即子类是父类所描述的实体集中的子集 也就是说 父类涵盖更加共性的特征 更加具有一般性 子类增加的内容更加具有个性 是一般性之外的特殊内容 因此 又可以说 这种类的继承关系充分地反映了 一般与特殊 的关系 5 2020年2月2日星期日 7 1 1定义子类 在Java语言中 定义子类的语法格式为 修饰符 class子类名extends父类名 子类体 其中 修饰符 是子类的访问特性说明符等 class为定义类的关键字 子类名 是子类的名称 extends是关键字 子类体 是子类在继承父类内容的基础上 添加的特有内容 6 2020年2月2日星期日 EmployeeClass类与ManagerClass类的关系图 特殊津贴 7 2020年2月2日星期日 filename EmployeeClass javapublicclassEmployeeClass 雇员类privateStringname 姓名privatedoublesalary 工资privateStringdepartment 部门publicEmployeeClass publicEmployeeClass Stringname doublesalary Stringdepartment publicvoidsetName Stringname publicvoidsetSalary doublesalary publicvoidsetDepartment Stringdepartment publicStringgetName publicdoublegetSalary publicStringgetDeparyment publicStringtoString 8 2020年2月2日星期日 publicManagerClassextendsEmployeeClass 经理类privatedoublespecial 特殊津贴publicManagerClass publicManagerClass Stringname doublesalary Stringdepartment doublespecial publicvoidsetSpecial doublespecial publicdoublegetSpecial publicStringtoString 9 2020年2月2日星期日 举例 设计与几何图元有关的类 问题分析 几何图元是指可以绘制的基本几何图形 例如矩形 正方形 圆形 多边形等 鉴于篇幅的考虑 这里只考虑矩形与正方形 假设任何几何图元都有颜色与位置两个属性 因此应该将这些共有特性定义在一个类中 它是顶层类 而矩形还应该有长 宽两个属性 由于矩形是一种几何图元 所以它自然应该拥有几何图元的共有特性 因此可以将矩形类设计为几何图元类的子类 因为正方形是一种特殊的矩形 它的特殊性在于长与宽相等 所以应该将正方形类设计为矩形的子类 10 2020年2月2日星期日 ShapeClass类 RectangleClass类与SquareClass类之间的关系类图 ShapeClass类是几何图元的通用类 矩形是一种特定的几何图元 因此 RectangleClass类应该是ShapeClass的子类 正方形是一种特殊的矩形 所以SquareClass类是RectangleClass类的子类 11 2020年2月2日星期日 12 2020年2月2日星期日 filename ShapeClass javaimportjava util publicclassShapeClass 几何图元类privateColorClasscolor 颜色属性privatePointplace 位置属性publicShapeClass color newColorClass place newPoint publicShapeClass ColorClasscolor Pointplace this color color this place place publicvoidsetColor ColorClasscolor this color color publicvoidsetPlace Pointplace this place place publicColorClassgetColor returncolor publicPointgetPlace returnplace publicStringtoString returncolor toString n place toString 13 2020年2月2日星期日 filename RectangleClass javapublicclassRectangleClassextendsShapeClass 矩形类privateintlength 长privateintwidth 宽publicRectangleClass super length 0 width 0 publicRectangleClass ColorClasscolor Pointplace intlength intwidth super color place this length length this width width publicintarea returnlength width 计算矩形的面积publicintpermeter return2 length width 计算矩形的周长publicintgetLength returnlength publicintgetWidth returnwidth publicvoidsetLW intlength intwidth this length length this width width publicStringtoString return length length width width 14 2020年2月2日星期日 filename SquareClass javapublicclassSquareClassextendsRectangleClass 正方形类publicSquareClass super publicSquareClass ColorClasscolor Pointplace intedge super color place edge edge publicintgetEdge returngetLength publicvoidsetEdge intedge setLW edge edge 15 2020年2月2日星期日 7 1 2子类对父类成员的可访问特性 实际上 子类是对父类概念的延伸 它不但继承了父类的内容 还可以扩展父类的某些功能 在Java语言中 子类将继承父类的成员 但对父类成员的可访问性却由访问特性控制 如果子类与父类在同一个包中 子类可以直接访问父类具有public proteced与默认访问特性的成员 不能直接访问private成员 这部分内容需要通过父类提供的操作接口实现间接访问 如果子类和父类不在同一个包中 那么 子类继承了父类的protected public成员变量做为子类的成员变量 并且继承了父类的protected public方法为子类的方法 继承的成员或方法的访问权限保持不变 16 2020年2月2日星期日 子类对象的构造过程 用子类创建对象时 不仅子类中声明的成员变量被分配了内存 而且父类的成员变量也都分配了内存空间 但只将其中一部分 子类继承的那部分 作为分配给子类对象的变量 17 2020年2月2日星期日 18 2020年2月2日星期日 练习 阅读代码 说出运行结果 classCar privateintsite 4 座位数Car System out println 载客量是 site 人 publicvoidsetSite intsite this site site voidprint System out print 载客量是 site 人 classBusextendsCar Bus intsite setSite site publicstaticvoidmain String args Busbus newBus 20 bus print 载客量是4人载客量是20人 20 2020年2月2日星期日 7 1 3子类构造方法的定义与执行 在Java程序中 子类不负责调用父类中带参数的构造方法 在创建子类对象时需要在构造方法中利用super 调用父类的构造方法 以便能够对从父类继承过来的成员变量初始化 Java语言规定 必须将调用父类构造方法的这条语句放在子类构造方法的第一条语句位置 如果第一条语句没有调用父类的构造方法 系统将会自动地在这个位置上插入一条调用父类默认构造方法的语句 21 2020年2月2日星期日 由于默认的构造方法不带参数 所以 如果在父类中定义了带参数的构造方法 而没有定义不带参数的构造方法将会出现编译错误 因此建议大家在定义带参数的构造方法时 一定要定义一个不带参数的构造方法 父类中那些带参数的构造方法 子类将不会自动地调用它们 必须人工地将调用它们的语句写入子类的构造方法中 22 2020年2月2日星期日 super关键字 子类可以隐藏从父类继承的成员变量和方法 如果在子类中想使用被子类隐藏的成员变量或方法就可以使用关键字super 使用super调用父类的构造方法子类不继承父类的构造方法 因此 子类如果想使用父类的构造方法 必须在子类的构造方法中使用 并且必须使用关键字super来表示 而且super必须是子类构造方法中的头一条语句 23 2020年2月2日星期日 例 publicclassStudent intnumber Stringname Student Student intnumber Stringname this number number this name name publicintgetNumber returnnumber publicStringgetName returnname publicclassUniverStudentextendsStudent booleanisMarriage 子类新增的结婚属性UniverStudent intnumber Stringname booleanb super number name publicbooleangetIsMarriage returnisMarriage 例5 6使用Super调用父类的构造方法 P117 24 2020年2月2日星期日 使用super操作被隐藏的成员变量和方法 在子类中想使用被子类隐藏的成员变量或方法就可以使用关键字super 比如super x super play 就是访问和调用被子类隐藏的成员变量x和方法play 25 2020年2月2日星期日 例 publicclassSum intn publicdoublef doublesum 0 for inti 1 i n i sum sum i returnsum publicclassAverageextendsSum doublen 子类继承的int型变量n被隐藏publicdoublef doublec 子类double型变量n进行int转换运算的结果赋值给隐藏的int型变量nsuper n int n c super f returnc n publicdoubleg doublec c super f returnc n 例5 7 P118 26 2020年2月2日星期日 final关键字 1 final修饰成员变量如果一个成员变量前面有final修饰 那么这个成员变量就变成了常量 一经赋值 就不允许在程序的其他地方修改 定义方式如下 finaltypevariableName 例如classConstTimeExpress finalintMaxHour 23 finalintMaxMinute 59 finalintMaxSecond 59 27 2020年2月2日星期日 2 final修饰方法方法的final修饰符表明方法不能被子类覆盖 带有final修饰符的方法称为最终方法 Java的方法除非被说明为最终方法 否则方法是可以被覆盖的 Java之所以这样规定 主要是因为Java的纯面向对象特性 它把覆盖当作面向对象的重要特性 给予了最大限度的实现 把方法声明为最终方法有时可增加代码的安全性 使用方式如下 finalreturnTypemethodName paramList 例如 finalintgetLength Strings 例5 8使用final关键字 P120 28 2020年2月2日星期日 3 final类final类不能被继承 由于安全性的原因或者是面向对象的设计上的考虑 有时候希望一些类不能被继承 例如 Java中的String类 它对编译器和解释器的正常运行有很重要的作用 不能轻易改变它 因此把它修饰为final类 使它不能被继承 这就保证了String类型的唯一性 同时 如果你认为一个类的定义已经很完美 不需要再生成它的子类 这时也应把它修饰为final类 定义一个final类的格式如下 finalclassfinalClassName 29 2020年2月2日星期日 7 2类成员方法的重载与覆盖 成员的隐藏 P113 在子类继承父类成员的同时 子类自己还可以定义新的成员 当子类中定义的新成员变量与父类中某个成员变量的名字相同时 子类会把父类中的相应成员变量隐藏起来 当子类中定义的成员方法与父类中某个成员方法的名字相同时属于成员方法的重载或覆盖 这是常用的程序设计技术 30 2020年2月2日星期日 7 2 1重载与覆盖 在子类中 除了从父类继承的成员方法之外 还可以自定义一些成员方法 其中主要包括下列几种形式 在父类中没有的 全新的成员方法 对父类中已有的成员方法进行重载 对父类中已有的成员方法进行覆盖 方法覆盖的语法规则如果子类可以继承父类的某个实例方法 那么子类就有权利重写这个方法 方法重写是指 子类中定义一个方法 这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型 并且这个方法的名字 参数个数 参数的类型和父类的方法完全相同 方法覆盖的目的子类通过方法的重写可以隐藏继承的方法 子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为 31 2020年2月2日星期日 1 成员方法的重载 P113 成员方法的重载是指当子类中定义与父类中同名的成员方法 但参数列表不同 或者在一个类中定义多个同名的成员方法 但它们之间的参数列表不同 无论是在子类与父类之间重载成员方法 还是在一个类中重载成员方法 其主要目的都是为了扩展操作的接口格式 使之更加适于人们的操作习惯 提高软件系统操作的方便性与灵活性 32 2020年2月2日星期日 EmployeeClass 雇员类privateStringname 姓名privatedoublesalary 工资privateStringdepartment 部门 其他成员方法publicvoidsetInfo Stringname doublesalary Stringdepartment this name newString name this salary salary this department newString department publicManagerClassextendsEmployeeClass 经理类privatedoublespecial 特殊津贴 其他成员方法publicvoidsetInfo Stringname doublesalary Stringdepartment doublespecial super name salary department this special special 33 2020年2月2日星期日 2 成员方法的覆盖 P114 当子类中定义的成员方法与父类中某个成员方法的名称与参数列表完全一样时被称为成员方法的覆盖 在Java中 成员方法的名称与参数列表统称为签名 其主要原因是父类中成员方法提供的操作功能不能满足子类的需求 采用覆盖手段将父类中相应的成员方法隐藏起来 而用子类中定义的成员方法替代 34 2020年2月2日星期日 在定义具有覆盖特征的成员方法时 通常有下面两种形式 在子类定义的成员方法中 首先调用父类中被覆盖的成员方法 再添加一些操作语句 这种形式可以达到对父类被覆盖成员方法的功能给予补充 增强 在子类定义的成员方法中 没有调用父类中被覆盖的成员方法 而是全新的语句组 这种形式可以达到对父类被覆盖成员方法的全部覆盖 当子类对象的某项操作与父类对象相应的操作过程完全不同时 常常采取这种方式实现 35 2020年2月2日星期日 classA doublef floatx floaty returnx y publicintg intx inty returnx y classBextendsA doublef floatx floaty returnx y publicclassExample5 4 publicstaticvoidmain Stringargs Bb newB doubleresult b f 5 6 b调用重写的方法System out println 调用重写方法得到的结果 result intm b g 3 5 b调用继承的方法System out println 调用继承方法得到的结果 m 例5 4 P114 36 2020年2月2日星期日 7 2 2多态性的实现 面向对象程序设计提出了消息驱动的概念 所谓消息是指一个对象请求另外一个对象帮助完成某项操作的规格说明 消息中至少应该包含接收方的信息及具体请求的操作说明 当一个对象向另外一个对象发送消息时 接收到消息的对象就会给予响应 这就使得静止的对象被激活 这就是人们常说的消息驱动 37 2020年2月2日星期日 将同一个消息发送给不同的类对象 可能会得到完全不同的相应效果 称此现象为多态性 在Java程序中 多态性是指不同的类对象调用同一个签名的成员方法时将执行不同代码段的现象 38 2020年2月2日星期日 具体实现方式是 首先 在子类中覆盖父类的某个成员方法 然后 定义父类的对象引用 并由它引用创建的子类对象 当在调用成员方法时 根据实际引用的对象类型确定最终调用哪个成员方法 由于直到程序执行时才会得知引用的对象类型 所以究竟执行哪个成员方法在程序执行时才能够动态地确定 而不是在程序编译时确定 这种连接机制称为动态联编 39 2020年2月2日星期日 实现多态性需要具备下面两个条件 1 多态性作用于子类对象 它是依赖于类层次结构中的一项功能 在Java语言中 允许父类对象的引用具体指向其任何子类对象 人们将此称为置换法则 即在出现父类对象的地方可以用其子类对象置换 上转型 这是实现多态性的先决条件 因此需要先定义一个指向父类的引用 然后 根据需要在程序的运行过程中让它引用其子类的对象 并根据当前引用的对象类型调用相应的成员方法 2 具有多态性的成员方法必须同时包含在父类与子类中 且对应的成员方法签名完全一样 即是子类覆盖父类的那些成员方法 40 2020年2月2日星期日 class动物 voidcry class狗extends动物 voidcry System out println 这是狗的叫声 汪汪 汪汪 class猫extends动物 voidcry System out println 这是猫的叫声 喵喵 喵喵 publicclassExample5 10 publicstaticvoidmain Stringargs 动物animal new狗 animal是狗的上转型对象animal cry animal new猫 animal是狗的上转型对象animal cry 例5 10 P123 上转型对象 假设 A类是B类的父类 当用子类创建一个对象 并把这个对象的引用放到父类的对象中时 比如 Aa a newB 这时 称对象a是对象b的上转型对象 对象的上转型对象 子类可以改写父类的方法 而上转型对象 父类的对象 可以调用改写后的方法 不同的子类可能改写的内容不同 比如 动物类中的cry 方法 在子类 猫 中可以改写为 喵喵 而在子类 狗 中可以改定为 汪汪 猫类的和狗类的上转型对象在调用cry 方法时是各不相同的 publicclassExample5 9 publicstaticvoidmain Stringargs Peoplepeople newPeople Anthropoidmonkey people monkey是people对象的上转型对象 monkey crySpeak Ilovethisgame monkey n 100 非法 puter 12 19 非法System out println monkey m System out println people m Peoplezhang People monkey puter 55 33 zhang m T System out println zhang m publicclassAnthropoid doublem 12 58 voidcrySpeak Strings System out println s publicclassPeopleextendsAnthropoid charm A intn 60 voidcomputer inta intb intc a b System out println a 加 b 等于 c voidcrySpeak Strings System out println m s m 42 2020年2月2日星期日 例5 9P122 上转型对象 对象的上转型对象的实体是子类负责创建的 但上转型对象会失去原对象的一些属性和功能 相当于子类对象的一个 简化 对象 上转型对象具有如下特点 1 上转型对象不能操作子类新增的成员变量 不能调用子类新增的方法 2 上转型对象可以访问子类继承或隐藏的成员变量 也可以调用子类继承的方法或子类重写的方法 上转型对象操作子类继承的方法或重写的方法时 其作用等价于子类对象去调用这些方法 44 2020年2月2日星期日 7 3抽象类 Java语言中 用abstract关键字来修饰一个类时 这个类叫做抽象类 一个abstract类只关心它的子类是否具有某种功能 并不关心该功能的具体实现 功能的具体行为由子类负责实现的 在Java语言中 抽象类的定义格式为 修饰符 abstractclass抽象类名 成员变量与成员方法 用abstract来修饰一个方法时 该方法叫做抽象方法 abstract类必须被继承 abstract方法必须被重写 45 2020年2月2日星期日 抽象类中可以包含抽象方法 为所有子类定义一个统一的接口 对抽象方法只需声明 而不需实现 因此它没有方法体 其格式如下 abstractreturnTypeabstractMethod paramlist 说明 抽象类中既可定义抽象方法 也可以定义非抽象方法 即抽象类中不是所有的方法都是抽象方法 46 2020年2月2日星期日 filename Animal javapublicabstractclassAnimal protectedStringtype 种类protectedStringname 名称protectedStringbreed 品种publicAnimal Stringtype Stringname Stringbreed this type newString type this name newString name this breed newString breed publicStringtoString return Thisisa type nIt s name the breed publicabstractvoidsound 抽象方法 47 2020年2月2日星期日 filename Dog javapublicclassDogextendsAnimal 狗类publicDog Stringname super Dog name Unknow publicDog Stringname Stringbreed super Dog name breed publicvoidsound System out println WoofWoof filename Cat javapublicclassCatextendsAnimal 猫类publicCat Stringname super Cat name Unknow publicCat Stringname Stringbreed super Cat name breed publicvoidsound System out println Miiaooww filename Duck javapublicclassDuckextendsAnimal 鸭子类publicDuck Stringname super Duck name Unknow publicDuck Stringname Stringbreed super Duck name breed publicvoidsound System out println Quackquackquack 48 2020年2月2日星期日 Animal theAnimals newDog Rover Poodle newCat Max Abyssinian newDuck Daffy Aylesbury for inti 0 i theAnimals length i theAnimals i sound 运行结果 WoofWoofMiiaoowwQuackquackquack 49 2020年2月2日星期日 在使用抽象类时 需要注意下面几点 任何包含抽象方法的类都必须声明为抽象类 否则将出现编译错误 由于抽象类不是一个完整的类 因此不能够被实例化 即不能够创建抽象类的对象 但可以定义抽象类的引用 并用它引用该抽象类的某个可实例化子类的对象 这是实现多态性的另一种常见方式 抽象类主要用于派生子类 且在子类中实现抽象类中的所有抽象方法 如果在子类中没有实现全部的抽象方法 则必须继续将没有被实现的方法声明成抽象方法 此时的子类仍然需要声明为抽象类 static private和final修饰符不能应用于抽象方法 50 4 1接口 接口及其实现用接口实现多重继承 51 4 1接口 接口 interface 是一组常量和抽象方法的集合 是一种引用数据类型 关于接口 用于描述抽象的概念 约定多个类共同使用的常量和抽象方法 抽象方法的具体实现由实现接口的类完成 实现接口的类必须覆盖接口中的所有抽象方法 52 1 声明接口 public interface接口 extends父接口 public static final 数据类型成员变量 常量值 public abstract 返回值类型成员方法 参数列表 4 1 1接口与实现接口的类 例如publicinterfacePlane1 平面图形接口 publicabstractdoublearea 计算面积 53 2 声明实现接口的类 4 1 1接口与实现接口的类 修饰符 class类 extends父类 implements接口列表 例如publicclassRectangle2implementsPlaneGraphics2 注意 一个类可以实现一个或多个接口 如果一个类实现多个接口 则声明时必须用逗号分隔每个接口名 54 4 1 1接口与实现接口的类 3 接口的作用 方法声明 接口中声明的抽象方法约定了多个类共用的方法声明 方法实现 每个实现接口的类可以根据自身的实际情况 给出抽象方法的具体实现 接口 提供方法声明与方法实现相分离的机制 使多个类之间表现出共同的行为能力 接口中的一个抽象方法在实现接口的多个类中表现出多态性 55 3 接口的作用 4 1 1接口与实现接口的类 图4 1图形接口与实现图形接口的类 56 4 1 1接口与实现接口的类 3 接口的作用 例4 1 图形接口与实现图形接口的类 设计平面图形接口PlaneGraphics2 设计长方形类Rectangle2 实现平面图形接口 57 4 接口的特点 4 1 1接口与实现接口的类 1 接口及接口中成员的访问权限都是public 2 接口中的成员方法都是公有的 抽象的实例成员方法 3 接口中的所有抽象方法必须全部被实现接口的类覆盖 一个非抽象类如果声明实现一个接口 则该类必须覆盖接口中的所有抽象方法 即参数列表必须一样 不能仅重载而不覆盖 并且类中的成员方法必须声明为public 即使该类不需要某方法 也必须覆盖接口中的抽象方法 可以用一个空方法或返回默认值的方法覆盖 58 4 1 1接口与实现接口的类 4 接口的特点 例如 publicdoubleperimeter 覆盖接口中的抽象方法 返回默认值 return0 publicvoidprint 覆盖接口中的抽象方法为空方法 一个实现接口的抽象类 可以覆盖接口中的部分抽象方法 59 4 1 1接口与实现接口的类 4 接口的特点 4 接口中的成员变量都是常量 接口中成员变量的默认修饰符为publicstaticfinal 接口中不能声明实例成员变量 声明时 必须为常量赋值 在实现接口的类中 不能为接口中的成员变量赋值 例如 publicinterfaceDirection 方向接口 publicstaticfinalintLEFT 0 声明2个方向的常量publicstaticfinalintRIGHT 1 60 4 1 1接口与实现接口的类 4 接口的特点 6 接口是引用数据类型 5 接口不能被实例化 接口是引用数据类型 可以声明接口的变量 接口变量能够获得实现接口的类的对象 也称为接口对象 接口变量不能调用接口中没有声明的方法 Java中不能创建接口的实例 由于构造方法不能是抽象的 接口中不包含构造方法 61 4 1 1接口与实现接口的类 例如 classPlaneGraphics2 ex publicstaticvoidmain Stringargs PlaneGraphics2g1 newRectangle2 10 20 长方形g1 print 运行时多态性g1 newEllipse2 10 20 椭圆g1 print 62 4 1 2用接口实现多重继承 1 一个类可以继承一个父类并实现多个接口 图4 2继承机制 一个类在声明继承一个直接父类的同时 还可以声明实现多个接口 则实现了多重继承 63 4 1 2用接口实现多重继承 例4 2 长方体类继承长方形类并实现一个接口的问题 设计立体图形接口SolidGraphics2 设计长方体类Cuboid1 继承长方形类并实现立体图形接口 长方体类Cuboid1中必须再次覆盖area 和print 方法 计算周长方法存在问题 64 图4 3长方体类的多重继承 65 4 1 2用接口实现多重继承 例4 3 球类实现多个接口 图4 4球类的多重继承 66 4 1 2用接口实现多重继承 2 接口的继承 一个接口允许被声明为继承一个已存在的父接口 接口的继承性仍是单重继承 即一个接口只能有一个父接口 例如 publicinterfaceSolidGraphics2extendsPlaneGraphics2 立体图形接口继承平面图形接口 publicabstractdoublevolume 计算体积 继承了父接口的两个抽象方法area 和print 67 4 1 2用接口实现多重继承 图4 5接口的继承 2013 68 5 10 3接口回调 接口回调是指 可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中 那么该接口变量就可以调用被类重写的接口方法 实际上 当接口变量调用被类重写的接口方法时 就是通知相应的对象调用这个方法 例5 16 publicclassExample5 16 publicstaticvoidmain Stringargs ShowMessagesm 声明接口变量sm newTV 接口变量中存放对象的引用sm 显示商标 长城牌电视机 接口回调 sm newPC 接口变量中存放对象的引用sm 显示商标 联想奔月5008PC机 接口回调 interfaceShowMessage void显示商标 Strings classTVimplementsShowMessage publicvoid显示商标 Strings System out println s classPCimplementsShowMessage publicvoid显示商标 Strings System out println s 69 2020年2月2日星期日 70 4 1 2用接口实现多重继承 3 接口与抽象类的区别 相同点 两者都包含抽象方法 约定多个类共用方法的参数列表和返回值 两者都不能被实例化 两者都是引用数据类型 其变量可被赋值为子类或实现接口类的对象 不同点 抽象类约定多个子类之间共同使用的方法 接口约定多个互不相关类之间共同使用的方法 抽象类与子类之间采用单重继承机制 一个类实现多个接口则实现了多重继承的功能 71 4 1 2用接口实现多重继承 3 接口与抽象类的区别 不同点 抽象类及其类中成员具有与普通类一样的访问权限 接口的访问权限有public和缺省两种 接口中成员的访问权限均是public 抽象类中可以包含非抽象方法 也可以声明构造方法 接口中的方法全部是抽象方法 不能声明构造方法 抽象类中可以声明成员变量 子类可以对该成员变量赋值 接口中只能声明常量 72 4 1 2用接口实现多重继承 4 Java用接口实现多重继承比C 多重继承的优越之处 在单重继承机制下 通过子类对象调用父类的方法 Java将在父类及若干祖先类中寻找指定方法 寻找的路径首先是父亲 再沿着继承关系依次向上 一旦找到指定方法则执行该方法 这条寻找路径是线性结构 在C 的多重继承机制下 通过子类对象调用父类的方法 必须在多个父类构成的非线性结构 图结构 中寻找待执行方法 因此查找范围大 运行效率低 73 4 1 2用接口实现多重继承 图4 6Java单重继承时执行父类或祖先类中的方法 74 2020年2月2日星期日 7 5包 包是Java语言中有效地管理类的一个机制 包名的目的是有效的区分名字相同的类 在Java中 包是用于组织类与接口的机制 面向对象程序设计方法强调程序代码的重用性 重用的基本单位将以类或接口的形式展现 按照功能将类与接口分装在不同的包中有两点好处 一是便于将若干个已存在的类或接口整体地加载到一个程序中 二是避免出现名称冲突的现象 Java语言规定 在一个包中不允许有相同名称的类文件 但对于在不同包中的类没有这种限制 原因在于加载每个类时将指出类所在的包 这样便可以区别不同包中的类 75 2020年2月2日星期日 Java虚拟机 JVM 决定如何创建和存储包 子包以及相应的编译单元 并决定哪些顶层包名称在特定的编译中是可见的 以及决定哪些包是可访问的 包可以存储在在当地文件系统中 分布式文件系统当中 或者某种形式的数据库中 Java系统必须支持至少一个无名包 也叫缺省包 一般为当前目录 在开发小的或者临时的应用程序或者刚刚开始开发时 用无名包是非常方便的 76 2020年2月2日星期日 package语句作为Java源文件的第一条语句 为该源文件中声明的类指定包名 创建一个包且将类文件放入其中的语法格式为 packagepkg1 pkg2 pkg3 例如 如果希望将类文件放入名字为userPackage的包中 可以这样写 packageuserPackage packagejava awt image packagemyPackage package语句 77 2020年2月2日星期日 如果要指定包中的子包就需要按层次顺序书写包序列 包之间用逗号分隔 例如 如果希望将一个类文件放入userPackage1的子包userPackage2的子包userPackage3中 就应该将包语句写成 packageuserPackage1 userPackage2 userPackage3 78 2020年2月2日星期日 另外 包层次的根目录路径是由环境变量classpath来确定的 Java的JDK提供的包 也叫基础类库 包括 Java applet java awt java awt datatransfer java awt event java awt image java beans java io java lang java lang reflect java math java rmi java security java sql java util等 每个包中都包含了许多有用的类和接口 用户也可以定义自己的包来实现自己的应用程序 Java的基础类库其实就是JDK安装目录下面jre lib rt jar这个压缩文件 学习基础类库就是学习rt jar 基础类库里面的类非常非常多 但是真正对于我们来说最核心的只有几个 例如java lang java io java util java sql 等 79 2020年2月2日星期日 通过导入语句 import 将包中的类加载到程序中 并通过类名或接口名引用这些类或接口 导入语句的基本格式 importpackage1 package2 classname import后跟包名序列及类名 例如 要将上面创建的包中的类加载到程序中 应该在程序的开始 包语句之后 书写下列导入语句 importuserPackage import语句 80 2020年2月2日星期日 引入类库中的类如果用户需要类库中的类就必须使用import语句 importjava util Date importjava util importjavax swing event 引入自定义包中的类如果用户程序可以使用tom jiafei自定义包中的类 即使用非类库中有包名的类 也要使用import语句 例如 importtom jiafei 81 2020年2月2日星期日 使用无包名的类如果一个类想使用无名包中的类 只要将这个无包名的类的字节码和当前类保存在同一目录中即可 区分无包名和有包名的类如果想同时使用tom jiafei包中的A类和无名包中的A类 就不能省略包名 例如 Aa1 newA tom jiafei Aa2 newtom jiafei A 区分有包名的类如果一个源文件引入了两个包中同名的类 那么在使用该类时 不允许省略包名 例如 tom jiafei Abird newtom jiafei A Agoat A 82 2020年2月2日星期日 83 2020年2月2日星期日 JAR文件的使用 JAR文件就是JavaArchiveFile 是Java的一种文档格式 JAR文件非常类似ZIP文件 准确的说 它就是ZIP文件 JAR文件与ZIP文件唯一的区别就是在JAR文件的内容中 包含了一个META INF MANIFEST MF文件 这个文件是在生成JAR文件的时候自动创建的 可以使用jar exe把一些文件压缩成一个JAR文件 来发布我们的应用程序 jar exe是随JDK安装的 在JDK安装目录下的bin子目录中 文件名为jar exe 我们可以把java应用程序中涉及到的类压缩成一个JAR文件 比如Tom jar 然后使用java解释器使用参数 jar执行这个压缩文件 如下格式java jarTom jar或用鼠标双击该文件 就可执行这个压缩文件 84 2020年2月2日星期日 JAR文件的制作步骤如下 首先 假设应用程序中有两个类A B 其中A类是主类 其中包含了main 方法 1 首先用文本编辑器比如Windows下的记事本编写一个清单文件Mymoon mfManifest Version 1 0Main Class ACreated By 1 2 2 SunMicrosystemsInc 比如 保存Mymoon mf到如D user zlz 需要注意的是在编写清单文件时 在 Manifest Version 和 1 0 之间 Main Class 和主类 A 之间 以及 Created By 和 1 2 2 之间必须有且只有一个空格 85 2020年2月2日星期日 2 生成JAR文件D user zlz jarcfmTom jarMymoon mfA classB class其中cfm参数中c表示要生成一个新的JAR文件 f表示要生成的JAR文件的名字 m表示文件清单文件的名字 现在就可以将Tom jar文件拷贝到任何一个安装了java运行环境上 只要用鼠标双击该文件就可以运行该java应用程序了 说明 如果机器上没有安装过中文版WinRAR解压缩软件 那么Tom jar的文件类型是ExecutableJarFile 如果机器上安装过中文版WinRAR解压缩软件 并将 jar文件与该解压缩软件做了关联 那么Tom jar的文件类型是WinRAR 在这种情况下 当用鼠标双击该文件时WinRAR解压缩软件会运行起来准备进行解压缩操作 使得我们的java程序无法运行 因此在发布我们的软件时 还应该再写一个有如下内容的bat文件Tom batTom bat文件中内容如下 java jarTom jar另外再写一个帮助文件help txt 用来说明该应用软件的功能 使用说明的内容 可以用鼠标双击A bat或Tom jar来运行本软件 可以将该 bat文件 jar文件 帮助文件一同发布 86 2020年2月2日星期日 javap反编译 JDK提供的反编译器javap exe可以将字节码反编译为源码 查看源码类中的public方法名字和public成员变量的名字例如 java
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司拆船工岗位职业健康技术规程
- 农业经理人操作规范模拟考核试卷含答案
- 2025-2026学年冀教版(新教材)二年级上册第七单元(期末复习)达标试卷附参考答案
- 海水的性质与运动(同步训练)-2026年高考地理一轮复习(解析版)
- 轨迹、路径类综合练习(提优)-2026年中考数学几何专项复习(解析版)
- 河南省商丘市2024-2025学年高一年级下册期末考试英语试卷
- 揭秘数学之韵
- 教育创新与技术融合
- 教学课件创新设计
- 第四单元 可能性(单元测试提高卷)-2026五年级数学上册(人教版)含答案
- 空调维保投标方案(技术标)
- 工伤认定申请表(范表)
- 《公路水下隧道设计规范》(3371-2022)
- 巴马格卷绕头说明书模板
- 高中化学竞赛有机化学-芳香烃
- 网架挠度测量观测的内业成果整理-三角高程测量观测成果的记录、整理与验算
- 长荣股份:投资性房地产公允价值评估报告
- A320飞动模必看宝典
- 原子核物理习题解答
- GB/T 23001-2017信息化和工业化融合管理体系要求
- GB 31603-2015食品安全国家标准食品接触材料及制品生产通用卫生规范
评论
0/150
提交评论