




已阅读5页,还剩31页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章面向对象 2 继承 上转型 多态 课程安排 访问权限 类有2种重要的成员 成员变量和方法 类创建的对象可以通过 运算符访问分配给自己的变量 也可以通过 运算符调用类中的实例方法和类方法 类在定义声明成员变量和方法时 可以用关键字private protected和public来说明成员变量和方法的访问权限 使得对象访问自己的变量和使用方法受到一定的限制 1 私有变量和私有方法用关键字private修饰的成员变量和方法被称为私有变量和私有方法 对于私有成员变量或方法 只有在本类中创建该类的对象时 这个对象才能访问自己的私有成员变量和类中的私有方法 访问权限 访问权限 classEmployee privatedoublesalary 1800 私有属性 类外无法访问publicvoidsetSalary doublesalary if salary 1800 publicclassExample publicstaticvoidmain Stringargs Employeezhang newEmployee Employeewang newEmployee zhang setSalary 100 System out println zhang的薪水 zhang getSalary wang setSalary 3888 wang salary 88888 是非法的 因为对象wang已经不在Employee类中System out println wang的薪水 wang getSalary 用某个类在另外的一个类中创建对象后 如果不希望该对象直接访问自己的变量 即通过 运算符来操作自己的成员变量 就应将该变量访问权限设置为private 面向对象编程提倡对象应当调用方法来改变自己的属性 我们应当提供操作数据的方法 这些方法可以经过精心设计 使得对数据的操作更加合理 2 公有变量和公有方法用public修饰的成员变量和方法被称为共有变量和共有方法 如 classA publicfloatweight weight被修饰为public的float型变量 publicfloatf floata floatb 方法f是public方法 访问权限 当我们在任何一个类中用类A创建了一个对象后 该对象能访问自己的public变量和类中的public方法 如 classB voidg Aa newA a weight 23f 合法a f 3 4 合法 3 受保护的成员变量和方法用protected修饰的成员变量和方法被称为受保护的成员变量和受保护的方法 如 classA protectedfloatweight weight被修饰为public变量 protectedfloatf floata floatb f是public方法 访问权限 假如B与A是同一个包中的类 那么 B类中的a weight a f 3 4 都是合法的 classB voidg Toma newTom a weight 23f 合法a f 3 4 合法 假设对象a是类A创建的 对象对成员的访问权限总结如下 一个类可以把对象作为自己的成员变量 如果用这样的类创建对象 那么该对象中就会有其它对象 也就是说该对象将其他对象作为自己的组成部分 或者说该对象是由几个对象组合而成 对象的组合 对象的组合 publicclassRectangle privatedoublex y width height publicvoidsetX doublex this x x publicdoublegetX returnx publicclassCircle privatedoublex y radius publicvoidsetX doublex this x x publicdoublegetX returnx publicclassGeometry privateRectanglerect privateCirclecircle Geometry Rectanglerect Circlecircle this rect rect this circle circle publicvoidsetCirclePosition doublex doubley circle setX x circle setY y 生活中的继承 生活中 继承的例子随处可见 动物 食草动物 食肉动物 谁是父类 谁是子类 能说出继承的特点吗 继承需要符合的关系 is a 父类更通用 子类更具体 生活中的继承 子类具有父类的一般特性 包括属性和行为 以及自身特殊的特性 巴士是汽车吗 卡车是汽车吗 出租车是汽车吗 汽车 请问 出租车包含哪些属性和行为呢 子类与父类继承是一种由已有的类创建新类的机制 利用继承 我们可以先创建一个共有属性的一般类 根据该一般类再创建具有特殊属性的新类 新类继承一般类的状态和行为 并根据需要增加它自己的新的状态和行为 由继承而得到的类称为子类 被继承的类称为父类 超类 子类与父类 父类可以是自己编写的类也可以是java类库中的类 利用继承有利于实现代码的重复使用 子类只需要添加新的功能代码即可 Java不支持多重继承 即子类只能有一个父类 使用关键字extends来声明一个类是另外一个类的子类 格式如下 class子类名extends父类名 子类与父类 1 继承的定义所谓类继承就是子类继承父类的成员变量和方法作为自己的成员变量和方法 就好象它们是在子类中直接声明一样 当然 子类能否继承父类的变量和方法还有一定的限制 下面对其进行详细介绍 2 子类和父类在同一包中的继承性如果子类和父类在同一个包中 那么子类自然地继承了其父类中不是private的成员变量作为自己的成员变量 并且也自然地继承了父类中不是private的方法作为自己的方法 继承的成员变量以及方法的访问权限保持不变 3 子类和父类不在同一包中的继承性如果子类和父类不在同一个包中 那么子类只能继承父类的protected public成员变量和方法 继承的成员或方法的访问权限不变 子类与父类 classFather privateintmoneyDollar 300 intmoneyHK 200 intadd intx inty returnx y classSonextendsFather intmoneyRMB 800 publicvoidchangMoneyHK intx moneyHK x publicvoidchangMoneyRMB intx moneyRMB x intsubs intx inty returnx y 子类与父类 publicclassExample publicstaticvoidmain Stringargs inta 5 b 3 Sonson newSon son changMoneyHK 666 son changMoneyRMB 5000 System out println 儿子的港币是继承的属性 当前的值是 son moneyHK System out println 儿子的人民币是新增的属性 当前的值是 son moneyRMB System out printf 减法是儿子新增的功能 d d等于 d n a b son subs a b System out printf 加法是儿子继承的功能 d d等于 d n a b son add a b 子类与父类 当用子类的构造方法创建一个子类的对象时 子类的构造方法总是先调用父类的某个构造方法 如果子类的构造方法没有指明使用父类的哪个构造方法 子类就调用父类的不带参数的构造方法 子类对象的构造过程 1 成员变量的隐藏子类可以隐藏继承的成员变量 当在子类中定义和父类中同名的成员变量时 子类就隐藏了继承的成员变量 即子类对象以及子类自己声明定义的方法操作与父类同名的成员变量 成员变量隐藏与方法重写 classA publicdoubley 11 456789 publicvoidf y y 1 System out printf y是double型的变量 y f n y classBextendsA inty 0 publicvoidg y y 100 System out printf y是int型的变量 y d n y classExample publicstaticvoidmain Stringargs Bb newB b y 200 b g 调用子类新增的方法b f 调用子类继承的方法 2 方法重写子类也可以隐藏方法 子类通过方法重写来隐藏继承的方法 方法重写是指 子类中定义一个方法 并且这个方法的名字 返回类型 参数个数和类型与从父类继承的方法完全相同 子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为 这时 如果子类想使用被隐藏的方法 必须使用关键字super 我们将在后面讲述super的用法 成员变量隐藏与方法重写 classA protecteddoublex 8 0 y 0 888888 publicvoidspeak System out println 我喜欢NBA publicvoidcry y x y System out printf y f n y classBextendsA inty 100 z publicvoidspeak z 2 y System out println IloveThisGame System out printf y d z d y z classExample publicstaticvoidmain Stringargs Bb newB b cry b speak Super关键字有两种用法 一种用法是子类使用super调用父类的构造方法 另一种用法是子类使用super调用被子类隐藏的成员变量和方法 1 使用super调用父类的构造方法子类不继承父类的构造方法 因此 子类如果想使用父类的构造方法 必须在子类的构造方法中使用并且必须使用关键字super来表示 而且super必须是子类构造方法中的第一条语句 成员变量隐藏与方法重写 classA intx y A x 100 y 200 A intx inty this x x this y y classBextendsA intz B intx inty super x y z 300 B super 可以省略z 800 publicvoidf System out printf x d y d z d n x y z publicclassExample publicstaticvoidmain Stringargs Bb1 newB 10 20 b1 f Bb2 newB b2 f 2 使用super操作被隐藏的成员变量和方法当子类中定义了一个方法 并且这个方法的名字 返回类型 参数个数和类型和父类的某个方法完全相同时 子类从父类继承的这个方法将被隐藏 如果我们在子类中想使用被子类隐藏的成员变量或方法就可以使用关键字super 成员变量隐藏与方法重写 classBextendsA intm 1 n 1 longf longresult 0 super m 10 super n 20 result super f m n returnresult longg longresult 0 result super f returnresult 2 classExample publicstaticvoidmain Stringargs Bb newB b m 3 b n 7 longresultOne b g longresultTwo b f longresultThree b g System out println resultOne resultOne System out println resultTwo resultTwo System out println resultThree resultThree classA intm 0 n 0 longf returnm n final类不能被继承 即不能有子类 如 finalclassA 将一个类声明为final类一般是由于安全性考虑 因为一旦一个方法被修饰为final方法 则这个方法不能被重写 即不允许子类通过重写隐藏继承的final方法 final类和final方法 1 对象的上转型我们经常说 老虎是哺乳动物 狗是哺乳动物 等 若哺乳类是老虎类的父类 这样说当然正确 但当你说老虎是哺乳动物时 老虎将失掉老虎独有的属性和功能 下面我们就介绍对象的上转型对象 假设 B是A的子类或间接子类 当我们用子类B创建一个对象 并把这个对象的引用放到A类声明的对象中时 比如 Aa a newB 对象的上转型对象 那么就称对象a是子类对象b的上转型对象 对象的上转型对象的实体是子类负责创建的 但上转型对象会失去原对象的一些属性和功能 对象的上转型对象 1 上转型对象不能操作子类声明定义的成员变量 也不能使用子类声明定义的方法 2 上转型对象可以操作子类继承的成员变量和隐藏的成员变量 也可以使用子类继承的或重写的方法 3 上转型对象不能操作子类新增的方法和成员变量 4 可以将对象的上转型对象再强制转换到一个子类对象 这时 该子类对象又具备了子类所有属性和功能 对象的上转型对象 classA doublen intm voidf System out printf 子类继承方法f n f m d n n m voidg System out printf 你好 n f m d n n m classBextendsA intn 12 voidg System out printf 子类重写方法g n d m d n n m voidcry System out printf 子类新增的方法 n d m d n n m publicclassExample publicstaticvoidmain Stringargs Aa a newB a是子类对象的上转型对象a n 0 618 操作子类隐藏的double类型成员na m 200 操作子类继承的成员m 等价于b m 200 a f 调用子类继承的方法 等价于b f a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论