首页投稿(暂停使用,暂停投稿)java入门教程

java入门教程(六)多态

2017-02-13  本文已影响0人  iamlyly

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

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之前存储的值。

上一篇下一篇

猜你喜欢

热点阅读