2015-04-20 2 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 -После того, как я прав, причина в том, что я получаю эту ошибку: «Абстрактный метод genRecord в типе AttributeSourceTableDao может устанавливать только модификатор видимости, один из публичных или защищенных. – dwjohnston

ответ

3

Вы можете полностью внедрили методы в абстрактном классе: «. Абстрактные классы похожи на интерфейсы Вы не можете создать экземпляр их, и они могут содержать смесь методов, объявленных с или без реализации»

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

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 их не позволяет - они не имеют смысла.

Смежные вопросы