2011-12-14 22 views
8

を実装していますJavaの抽象クラスは、私はそれを実装して、次のインタフェースと抽象クラスを持つインタフェース

interface Walk { 
    String walk(); 
} 

public abstract class Animal implements Walk { 
    abstract String MakeNoise(); 
} 

そして、次の具体的な実装:

すべて一緒にそれを置く
class Cat extends Animal { 
    String MakeNoise() { 
     return "Meow"; 
    } 

    @Override 
    String walk() { 
     return "cat is walking"; 
    } 
} 

class Dog extends Animal { 
    @Override 
    String walk() { 
     return "Dog is walking"; 
    } 

    @Override 
    String MakeNoise() { 
     return "bark"; 
    } 
} 

class Human { 
    public void Speak() { 
     System.out.println("...Speaking..."); 
    } 
} 

class MainClass { 
    public static void main(String[] args) { 
     Random randomGen = new Random(); 

     Animal[] zoo = new Animal[4]; 
     zoo[0] = new Cat(); 
     zoo[1] = new Dog(); 
     zoo[2] = new Cat(); 
     zoo[3] = new Cat(); 
     // System.out.println(zoo[ randomGen.nextInt(2)].MakeNoise()); 
     for (Animal animal : zoo) { 
      if (animal instanceof Dog) { 
       Dog jeffrey = (Dog) animal; 
       System.out.println(jeffrey.MakeNoise()); 
      } 

     } 
    } 
} 

このエラーが発生します

"walk()でCatはウォークでwalk()を実装できません"。

ありがとう

+2

それはエラーが言うものではありません。 –

+0

申し訳ありません私はそれを編集しました – Marin

+0

自分自身の質問.... Animalはwalk()の "実装"(抽象メソッドであっても)を提供する必要がありますか? – SJuan76

答えて

18

インターフェイスのメソッドは暗黙的にpublicです。ただし、クラスのメソッドはデフォルトでパッケージに表示されます。あなたがオーバーライドされたメソッドの可視性を減らすことができない、つまりあなたはこのようなものを行うことはできません。

class A { 
    public foo() {} 
} 

class B extends A { 
    private foo() {} // No! 
} 

class C extends A { 
    foo() {}   // No! foo is package-visible, which is lower than public 
} 

をあなたのケースでは、溶液はDogCatpublicとしてwalk()を宣言することです。

+1

私はそのインターフェイスがパブリックではないと宣言されたのは驚きです。ありがとう – Marin

+1

それは素晴らしいキャッチだった、オリ。私が言っている、私が対処しなければならなかったバグの最悪のものは、常にこのような愚かなものに降りてきた。 – Inversus

1

インターフェイスメソッドは公開されている必要があります。 Catのパブリックメソッドとしてwalk()を宣言する必要があります。

2

エラー日食が与えるは次のとおりです。

ウォーク

から継承されたメソッドの可視性を減らすことはできませんそれはインタフェースで定義されているため、この方法は、パブリックでなければなりません。

1

String walk()の実装をpublicにします。それはそれを修正します

関連する問題