java中的多态性理解(注意与c++区分)_第1页
java中的多态性理解(注意与c++区分)_第2页
java中的多态性理解(注意与c++区分)_第3页
java中的多态性理解(注意与c++区分)_第4页
java中的多态性理解(注意与c++区分)_第5页
已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论