编写测试类Example06_2,对对象的类型进行转换,使Cat2向上转型为Animal2类型,然后再让Animal2类型转换为Pig2类型。
时间: 2024-10-21 15:13:12 浏览: 18
在Java中,你可以创建一个测试类`Example06_2`来演示向上转型(即从子类到父类的类型转换)和向下转型的过程。假设我们有如下类结构:
```java
// 基类和接口
public interface Animal {
void eat();
}
public class Animal2 extends Animal {
@Override
public void eat() {
System.out.println("Animal2 is eating.");
}
}
public class Cat2 implements Animal {
@Override
public void eat() {
System.out.println("Cat2 is eating fish.");
}
}
// 另一个接口和子类
public interface Pig {
void sleep();
}
public class Pig2 implements Pig {
@Override
public void sleep() {
System.out.println("Pig2 is sleeping.");
}
}
```
现在我们可以编写`Example06_2`类来完成这个操作:
```java
public class Example06_2 {
public static void main(String[] args) {
// 创建一个Cat2对象
Cat2 cat = new Cat2();
// 向上转型:将Cat2对象转换为Animal2类型
Animal2 animal = (Animal2) cat;
// 调用eat()方法,由于向上转型,这里会调用animal.eat(),输出 "Cat2 is eating fish."
animal.eat();
// 尝试再向下转型,但是Animal2并没有Pig2的功能,这会抛出ClassCastException
try {
Pig2 pig = (Pig2) animal; // 这里会产生编译错误或运行时异常
} catch (ClassCastException e) {
System.out.println("Cannot cast Animal2 to Pig2 directly.");
}
// 正确的方式是先将Cat2转为Animal,然后通过Animal接口找到支持 Pig 功能的对象
Animal animalFromCat = cat;
Pig pig = (Pig) animalFromCat; // 这里不会抛异常,因为Animal可以包含Pig的行为
pig.sleep(); // 输出 "Animal is eating."
}
}
```
在这个例子中,虽然直接向上转型后无法直接执行`Pig2`特有的行为,但如果设计得当,可以在适当的地方添加适配器模式或桥接模式来支持这种类型间的转换。
阅读全文