此代码表示将在此处执行向下转换,不会抛出任何异常。但是对象(a)已经是类Dog3,那么为什么要再次向下转换它?当我创建这个对象(a)的类动物,然后试图向下转换它时抛出异常。但是在java tpoint中它说这可以用instanceof运算符。是这样吗?
class Animal
{
}
class Dog3 extends Animal
{
static void method(Animal a)
{
if(a instanceof Dog3){
Dog3 d=(Dog3)a;//downcasting
System.out.println("ok downcasting performed");
}
}
public static void main (String [] args)
{
Animal a=new Dog3();
Dog3.method(a);
}
}
答案 0 :(得分:1)
您的对象(在堆上)的类型为Dog3
,当然不会改变。但是指向它的引用可以是Dog3
或anything super Dog3
,如果要使用Dog3
引用,则应该更改它,例如使用{{1}中的某些特定方法} class
答案 1 :(得分:0)
例如,如果将以下内容添加到主方法中:
public static void main (String [] args)
{
Animal a=new Dog3();
Dog3.method(a);
Animal a2 = new Animal();
Dog3.method( a2 );
}
在method
的第二次调用中,不会发生向下转换。第二次调用显示可以将Animal
传递给您的方法,因此您必须在方法体中考虑这种可能性,或者有时您的方法会抛出异常。