Java | 向下转型与运行时类型识别

来源:互联网 发布:海湾编程软件 下载 编辑:程序博客网 时间:2024/06/05 11:41

向上转型(在继承层次中向上移动)会丢失具体的类型信息,但是向上转型是安全的,因为基类不会具有大于导出类的接口。所以,通过基类接口发送的信息保证都能被接受。


向下转型,即在继承层次中向下移动,能够获取类型信息,但是必须要有某种方法来确保向下转型的正确性,使不致于贸然转型到一种错误类型,进而发出该对象无法接受的消息。这样做是不安全的。在C++中,这就需要执行一个特殊的操作来获得安全的向下转型。但是在Java中,所有类型都会得到检查,即使我们只是进行一次普通的加括弧形式的类型转换,在进入运行期间时仍然会对其进行检查,以便保证它的确是所希望的那种类型。如果不是,就会返回一个ClassCastException(类型转换异常)。这种在运行期间对类型进行检查的行为称作“运行时类型识别”(RTTI)


class Useful{public void f(){System.out.println("Useful-f()");}public void g(){System.out.println("Useful-g()");}}class MoreUseful extends Useful{public void f(){System.out.println("MoreUseful-f()");}public void g(){System.out.println("MoreUseful-g()");}public void u(){System.out.println("MoreUseful-u()");}public void v(){System.out.println("MoreUseful-v()");}public void w(){System.out.println("MoreUseful-w()");}}public class RTTI{public static void main(String[] args){Useful[] x={new Useful(),new MoreUseful()};x[0].f();x[1].g();((MoreUseful)x[1]).u();((MoreUseful)x[0]).u();}}

编译时通过,运行时会抛出异常