为什么我不能有私有的抽象方法?

dwj*_*ton 1 java oop inheritance abstract

假设我有我的经典:

public abstract class Mammal {
    private int numLegs;
    private String voice;
    private Coat coat;

    public abstract void eat();

    public abstract void speak();
    public abstract void sleep();  


    private abstract void ingestFood(Food f);  //The abstract method ingestFood in type Mammal can only set a visibility modifier, one of public or protected
}
Run Code Online (Sandbox Code Playgroud)

通过这些具体实现:

public class Dog extends Mammal {
     private int numLegs = 4;
     private String voice = "Woof!";
     private Coat coat = new Coat(COATTYPE.FUR, COATCOLOR.BROWN);

     @Override
     public void eat()
     { 
          Rabbit r = chaseRabbits(); 
          if (r != null) ingest(r); 
          else {
                   Garbage g = raidBin(); 
                   if (g!= null) ingest(g); 
               }


     }

     @Override
     private void ingest(Food f)
     {
         gobbleItAllUpInFiveSeconds(f); 
         stillFeelHungry(); 
     }
}

public class Human extends Mammal {
     private int numLegs = 2;
     private String voice = "Howdy!!";
     private Coat coat = new Coat(COATTYPE.SKIN, COATCOLOR.PINK);

     @Override
     public void eat()
     { 
          Food f = gotoSuperMarket();
          ingest(f); 


     }

     @Override
     private void ingest(Food f)
     {
         burp();  
     }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想要Mammal类中的一个方法可以被哺乳动物的所有实例调用,例如

public String describe() {
     return "This mammal has " + this.numLegs + "legs, a " + this.coat.getColor() + " " this.coat.getCoatType() + " and says " + this.voice;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,通过使Mammal类不再抽象,是否有可能自己创建哺乳动物?例如

 Mammal me = new Mammal();
Run Code Online (Sandbox Code Playgroud)

你不应该能够这样做。

但是,我确实希望有一些由所有子类都调用的父类实现的公共方法,但每个子类都调用自己的私有方法。

Erw*_*idt 5

回答标题中的问题(“为什么我不能有一个私有的抽象方法? ”):

你不能有private abstract方法,因为abstract方法需要在子类中实现。但private方法在子类中不可见。

(如果你想有一个方法只在子类中可见,而不是公开的,那么你需要创建methods protected

private abstract所以你永远无法实现一个方法。这就是为什么 Java 不允许它们——它们没有意义。