网站大量收购独家精品文档,联系QQ:2885784924

ch09 - 继承和多态(Lite).ppt

  1. 1、本文档共46页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
一个设计案例 假设要设计模拟几何对象的类,如圆和矩形,考虑的因素有颜色,是否填充,创建日期,圆的半径,矩形的周长等 不要直接就定义Class Circle和Class Rectangle,先分析几何对象的共同属性和行为。共同的属性和行为有颜色、是否填充,创建时间,以及这些属性的getter和setter行为。而圆的半径、矩形的长宽不是几何图形共有的属性。 可以设计通用类GeometricObject来模拟共有的属性和方法。而Circle、Rectangle类通过继承GeometricObject获得共同的属性和行为,同时添加自己特有的属性和行为 有派生关系的对象是如何构造的 构造Circle或Rectangle对象时,父类对象是否被构造? 为了一探究竟,可以在构造函数里打印出字符串。这是研究对象构造机制的有效办法。 从前面的实验我们知道 构造子类对象时,会先构造父类对象,再构造子类对象 盖房子要先打地基 无参构造函数 如果一个类没定义构造函数,系统会自动地加上无参构造函数 如果一个类自定义了构造函数(不管有无参数),系统不会自动加上无参构造函数 如果一个类定义了带参数的构造函数,一定别忘了定义一个无参的构造函数,原因是:由于系统不会再自动加上无参构造函数,就造成该类没有无参构造函数 缺少无参构造函数的后果 无法创建该类的对象数组。因为创建一个类的对象数组时会调用该类的无参构造函数。 如果父类没有无参构造函数,那么其子类没有定义构造函数就会编译出错。 多态(Polymorphism) 继承关系使一个子类继承父类的特征,并附加新特征 子类是父类的具体化(沿着继承链从祖先类到后代类,特征越来越具体) 每个子类的实例都是父类的实例,但反过来不成立。 Class Student extends Person{ …} Person p = new Student(); Student s = new Person();//error 这个特性是多态的重要基础 先看一个例子 多态(Polymorphism) 多态(Polymorphism) 重载和多态 重载发生在编译时(Compile time),编译时编译器根据方法签名找到最合适的方法 多态发生在运行(Run time)时,在运行时JVM根据一个引用变量所指向对象的真正类型来找到最合适的方法 有的书上把重载叫做“编译时多态”,或者叫“早期绑定”(早期指编译时) 多态是晚期绑定(晚期指运行时) 绑定是指找到函数的入口地址 Object类中的方法 Object是所有Java类的祖先类,它实现了一些有用的方法,如前面介绍的toString()方法 public boolean equals(Object object) 检验两个对象是否相等 语法:object1.equals(object2) 但该方法只是比较二个引用变量是否相等,即object1和object2是否指向同一个对象,而不是比较二个引用变量指向的对象的内容是否相等,所以子类很有必要覆盖该方法 例如二个Circle对象,如果半径相等就相等,我们可以在Circle类里覆盖该方法 public boolean equals(Object o){ if(o instanceof Circle) return this.radius == ((Circle)o).radius; else return false; } Object类中的方法 protected object clone(Object object) 复制对象 对象引用变量的赋值是不能复制对象的,要创建有单独内存空间的新对象,使用clone()方法 newobject = someobjet.clone(); 子类要实现clone方法,首先应该实现Cloneable接口,同时覆盖从Object类继承的clone方法,并将该方法改为public 类型转换 类型转换(type casting)可以将一个对象的类型转换成继承结构中的另一种类型。 从子类到父类的转换是合法的,称为隐式转换。 GreetingSender g = new GreetingSender(); g.newYearGreeting(new Manager()) ? Person p = new Manager(); g.newYearGreeting(p); 从父类到子类必须显式转换。 Person p = new Manager(); Manager m = p; //编译错 Manager m = (Manager)p;//ok 类型转换 为什么从父类到子类必须强制类型转换? 首先要理解类型检查(type checking)发

文档评论(0)

me54545 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档