2011-12-14 165 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()); 
      } 

     } 
    } 
} 

我得到这个错误

“走路()在猫不能执行步行()在步行”。

任何想法?谢谢

+2

这不是错误说的。 – 2011-12-14 22:11:11

+0

对不起,我编辑它 – Marin 2011-12-14 22:11:51

回答

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 
} 

在你的情况,解决办法是在DogCat申报walk()public

1

接口方法必须是公共的。您需要在Cat中声明walk()作为公共方法。

2

错误日食给出的是:

无法从步行

减少继承方法的可见性的方法必须是公共的,因为它是在一个接口中定义。

1

使String walk()实现public。这将修复它