「java向下转型」java向下转型报错
今天给各位分享java向下转型的知识,其中也会对java向下转型报错进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
java为什么向下转型是不安全的
先理清对象和变量之间的关系,对象类型是指对象的真实类型 一般为new 时候所指定的类型,变量是指指向对象的引用(可以为对象的类型或者对象的父类/接口类型) (多态特性)
当用父类变量指向子类类型的时候,变量只有父类的方法而不能调用子类的方法,若想调用子类的方法就要把父类变量转换为子类变量(向下转型)
但当父类变量转换为一个与真实对象不相符的子类变量的时候,就会抛出ClassCastException,所以向下转型是不安全的,正确的做法是在强制类型转换之前先使用 Instance of关键字进行判断转型后的类型和真实对象的类型是否一致,一致才执行类型转换操作;
如何理解java中的向下转型
Java里只有两种,一种是向上转型,一种是向下转型,其实原理都是一样的.
比如
人(People)
继承了
动物
这个类(Animal)
则向上转型代表
把子类赋值给父类
Animal
a
=
new
People();
向下转型则将父类的引用还原成实际的子类
People
p
=
(People)
a;
但是向下转型一定要是实际的子类,否则会报错.
比如现在多了一个
猴子(Monkey)
类
继承
动物类
之前
a
是通过
new
People()
得来的
但是向下转型的时候是不能转为猴子的,否则会报类转换异常.
如
Monkey
m
=
(Monkey)
a;
这样是会报错的.
用我们的语言其实也好理解,比如
人是属于动物,但是人不属于猴子,反之亦然,猴子也不属于人,但是是动物
java向下转型有什么用
呵呵,这个问题有意思了。
最大的用处是java的泛型编程,用处很大,java的集合类都是这样的,不过由于是向下转型,所以不是安全的。 下面是向下转型的例子:
子类转型成父类是向上转型,反过来说,父类转型成子类就是向下转型。但是,向下转型可能会带来一些问题:我们可以说麻雀是鸟,但不能说鸟就是麻雀。来看下面的例子:
A类:
package a.b;
public class A {
void aMthod() {
System.out.println("A method");
}
}
A的子类B:
package a.b;
public class B extends A {
void bMethod1() {
System.out.println("B method 1");
}
void bMethod2() {
System.out.println("B method 2");
}
}
C类:
package a.b;
public class C {
public static void main(String[] args) {
A a1 = new B(); // 向上转型
a1.aMthod(); // 调用父类aMthod(),a1遗失B类方法bMethod1()、bMethod2()
B b1 = (B) a1; // 向下转型,编译无错误,运行时无错误
b1.aMthod(); // 调用父类A方法
b1.bMethod1(); // 调用B类方法
b1.bMethod2(); // 调用B类方法
A a2 = new A();
B b2 = (B) a2; // 向下转型,编译无错误,运行时将出错
b2.aMthod();
b2.bMethod1();
b2.bMethod2();
}
}
从上面的代码我们可以得出这样一个结论:向下转型需要使用强制转换。运行C程序,控制台将输出:
Exception in thread "main" java.lang.ClassCastException: a.b.A cannot be cast to a.b.B at
a.b.C.main(C.java:14)
A method
A method
B method 1
B method 2
其实黑体部分的向下转型代码后的注释已经提示你将发生运行时错误。为什么前一句向下转型代码可以,而后一句代码却出错?这是因为a1指向一个子类B的对象,所以子类B的实例对象b1当然也可以指向a1。而a2是一个父类对象,子类对象b2不能指向父类对象a2。那么如何避免在执行向下转型时发生运行时ClassCastException异常?使用5.7.7节学过的instanceof就可以了。我们修改一下C类的代码:
A a2 = new A();
if (a2 instanceof B) {
B b2 = (B) a2;
b2.aMthod();
b2.bMethod1();
b2.bMethod2();
}
这样处理后,就不用担心类型转换时发生ClassCastException异常了。
关于java向下转型和java向下转型报错的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-01,除非注明,否则均为
原创文章,转载请注明出处。