java入门教程(六)多态

如何实现多态(域和静态方法是不具有多态性的,只有普通的方法调用可以是多态的)

  • 重载:同一个类通过定义方法名相同且参数不同来实现多态
  • 通过继承、重写、父类指向子类对象实现多态

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.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());
  }

}

输出结果:sup.field=0,sup.getField=1
sub.field=1,sub.getField=1,sub.getSuperField=0
解析:当Sub对象转型为Super引用时,任何域访问操作都由编译器解析,因此不是多态的,本例中,为Super.field和Sub.field分配了不同的存储空间。这样,Sub实际上包含两个称为field的域:它自己的和它从Super处得到的。然而,在引用Sub中的field时所产生的默认域并非Super的field域,因此为了得到Super.field,必须显示地指明super.field.

构造器中的多态

图片.png

输出结果为:22 34 17
解析:
① 子类B中重写了父类A中的setValue方法
super(5) //调用了父类构造器,其中构造函数里面的setValue(value),调用的是子类的setValue方法
finally块中的this.setValue(value) //调用的也是子类的setValue方法
而子类setValue方法中的super.setValue(2*value); //调用的是父类A的setValue方法
② try...catch...finally块中有return返回值的情况
finally块中虽然改变了value的值,但try块中返回的应该是return之前存储的值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,296评论 0 16
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,805评论 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,719评论 0 11
  • 第一章:Java程序设计概述 Java和C++最大的不同在于Java采用的指针模型可以消除重写内存和损坏数据的可能...
    loneyzhou阅读 1,298评论 1 7
  • 我在上初中的时候,在一个精美的信纸上,看到了这样一句话:“你现在的选择决定了你三年后的生活,而你现在的生活是由你三...
    菽麦阅读 472评论 2 0