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