多态复习笔记-5

多态复习笔记-5

构造器内部的多态方法的行为

在前面的笔记中我们知道了构造器的调用顺序,首先是调用了基类的构造器,假如我们将动态绑定的方法放在了构造器中,那么在调用Glyph的构造器中的draw方法实际上应该调用的是导出类RoundGlyph 中所覆盖后的draw方法,此时我们会发现一个问题:这个导出类RoundGlyph 中所覆盖后的draw方法此时并没有初始化而被调用,那么为什么没有出现问题呢?
观察运行结果我们得出结论:在其他任何事件发生之前,将分配给对象的存储空间设置为二进制的零,这样有一个优点,就是所有东西都至少初始化为零,那么进行上述操作的时候就不会出现异常。这一点可以加在前面笔记构造器调用顺序三条顺序的最前面

 package java_test1;
/*
 * 2019/7/23
 * 构造器内部的多态方法的行为
 * */
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 = " + radius);
    }
    void draw() {
      System.out.println("RoundGlyph.draw(), radius = " + radius);
    }
  }   

  public class PolyConstructors {
    public static void main(String[] args) {
      new RoundGlyph(5);
    }
  }
//output:
//  Glyph() before draw()
//  RoundGlyph.draw(), radius = 0
//  Glyph() after draw()
//  RoundGlyph.RoundGlyph(), radius = 5

协变返回类型

在java SE5与更早的版本之前强制导出类中覆盖的方法返回类型必须与基类被覆盖
同名方法返回类型一致。现在不一样,记住一句话,它很绕口

  • 在导出类中被覆盖的方法可以返回基类方法的返回类型的某种导出类型

你可能感兴趣的:(Java,新手)