Object 向下转型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Object 向下转型相关的知识,希望对你有一定的参考价值。
我看别人说向下转型是父子关系才能转型,那是不是意思是Object类可以向任意子类转型?
理论上这样可以,但是父类不可以访问其子类新增加的成员,所以把一个object类转换为任意类型没有意义 参考技术A 如果强制转型的话,可以转为继承链中的任意一层。用instanceof时,左边的object可以为null(不会抛异常)
除了instanceof
还可以直接比较class,因为一个类的class对象只有一份,例如
objectA.getClass() == someOtherClass.class
实际中,第二种方法速度更快,
这里有个讨论
http://stackoverflow.com/questions/4989818/instanceof-vs-getclass本回答被提问者采纳 参考技术B Object可以向任意子类转型,但是转型不一定是成功的追问
那什么情况下才转成功?只能靠instanceof判断吗?
追答只要你确信instanceof的结果是真的,不显式写出instanceof判断也可以
继承--方法覆盖--多态
继承extends
java只支持单继承,但是可以间接继承别的类,默认继承Object
继承的作用:代码重用,重要的作用是:方法的覆盖override和多态机制。
多态的前提是继承 向上转型:等号右边是子类 左边是父类 向下转型:等号右边是父类 左边是子类
向上转型:父类引用指向了(等号左边)子类的内存地址
向下转型:强制类型转换所以需要加强制类型转换符
向下转型存在ClassCastException类转换异常,所以需要加instanceof 判断一下类型:
Animal a3=new Bird();
if(a3 instanceof Cat){
Cat c1=(Cat)a3;
c1.catchMouse();
}else if(a3 instanceof Bird){
Bird b1=(Bird)a3;
b1.fly();
}
package test;
public class Test {
public static void main(String[] args) {
Animal a=new Animal();
a.move();
Cat c=new Cat();
c.move();
/**
* Animal这个是父类
* Cat这个是子类
* 子类向父类转成为自动转换类型向上转
* 在编译期a1是Animal类型
* 在运行期a1是引用指向了Cat
* 编译器和运行期是两种状态所以称为多态
*/
Animal a1=new Cat();
a1.move();
// a1.catchMouse();
Cat c1=(Cat)a1;
c1.catchMouse();
Dog d=new Dog();
d.move();
}
}
package test;
public class Animal {
public void move(){
System.out.println("动物在移动");
}
}
package test;
public class Dog extends Animal{
public void move(){
System.out.println("小狗在小跑");
}
}
package test;
public class Cat extends Animal {
public void move(){
System.out.println("小猫在走猫步");
}
public void catchMouse(){
System.out.println("猫抓老鼠");
}
}
以上是关于Object 向下转型的主要内容,如果未能解决你的问题,请参考以下文章
Object 数组 向下转型 ClassCastException
java 强转对象 object向下转型自定义的类,为啥eclipse会报黄线?