java编程思想中说到了向下强制类型转换,还有一个例子
import java.util.*;
class Useful {
public void f() {}
public void g() {}
}
class MoreUseful extends Useful {
public void f() {}
public void g() {}
public void u() {}
public void v() {}
public void w() {}
}
public class RTTI {
public static void main(String[] args) {
Useful[] x = {
new Useful(),
new MoreUseful()
};
x[0].f();
x[1].g();
// Compile-time: method not found in Useful:
//! x[1].u();
((MoreUseful)x[1]).u(); // Downcast/RTTI
((MoreUseful)x[0]).u(); // Exception thrown 向下转换产生异常
}
} ///:~
这个例子中,向下类型转换中的语句产生异常,书上也没说怎么处理这个异常。
我想问下:java中是不是不允许使用向下类型转换(应该不是,因为书上还提到了RTTI),如果允许,那么怎么避免这种异常?
import java.util.*;
class Useful {
public void f() {}
public void g() {}
}
class MoreUseful extends Useful {
public void f() {}
public void g() {}
public void u() {}
public void v() {}
public void w() {}
}
public class RTTI {
public static void main(String[] args) {
Useful[] x = {
new Useful(),
new MoreUseful()
};
x[0].f();
x[1].g();
// Compile-time: method not found in Useful:
//! x[1].u();
((MoreUseful)x[1]).u(); // Downcast/RTTI
((MoreUseful)x[0]).u(); // Exception thrown 向下转换产生异常
}
} ///:~
这个例子中,向下类型转换中的语句产生异常,书上也没说怎么处理这个异常。
我想问下:java中是不是不允许使用向下类型转换(应该不是,因为书上还提到了RTTI),如果允许,那么怎么避免这种异常?
MoreUseful u1 = (MoreUseful)u;
这种才叫向下类型转换第二种是不允许的,要抛运行时错误
Useful x[0] = new Useful();class MoreUseful extends Useful {}((MoreUseful)x[0]).u(); 你这不是向下类型转换。内存中的类型与编译时的类型都是 Useful
jvm 不知道向哪个方向转换类型。
instanceof
Useful u = new MoreUseful();
MoreUseful m = (MoreUseful)u;向下转型不报错的前提是,内存中的对象是子类对象
比如上面的u虽然是一个父类的引用,但是内存中实际上是子类对象,所以就可以转
是这条语句么?Useful x[0] = new Useful();
Useful x[0] 是申明的引用类型,x[0]是逻辑对象(指向内存中的实例)。