Java什么情况下强转型 编译不报错,运行会报错?

如题所述

向下强制转型——把一个父类(或祖先类)引用强制转换成一个子类(或孙类)引用,是不会发生编译错误的。

但如果这个父类(或祖先类)引用实际引用(指向)的对象,不是一个子类(或孙类)对象,运行时就会抛出异常。

举例来说,如果鸟类和狗类都是动物类的子类。

如果有一个动物类的引用a引用了一个鸟类对象,则此时将a强制转换成狗类引用,就不会报编译错误,但运行时会抛出类型转换异常。

因为a这个装动物的笼子,实际上关的是一只鸟,而需要的动物是一只狗。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-05-27
package Test2;

public class A extends B{
public static void main(String[] args) {
B b=new A();
//此为向下转型,当父类转型成子类时(不需要强制转型),编译和运行都不会报错
b.setS("this b");
System.out.println(b.getS());
A a=(A)new B();
//此为强制转型,当子类被强制转型成父类时,编译不会报错,但是运行会报错
a.setS("this a");
System.out.println(a.getS());
}
}
class B{
String s;
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
}
下面是输出结果
this b
Exception in thread "main" java.lang.ClassCastException: Test2.B cannot be cast to Test2.A
at Test2.A.main(A.java:8)
第2个回答  2021-05-13
任何情况下,只要对象是父类(例如object),都不会报错。
但是运行时送入的不是真实的对象类型,就必然会报错。本回答被网友采纳
第3个回答  2021-05-13
测试代码如下:

public class Test {
static abstract class Base {}

static class Derived1 extends Base {}
static class Derived2 extends Base {}
static void test(Base b) {
Derived1 d1 = (Derived1)b;
}
public static void main(String []args) {
Base b1 = new Derived2();
test(b1);
}
}
相似回答