向上转型:将子类的实例赋值给父类类型的引用变量。这样做的好处是可以统一对待不同子类的对象,提高代码的灵活性和可扩展性。例如:
Animal animal = new Dog(); // 向上转型
这里 Dog
类是 Animal
类的子类,通过向上转型,我们可以使用 animal
引用变量访问 Animal
类中定义的方法和属性,而不需要知道具体是哪个子类的实例。
我们为什么需要向上转型:例如在animal类中定义了一个方法为了让cat和dog都可以使用则方法中的参数为(cat)(dog)这样就出现了两个方法体相同但是参数的变量名不同,这样则会显得十分冗余,所以我们通过多态的向上转型,让animal中的方法参数为animal类型这样就可以只写一个方法,不论是cat还是dog向上转型后即可调用父类中的这个方法。
向下转型:将父类类型的引用变量转换为子类类型。这样做是为了访问子类特有的方法和属性。需要注意的是,向下转型可能会引发 ClassCastException
异常,因此在进行向下转型时应该先使用 instanceof
运算符进行类型检查。例如:
if (animal instanceof Dog) {
Dog dog = (Dog) animal; // 向下转型
dog.bark();
}
我们为什么需要向下转型:例如在向上转型之后编译看左边运行看右边,但是因为我们向上转型成了父类则在调用方法时不可以使用子类中特有的方法,因为编译时会报错,所以我们对于这个对象在转换成父类后调用方法后,即可将这个对象复原,重新回到自己这个状态,向下转型后即可。
注意:如果不通过向下转型而去通过子类在new一个子类对象再去调用子类方法是可以的,但是已经不是在对同一个对象进行操作了,这时是两个对象。