向上转型:将子类对象的引用转换为父类对象的引用,这就是向上转型。
”为新的类提供方法“这并不是继承中最重要的方面,其最重要的是用来表现新类和基类之间的关系。这种关系是”新类是现有类的一种类型“ 也就是is-a。例如:假设有一个称为Animal的代表动物的类和一个称为dog的导出类。继承可以保证基类中的所有的可继承方法(除了私有方法,不同包情况下的包访问权限方法)在导出类中也同样有效,所以能向基类发送的信息同样也可以向导出类发送。如:Animal有一个public的eat()方法,那么dog类也将具有此方法。这也就意味着dog对象也是一种类型的Animal。看一个例子:
class Animal { public void eat(){} static void tune(Animal a){ //.... a.eat(); } } public class Dog extends Animal{ public static void main(String[] args){ Dog hashiqi = new Dog(); Animal.tune(hashiqi); //向上转型 } }
public class Shape { public void draw(){System.out.println("Shape.draw()"} public void earse(){System.out.println("Shape.earse()"} } public class Square extends Shape{ public void draw(){System.out.println("Square.draw()"} public void earse(){System.out.println("Square.earse()"} } public class Circle extends Shape{ public void draw(){System.out.println("Circle.draw()"} public void earse(){System.out.println("Circle.earse()"} } public class Triangle extends Shape{ public void draw(){System.out.println("Triangle.draw()"} public void earse(){System.out.println("Triangle.earse()"} } public class Test{ public static void main(String[] args){ Shape s = new Circle(); s.draw(); s.erase(); } }输出:
class Super{ public int field = 0; public int getField(){ return field;} } public class Sub extends Super{ public int field = 1; public int getField(){ return field;} public int getSuperField{return super.field;} //显示调用父类的域 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;
class Super{ public static String staticGet(){ return "base class staticGet()"; } public String dynamicGet(){ return "base class dynamicGet()"; } } public class Sub extends Super{ public static String staticGet(){ return "export class staticGet()"; } public String dynamicGet(){ return "export class dynamicGet()"; } public static void main(String[] args){ Super sup = new Sub(); //向上转型 System.out.println(sup.staticGet()); System.out.println(sup.dynamicGet()); } } 输出: base class staticGet() export class dynamicGet()有输出结果可以看出,静态方法不具有多态性,静态方法是与类,而非单个对象相关联的。