向上和向下?
向上转型和向下转型是在继承中出现的情形。
通俗的理解,向上转型,将子类转成父类,向下转型,将父类转成子类,java中提供自动的向上转型
向上转型时,如果父类含有f()方法,子类中不含有f()方法,此时,调用时将执行父类中的f()方法
向上转型时,如果父类含有f()方法,子类中也含有f()方法,此时,调用时将执行子类中的f()方法
向上转型时,如果子类含有f()方法,父类中不含有f()方法,此时,调用时将会出错
class Father{ Father() { // System.out.println(static_data); // System.out.println("调用父类的构造函数"); } void f() { System.out.println("执行父类f()方法"); } } class Son extends Father{ Son() { // System.out.println("调用子类的构造函数"); } void f(){ System.out.println("执行子类中的f()方法"); } void g() { System.out.println("执行子类的g()方法"); } } public class test2 { public static void main(String[] args) { Father son = new Son(); son.f(); //由于向上转型,只能调用父类中的方法 //son.g(); } }
向下转型,可想而知是将父类型转为子类型,这样做是有一定风险的,向上转型可以看成一种窄化处理,而向下转型可以看成一种宽化处理,java中,一旦涉及宽化就可能出现问题。因此,一般不建议向下转型操作。向下转型会进行严格的检查,如在运行期间会对类型进行"运行时类型识别"RTTI。下面是一个例子:
将上面程序中的
Father son = new Son();
改为:
Son father = (Son)new Father();
运行时会出现异常: