【问题标题】:Abstract class concrete method invokation抽象类具体方法调用
【发布时间】:2014-03-09 15:04:05
【问题描述】:

我有一个名为 Animal 的抽象类。它有一个名为 sleep() 的具体方法。然后我通过扩展动物类编写了另一个名为 WildAnimal 的类。它覆盖了抽象 Animal 类的 sleep()

我想在我的主要方法中调用抽象类的具体方法(不是 WildAnimal 类的重写方法)。我知道抽象类不能被实例化,但是可以调用抽象类具体方法()吗?如果是,如何?

检查以下代码:

动物类(摘要):

 abstract class Animal {

   public void sleeping(){              
    System.out.println("Animal Sleeping...!");
   }
 }

野生动物类:

 class WildAnimal extends Animal{

    public void sleeping(){
       System.out.println("WildAnimal Sleeping...!");
    }
  }

AbsMethodTest(测试类):

 public class AbsMethodTest {

   public static void main(String[] args) {
    Animal ani = new WildAnimal();  // This will print "WildAnimal Sleeping...!"                    
    ani.sleeping();  // But i want to print "Animal Sleeping...!" is it possible ?
   }
 }

【问题讨论】:

  • 你必须在被覆盖的方法中使用super.sleeping()。没有别的办法。
  • 您的问题是 Java 未充分阐述的继承机制的结果 - 这是一个很好的 OO 实践,抽象类中只有三种类型的方法:Final、empty 或 abstract。
  • Java 中的多态性就是这样工作的。看看late binding。有关解决方案,请查看 Rohit 评论。

标签: java


【解决方案1】:

不,这是不可能的,除非您有一个不会覆盖 sleeping()Animal 实现。就客户端代码而言,它不应该“知道”谁提供了sleeping 方法的行为。从它的角度来看,它只是调用了WildAnimal 特化的sleeping 行为。它不能“想要”调用超类实现,因为它根本不应该“知道”它调用的行为是特定于子类还是继承自超类。

【讨论】:

    【解决方案2】:

    你必须这样做:

    class WildAnimal extends Animal{
    
    public void sleeping(){
        // System.out.println("WildAnimal Sleeping...");
        super.sleeping();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      相关资源
      最近更新 更多