




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java 中的多态性理解(注意与 C+区分) Java 中除了 static 方法和 final 方法(private 方法本质上属于 final 方法,因为不能被子类访 问)之外,其它所有的方法都是动态绑定,这意味着通常情况下,我们不必判定是否应该进 行动态绑定它会自动发生。 final 方法会使编译器生成更有效的代码,这也是为什么说声明为 final 方法能在一定程度上 提高性能(效果不明显)。 如果某个方法是静态的,它的行为就不具有多态性: class StaticSuper public static String staticGet() return “Base staticGet()“; public String dynamicGet() return “Base dynamicGet()“; class StaticSub extends StaticSuper public static String staticGet() return “Derived staticGet()“; public String dynamicGet() return “Derived dynamicGet()“; public class StaticPolymorphism public static void main(String args) StaticSuper sup = new StaticSub(); System.out.println(sup.staticGet(); System.out.println(sup.dynamicGet(); 输出: Base staticGet() Derived dynamicGet() 构造函数并不具有多态性,它们实际上是 static 方法,只不过该 static 声明是隐式的。因此, 构造函数不能够被 override。 在父类构造函数内部调用具有多态行为的函数将导致无法预测的结果,因为此时子类对象 还没初始化,此时调用子类方法不会得到我们想要的结果。 class Glyph void draw() System.out.println(“Glyph.draw()“); Glyph() System.out.println(“Glyph() before draw()“); draw(); System.out.println(“Glyph() after draw()“); class RoundGlyph extends Glyph private int radius = 1; RoundGlyph(int r) radius = r; System.out.println(“RoundGlyph.RoundGlyph(). radius = “ + rad ius); void draw() System.out.println(“RoundGlyph.draw(). radius = “ + radius); public class PolyConstructors public static void main(String args) new RoundGlyph(5); 输出: Glyph() before draw() RoundGlyph.draw(). radius = 0 Glyph() after draw() RoundGlyph.RoundGlyph(). radius = 5 为什么会这样输出?这就要明确掌握 Java 中构造函数的调用顺序: (1)在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制 0; (2)调用基类构造函数。从根开始递归下去,因为多态性此时调用子类覆盖后的 draw() 方法(要在调用 RoundGlyph 构造函数之前调用 ),由于步骤 1 的缘故,我们此时会发现 radius 的值为 0; (3)按声明顺序调用成员的初始化方法; (4)最后调用子类的构造函数。 只有非 private 方法才可以被覆盖,但是还需要密切注意覆盖 private 方法的现象,这时虽 然编译器不会报错,但是也不会按照我们所期望的来执行,即覆盖 private 方法对子类来说 是一个新的方法而非重载方法。因此,在子类中,新方法名最好不要与基类的 private 方法 采取同一名字(虽然没关系,但容易误解,以为能够覆盖基类的 private 方法)。 Java 类中属性域的访问操作都由编译器解析,因此不是多态的。父类和子类的同名属性都 会分配不同的存储空间,如下: / Direct field access is determined at compile time. class Super public int field = 0; public int getField() return field; class Sub extends Super public int field = 1; public int getField() return field; public int getSuperField() return super.field; public class FieldAccess public static void main(String args) Super sup = new Sub(); System.out.println(“sup.filed = “ + sup.field + “, sup.getField() = “ + sup.getField(); Sub sub = new Sub(); System.out.println(“sub.filed = “ + sub.field + “, sub.getField() = “ + sub.getField() + “, sub.getSuperField() = “ + sub.getSuperField(); 输出: sub.filed = 1, sub.getField() = 1, sub.getSuperField() = 0 sup.filed = 0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025安徽合肥市长丰县下塘镇招聘村(社区)后备干部12名考前自测高频考点模拟试题及一套完整答案详解
- 2025黑龙江齐齐哈尔市讷河市发展和改革局所属事业单位选调9人考前自测高频考点模拟试题附答案详解(突破训练)
- 2025河南省职工医院药学部招聘8人考前自测高频考点模拟试题(含答案详解)
- 2025内蒙古自治区阿尔山市属国有企业外部董事拟进入人员考前自测高频考点模拟试题及答案详解(有一套)
- 2025广东云浮市郁南县林业局招聘生态管护人员2人模拟试卷及答案详解(易错题)
- 2025江西南昌市劳动保障事务代理中心招聘1名外包驾驶员考前自测高频考点模拟试题有答案详解
- 2025年甘肃甘南玛曲县人民法院司法警务辅助人员考前自测高频考点模拟试题有完整答案详解
- 2025年临沂郯城县教育系统部分事业单位公开招聘教师(13名)考前自测高频考点模拟试题及答案详解(网校专用)
- 2025桂林市中医医院招聘模拟试卷参考答案详解
- 2025年4月广东广州市民政局幼儿园编外教辅人员招聘1名模拟试卷及答案详解(典优)
- 2024-2025学年河北省保定市定州市统编版四年级上册期中质量检测道德与法治试卷
- 2024年烟草知识考试题库
- 沙钢杯第十一届全国钢铁行业职业技能竞赛(金属轧制工)理论试题及答案
- 人教版九年级上册-历史全册课件(课件)【部编教材】
- NB-T+33008.1-2018电动汽车充电设备检验试验规范 第1部分:非车载充电机
- 【新课标】高中生物新课程标准考试题三套
- 微量注射泵的使用操作评分标准
- 《无线通信基础及应用》课件第4章
- 高中历史必修一复习提纲
- 公关经理培训课程
- 南海特产与美食课件
评论
0/150
提交评论