面试题答案
一键面试向上转型实现代码复用与扩展
- 代码复用
- 在Java中,向上转型是指将一个子类对象赋值给其父类类型的变量。例如,在这个类体系中:
Animal animal = new Dog();
- 由于
Dog
类继承自Mammal
类,而Mammal
类又继承自Animal
类,Dog
对象拥有Animal
类和Mammal
类的所有非私有属性和方法。当进行向上转型后,通过animal
变量可以调用Animal
类中定义的方法。这样可以实现代码复用,比如Animal
类中有一个eat
方法,Dog
类继承后无需重新实现就可以直接使用。
class Animal { public void eat() { System.out.println("Animal is eating"); } } class Mammal extends Animal {} class Dog extends Mammal {} public class Main { public static void main(String[] args) { Animal animal = new Dog(); animal.eat(); } }
- 这段代码中,
Dog
对象向上转型为Animal
类型,然后调用Animal
类的eat
方法,实现了代码复用。
- 代码扩展
- 向上转型方便在父类类型的集合中存储不同子类的对象,实现多态。例如,可以创建一个
Animal
类型的列表,然后将Dog
、Cat
(假设还有Cat
类继承自Animal
)等不同子类的对象放入其中。
import java.util.ArrayList; import java.util.List; class Animal { public void makeSound() { System.out.println("Animal makes a sound"); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog barks"); } } class Cat extends Animal { @Override public void makeSound() { System.out.println("Cat meows"); } } public class Main { public static void main(String[] args) { List<Animal> animals = new ArrayList<>(); animals.add(new Dog()); animals.add(new Cat()); for (Animal animal : animals) { animal.makeSound(); } } }
- 这里通过向上转型,将不同子类对象放入
Animal
类型的列表中,在遍历列表调用makeSound
方法时,会根据对象的实际类型(运行时类型)调用相应子类的重写方法,实现了代码的扩展,很方便地添加新的子类而不需要大幅修改原有代码。
- 向上转型方便在父类类型的集合中存储不同子类的对象,实现多态。例如,可以创建一个
可能遇到的问题及解决方案
- 问题:无法访问子类特有方法
- 当进行向上转型后,通过父类变量只能访问父类中定义的方法和属性。例如,如果
Dog
类有一个特有的bark
方法,向上转型后Animal
变量无法直接调用该方法。
class Animal {} class Dog extends Animal { public void bark() { System.out.println("Dog is barking"); } } public class Main { public static void main(String[] args) { Animal animal = new Dog(); // animal.bark(); // 编译错误,Animal类中没有bark方法 } }
- 解决方案:使用instanceof关键字进行类型判断,然后进行向下转型。
class Animal {} class Dog extends Animal { public void bark() { System.out.println("Dog is barking"); } } public class Main { public static void main(String[] args) { Animal animal = new Dog(); if (animal instanceof Dog) { Dog dog = (Dog) animal; dog.bark(); } } }
- 当进行向上转型后,通过父类变量只能访问父类中定义的方法和属性。例如,如果
- 问题:运行时类型错误
- 如果在进行向下转型时,对象的实际类型与目标类型不匹配,会抛出
ClassCastException
。例如:
class Animal {} class Dog extends Animal {} class Cat extends Animal {} public class Main { public static void main(String[] args) { Animal animal = new Cat(); Dog dog = (Dog) animal; // 运行时抛出ClassCastException } }
- 解决方案:在进行向下转型前,一定要使用
instanceof
关键字进行类型检查,确保转型的安全性。
class Animal {} class Dog extends Animal {} class Cat extends Animal {} public class Main { public static void main(String[] args) { Animal animal = new Cat(); if (animal instanceof Dog) { Dog dog = (Dog) animal; } else { System.out.println("The animal is not a Dog"); } } }
- 如果在进行向下转型时,对象的实际类型与目标类型不匹配,会抛出