本帖最后由 天地有我 于 2013-8-5 20:44 编辑
interface A
{
}
class B implements A
{
public String func()
{
return "func";
}
}
class Demo3
{
public static void main(String[] args)
{
A a = new B(); // 这里存在隐式的类型转换,向上类型转换。(多态)
B b = (B)a; //func()方法是Demo3中才有的,是子类扩展的方法。
//System.out.println(a.func());
System.out.println(b.func());
}
}
多态:所谓多态,就是父类型的引用可以指向子类型的对象,或者接口类型
的引用可以指向实现该接口的类的实例。关于接口与实现接口的类之间的强
制类型转换方式与父类和子类之间的强制类型转换方式完全一样。
多态是一个子类型的应用指向父类型的对象。 方法的调用是取决于左边的类型
A a = new B();
虽然是一个B类型的引用(new B()) 但是这个应用类型指向的是一个A类型的变量 a, func()方法是B中才有的,根据多态原理父类有的子类可以继承
父类没有的,子类可以扩展,这里的func()方法就属于子类扩展的方法,所以不能用A类型的变量a来调用它,因为接口A中没有这个方法,
所以如果当一个子类型的应用指向父类型的变量而父类型有没有子类型中的所有方法的时候,这时候如果要掉用父类型中没有的方法,就不能用多态了,必须将父类型的变量强制转换成子类型的变量。
所以这里必须要向下类型转换(就是将父类型的对象转换为子类型的对象)才行。向下类型转换,不能隐式转换,只能强制类型转换,所以要将A向下强制转换为B类型,转换过后就能调用B类中的func()方法了。 |