- 1. 向下转型定义
当我们用子类的凭证去指向父类的对象时,就叫做向下转型。
class A{}
class B extends A{}
class C extends A{}
向下转型表示如下:
B b=new B();
A a=b;
B b=(B)a;
但要注意,向下转型可能会产生运行时的错误。
C c=new C();
A a=c;
B b=(B)a;
一般向下转型正确的话:
①一定经历了向上转型
public class Entrance {
public static void main(String[] args) {
A a =new C();
B b=(B)a;
}
}
A---->B---->C
- 2. 向下转型特点
①可能会产生运行时的错误(编译不会报错)
public class Entrance {
public static void main(String[] args) {
A a =new C();
B b=(B)a;
}
}
A---->B
A---->C
②向下转型并不一定会转到真正的类型上,如果仍然转到的是一个父类。则遵从我们上面所说的向上转型的特点.
③如果没有报错,对于转型后的访问和正常申明后(可能也涉及到向上转型)的访问没有区别
- 3. 避免向下转型报错的方法:使用instanceof 关键字
①子类对象 instanceof 父类(子类本身)
a instanceof b ,它的返回值要根据a指向的对象来看,并不能通过a的引用类型来看
例题:如下代码是否正确(正确)
A a=new C();
a instanceOf C
②具体使用:利用instanceof 判断后,进行向下转型从而使用子类特有的方法.
public class Entrance {
public static void main(String[] args) {
C c =new C();
test(c);
}
static void test(A a){
if(a instanceof B){
B b=b(a);
b.test1();
}
}
}
A---->B
A---->C
- 4.为什么需要向下转型
需要向下转型是因为向上转型之后,子类与父类不共同都有的方法不能使用,所以如果想要使用父类中没有但是子类拥有的方法,就必须向下转型,举例理解: