骜沉
2021-09-01 11:05
采纳率: 100%
浏览 73
已结题

Java中抽象类不是不可以实例化么!为啥还可以通过参数抽象父类引用子类对象?new一个子类对象


public class Test {
    public static void main(String[] args) {
      show(new Cat());  // 以 Cat 对象调用 show 方法
      show(new Dog());  // 以 Dog 对象调用 show 方法
                
      Animal a = new Cat();  // 向上转型  
      a.eat();               // 调用的是 Cat 的 eat
      Cat c = (Cat)a;        // 向下转型  
      c.work();        // 调用的是 Cat 的 work
  }  
            
    public static void show(Animal a)  {
      a.eat();  
        // 类型判断
        if (a instanceof Cat)  {  // 猫做的事情 
            Cat c = (Cat)a;  
            c.work();  
        } else if (a instanceof Dog) { // 狗做的事情 
            Dog c = (Dog)a;  
            c.work();  
        }  
    }  
}
 
abstract class Animal {  
    abstract void eat();  
}  
  
class Cat extends Animal {  
    public void eat() {  
        System.out.println("吃鱼");  
    }  
    public void work() {  
        System.out.println("抓老鼠");  
    }  
}  
  
class Dog extends Animal {  
    public void eat() {  
        System.out.println("吃骨头");  
    }  
    public void work() {  
        System.out.println("看家");  
    }  
}

Animal a = new Cat(); 中抽象类不是不可以实例化么!为啥还可以通过参数抽象父类引用子类对象?new一个子类对象

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

3条回答 默认 最新

  • CSDN专家-sinJack 2021-09-01 11:09
    最佳回答

    Animal a = new Cat();
    父类指向了子类对象,向上转型。
    创建的对象是子类Cat对象,当然没问题。
    抽象类和接口不能实例化,但是可以声明。
    所以父类指向子类引用没问题。

    评论
    解决 无用
    打赏 举报
查看更多回答(2条)

相关推荐 更多相似问题