// 父类
class Animal {
String type = "动物";
public void eat() {
System.out.println("动物在进食");
}
public void sleep() {
System.out.println("动物在睡觉");
}
}
// 子类1
class Dog extends Animal {
String type = "犬科";
String name = "大黄";
@Override
public void eat() {
System.out.println("狗狗在啃骨头");
}
public void bark() {
System.out.println("汪汪叫!");
}
}
// 子类2
class Cat extends Animal {
String color = "白色";
@Override
public void sleep() {
System.out.println("猫咪蜷缩着睡觉");
}
public void catchMouse() {
System.out.println("抓老鼠中...");
}
}
public class UpcastingDemo {
public static void main(String[] args) {
// 上转型对象示例
Animal animal1 = new Dog(); // 向上转型
Animal animal2 = new Cat();
// 演示1:访问父类成员变量
System.out.println("animal1.type: " + animal1.type); // 输出"动物"(父类变量)
// 演示2:调用被子类重写的方法
animal1.eat(); // 输出"狗狗在啃骨头"(动态绑定)
animal2.sleep(); // 输出"猫咪蜷缩着睡觉"
// 演示3:无法调用子类特有方法(编译错误)
// animal1.bark(); // 取消注释会报错
// 演示4:向下转型恢复功能
if(animal1 instanceof Dog) { // 类型检查
Dog realDog = (Dog) animal1; // 向下转型
System.out.println("实际类型:" + realDog.type); // 输出"犬科"
realDog.bark(); // 输出"汪汪叫!"
}
// 演示5:多态参数传递
feedAnimal(animal1);
feedAnimal(new Cat());
}
// 多态方法:接收父类参数
public static void feedAnimal(Animal animal) {
System.out.println("\n喂养过程:");
animal.eat();
// 根据实际类型执行特殊操作
if(animal instanceof Cat) {
Cat cat = (Cat) animal;
cat.catchMouse();
}
}
}