一、向上转型
1、什么是向上转型
向上转型是将子类类型的引用赋值给父类类型的引用的过程,即将具有某个特定子类型的对象的引用赋给对其进行了声明的父类型的引用。这样做是安全的,因为子类型对象总是能够完全符合父类型对象的需求。
2、向上转型的语法
父类类型 引用名称 = new 子类类型();
3、向上转型的示例代码
class Animal{ public void move(){ System.out.println("move animal"); } } class Dog extends Animal{ public void move(){ System.out.println("move dog"); } public void bark(){ System.out.println("dog barks"); } } public class Test{ public static void main(String[] args){ Animal animal = new Dog(); //向上转型 animal.move(); //输出结果:move dog //不能引用子类Dog类独有的方法bark } }
二、向下转型
1、什么是向下转型
向下转型是将父类类型的引用转换为子类类型的引用。当我们使用向上转型创建了一个父类引用指向子类的对象后,如果要使用子类特有的方法或属性的话则就必须进行向下转型。
2、向下转型的语法
子类类型 引用名称 = (子类类型) 父类类型引用名称;
3、向下转型的示例代码
class Animal{ public void move(){ System.out.println("move animal"); } } class Dog extends Animal{ public void move(){ System.out.println("move dog"); } public void bark(){ System.out.println("dog barks"); } } public class Test{ public static void main(String[] args){ Animal animal = new Dog(); //向上转型 if(animal instanceof Dog) { Dog dog = (Dog) animal; //向下转型 dog.bark(); //输出结果:dog barks } } }
三、instanceof关键字
1、什么是instanceof关键字
instanceof是Java中的一个二元运算符,用于在运行时确定某个对象是否是一个特定类的一个实例。
2、使用场景
在向下转型时,如果没有使用instanceof关键字进行类型判断,就有可能会在运行时抛出ClassCastException异常。
3、示例代码
class Animal{ public void move(){ System.out.println("move animal"); } } class Dog extends Animal{ public void move(){ System.out.println("move dog"); } public void bark(){ System.out.println("dog barks"); } } public class Test{ public static void main(String[] args){ Animal animal = new Animal(); //创建Animal对象 if(animal instanceof Dog) { Dog dog = (Dog) animal; //向下转型 dog.bark(); //不会执行到此行代码 }else{ System.out.println("animal is not a dog"); //输出结果:animal is not a dog } } }
四、总结
Java中的子类转父类和父类转子类都是非常常用的操作。当我们需要使用子类特有的方法或属性时,就需要进行向下转型,而在进行向下转型时需要使用instanceof关键字进行类型判断,以避免抛出ClassCastException异常。向上转型可以使代码更加灵活,并且降低了耦合度,使代码更加易于维护。