转型
概念: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("小猫喵喵喵~~~");
}
@Override
public 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"原则(每个子类对象都是其父类的一个实例),而向下转型则需要更多的注意,因为它涉及到类型兼容性的检查和潜在的运行时错误。