簡體   English   中英

為什么不能使用私有抽象方法?

[英]Why can't I have an private abstract method?

假設我有我的經典作品:

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
}

通過這些具體的實現:

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();  
     }
}

現在,我想要Mammal類中所有哺乳動物實例都可以調用的方法,例如

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

我的問題是,通過使Mammal類不抽象,是否有可能獨自創造出哺乳動物? 例如

 Mammal me = new Mammal();

您不應該能夠這樣做。

但是,我確實希望有一些公共方法,這些方法由所有子類都調用的父類實現,但是每個子類都調用自己的私有方法。

您完全可以在抽象類中實現方法:

“抽象類類似於接口。您不能實例化它們,並且它們可能包含使用或不使用實現聲明的方法的混合。”

https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

回答標題中的問題(“ 為什么不能有私有的抽象方法? ”):

您不能擁有private abstract方法,因為abstract方法需要在子類中實現。 但是private方法在子類中不可見。

(如果您想要一個僅在子類中可見而不在公共場合可見的方法,則需要將這些方法設置為protected

因此,您永遠無法實現private abstract方法。 這就是Java不允許使用它們的原因-它們沒有意義。

如果希望未實現的方法在子類上表現不同,則將它們聲明為抽象方法,並且要繼承的方法使它們像普通方法一樣。 還可以使用protected而不是private來繼承類的訪問:

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

  abstract void eat();
  abstract void speak();
  abstract void sleep();

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

並使用構造函數初始化變量並實現抽象方法:

public class Dog extends Mammal
{
  public Dog(){
     this.numLegs = 4;
     this.voice = "Woof!";
     this.coat = new Coat(COATTYPE.FUR, COATCOLOR.BROWN);
  }
  void eat(){
    System.out.println("eating like a dog");
  }
  void speak(){
    System.out.println("speaking like a dog");
  }
  void sleep(){
    System.out.println("sleeping like a dog");
  }
}

public class Human extends Mammal
{
  public Human(){
     this.numLegs = 2;
     this.voice = "Howdy!!";
     this.coat = new Coat(COATTYPE.SKIN, COATCOLOR.PINK);
  }
  void eat(){
    System.out.println("eating like a human");
  }
  void speak(){
    System.out.println("speaking like a human");
  }
  void sleep(){
    System.out.println("sleeping like a human");
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM