在java类型转换的时候经常会遇到类型转换。例如Circle是Shape的子类(Circle extends Shape)。那么Circle的对象转换成Shape的对象则是向上转换。那么Shape类型向Circle类型转换则为向下转换。
a, 在java中类型转换中
向上类型转换是可以被接受的。拿上面的例子中来说,由于编译器知道Circle肯定是一个Shape,所以编译器允许自由的做向上类型的赋值操作
。所以红字中即使你把显示的类型转换去掉也没有关系
以下是一个简单的demo RedToy是Toy的子类。
RedToy redToy =
new
RedToy();
System.
out
.println(
"redToy is "
+ redToy);
Toy toy =
new
Toy();
System.
out
.println(
"toy1 is "
+ toy);
toy = (Toy) redToy;
//
toy = redToy;
System.
out
.println(
"toy is "
+ toy);
toy.writes();
打印日志如下:
我们可以根据HashCode来看出 当进行向上类型转换的时候。只是将父类的对象的哈希码变成了子类对象的哈希码而已。这也是多态的体现。父类对象指向子类对象的地址
而向下类型转换中还是拿Circle和Shape举例子。你要把Shape变成Circle类型的话,
由于编译期间只会知道Circle对象是一个Shape。而不知道它是Circle还是Square。所以不使用显式的类型转换,编译器就不允许执行向下赋值。
Toy toy =
new
Toy();
System.
out
.println(
"toy1 is "
+ toy);
redToy = (RedToy) toy;
// error
Toy toy1 =
new
RedToy();
System.
out
.println(
"toy2 is "
+ toy1);
redToy = (RedToy) toy1;
// success
在上面两端代码中第一段出现错误。第二段是可以运行的。根据打印结果第一个toy指向的是Toy的对象的哈希码。第二个toy1 指向的是RedToy对象的哈希码。之所以
第二个可以成功是因为toy1本身指向的就是RedToy对象
所以得出结论: -> 在向下进行类型转换的时候要么进行异常的处理 要么使用instanceof函数判断是否改类对象指向你所需要转换的那个对象。 (可以转型的情况为先把子类转父类,向下转型时候确定父类能不能转回为之前的子类)
Toy toy =
new
Toy();
System.
out
.println(
"toy1 is "
+ toy);
if
(toy
instanceof
RedToy) {
redToy = (RedToy) toy;
}
Toy toy1 =
new
RedToy();
System.
out
.println(
"toy2 is "
+ toy1);
if
(toy1
instanceof
RedToy) {
redToy = (RedToy) toy1;
}
所以instanceof和Class对象的isInstance()方法一样,判断的是你是这个类吗?或者你是这个类的派生类不。