2015-04-20 71 views
0

比方說,我有我的經典:爲什麼我不能有一個私人的抽象方法?

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

您應該無法做到這一點。

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

+1

這甚至不會編譯。 「哺乳動物」是一個普通的課程,所有的方法都需要一個身體。除此之外:「哺乳動物」不是抽象的。 – Paul

+2

你*可以*擁有一個具有方法實現的抽象類,並且你不能實例化它。你爲什麼認爲你不能? –

+0

@DaveNewton - 你說得對,我問的原因是因爲我得到這個錯誤:類型AttributeSourceTableDao中的抽象方法genRecord只能設置公共或受保護的可見性修飾符 – dwjohnston

回答

0

聲明你的未實現的方法是抽象的,如果你想他們的行爲方式不同的子類,並且這些方法是繼承讓他們像一個正常的方法。還可以使用受保護的而不是私有的是繼承類訪問:

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"); 
    } 
} 
1

年對問題的標題(」 爲什麼能'我有一個私人的抽象方法?「):

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

(如果你想有一個纔可見在子類中,並沒有公開,那麼你需要做的方法protected的方法)

所以你無法實現private abstract方法,直到永遠。這就是爲什麼Java不允許他們 - 他們沒有意義。

相關問題