转型
概念:Java数据类型转换是将一种数据类型的值转换为另一种数据类型的值。在Java中,数据类型转换可以分为两种:向上转型和向下转型
向上转型
是把子类对象当作父类对象来使用的过程(自动转型)。在向上转型中,我们创建一个子类对象并将其赋给一个父类类型的引用变量。这个过程不需要进行强制类型转换,因为子类对象始终可以被当作其父类类型的对象来处理。例如,如果有一个Animal
类和一个继承自Animal
的Cat
类,我们可以创建一个Cat
对象并将其赋给一个Animal
类型的引用变量。这样做的好处是可以访问该对象在父类中定义的属性和方法。
class Animal {String AnimalAttr = "Animal属性";public void eat(){System.out.println("动物吃饭");}public void sleep(){System.out.println("动物睡觉");}
}class Cat extends Animal{String catAttr = "Cat属性";public void shout(){System.out.println("小猫喵喵喵~~~");}@Overridepublic void sleep() {System.out.println("小猫睡觉");}
}public class Test01 {public static void main(String[] args) {Animal animal = new Cat();System.out.println(animal.AnimalAttr);animal.eat();animal.sleep();//animal.shout();报错}
}
运行结果:
Animal属性
动物吃饭
小猫睡觉
向下转型
是将父类对象显式转换为子类对象的过程(强制转换)。在向下转型中,我们需要对父类引用进行强制类型转换以获得子类类型的引用。这种转换是有风险的,因为它可能导致ClassCastException
,特别是当试图将一个实际上不是子类对象的父类对象向下转型时。因此,在执行向下转型之前,通常需要使用instanceof
操作符来检查对象是否真的是子类的实例。
class Animal {
}
class Dog extends Animal{public void eat(){System.out.println("小狗吃骨头~~~");}
}
class Cat extends Animal{public void shout(){System.out.println("小猫:喵喵喵~~~");}
}
public class Test01 {public static void main(String[] args) {//错误示范:ClassCastException - 类型转型异常//原因:父类类型不能直接转换为子类类型// Animal animal = new Animal();// Dog dog = (Dog) animal;// dog.eat(); //经验:向下转型之前,必须向上转型Animal animal = new Cat();if(animal instanceof Dog){//判断引用animal中所指向的对象是否是Dog类型Dog dog = (Dog) animal;dog.eat();}else if(animal instanceof Cat){//判断引用animal中所指向的对象是否是Cat类型Cat cat = (Cat) animal;cat.shout();} }
}
运行结果:
小猫:喵喵喵~~~
注意:
- 向上转型后,可以调用父类非私有化的成员属性
- 向上转型后,可以调用父类非私有化的成员方法
- 向上转型后,不可以调用子类的成员属性和成员方法
- 向上转型后,可以调用子类重写父类的方法
- 总结来说,向上转型是安全且常用的,它允许我们利用继承关系中的"is-a"原则(每个子类对象都是其父类的一个实例),而向下转型则需要更多的注意,因为它涉及到类型兼容性的检查和潜在的运行时错误。