多态的三个陷阱

作者: Shingoooooo | 来源:发表于2016-10-27 15:25 被阅读49次

一、只有非private方法才可以被覆盖。

public class PrivateOverride { 
    private void f() { 
        System.out.println("private f()"); 
    }
    public static void main(String[] args) { 
        PrivateOverride po = new Derived();//UpCasting
        po.f(); 
    }
}

class Derived extends PrivateOverride { 
    public void f() { 
        System.out.println("public f()"); 
    }
} /* Output:
private f()
*/

在上面的程序中,导出类的f()是一个全新的方法,因为基类中的f()方法是private型的,在导出类中是不可见的,就更不能覆盖它了。


二、只有普通的方法调用可以是多态的。

即:如果直接访问某个域,这个访问就会在编译器进行解析。

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(); // Upcast
    System.out.println("sup.field = " + sup.field +
      ", sup.getField() = " + sup.getField());
    Sub sub = new Sub();
    System.out.println("sub.field = " +
      sub.field + ", sub.getField() = " +
      sub.getField() +
      ", sub.getSuperField() = " +
      sub.getSuperField());
  }
} /* Output:
sup.field = 0, sup.getField() = 1
sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0
*/

在上面的程序中,Super sup = new Sub();这句话对Sub对象转型为Super引用,sup.field访问的是Super类的field变量,而sup.getField()则访问的是Sup类的getField()方法。即:访问域没有表现多态,而访问普通的方法时表现了多态。


三、如果某个方法时静态的,它的行为就不具有多态性。

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(); // Upcast
    System.out.println(sup.staticGet());
    System.out.println(sup.dynamicGet());
  }
} /* Output:
Base staticGet()
Derived dynamicGet()
*/

在上面的程序中,StaticSuper sup = new StaticSub();这行代码将StaticSub对象转型为StaticSuper引用,当调用sup,staticGet()方法时,由于是静态方法而不能表现多态,因此访问的是基类的方法。这种现象由静态方法是属于类的,与对象无关也可以很好的解释。

相关文章

  • 多态的三个陷阱

    一、只有非private方法才可以被覆盖。 在上面的程序中,导出类的f()是一个全新的方法,因为基类中的f()方法...

  • 多态

    1.多态 1.多态 1.1 要点 多态是方法的多态,不是属性的多态 多态的存在有三个必要条件:继承;方法重写;父类...

  • 深入深刻深到不能再深的理解java中的重载和重写

    面向对象的三个特性 面向对象有三个重要的特性:多态,继承,封装。 多态的表现 多态的在java中的应用体现在方法的...

  • Kotlin继承与多态 (2)多态、is、as

    多态概念使用 is 和 !is 进行类型检查使用 as 和 as? 进行类型转换 一、多态概念 发生多态要有三个前...

  • Java编程思想(六)

    第8章 多态(Polymorphism) OOP语言的三个基本特征:数据抽象、继承、多态。多态也叫做动态绑定、后期...

  • Java基础day08笔记:多态|多态中成员的特点|多态的应用示

    01-面向对象(多态-概念) 接下来说一下面向对象的第三个特征:多态。 何为多态呢? 其实...

  • java面试基础

    1. 对java多态的理解 多态变现了事物的多种状态。 多态存在的三个必要条件 一、要有继承; 二、要有重写; 三...

  • 面试题

    1.多态的了解 多态存在有三个前提 继承,重写,父类引用指向子类对象。 多态成员访问的特点: a.成员变量 编译看...

  • 2017.9.20

    多态 多态性的概念 多态性是面向对象程序设计的第三个重要特征。 多态性是指发出同样的消息被不同类型的对象接收时导致...

  • 能力陷阱

    这本书主要提醒我们不要陷入三个陷阱:能力陷阱、人际️圈陷阱、真实自我的陷阱。 能力陷阱:我们总是习惯于做我们擅长的...

网友评论

    本文标题:多态的三个陷阱

    本文链接:https://www.haomeiwen.com/subject/lifsuttx.html