2011-12-14 15 views
8

लागू करता रहा है निम्नलिखित इंटरफेस और अमूर्त वर्ग को लागू करने वाली यह:जावा सार वर्ग इंटरफ़ेस

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

ठीक कर देगा, यह ठीक नहीं है। –

+0

खेद है कि मैंने इसे – Marin

+0

संपादित किया है, मेरा खुद का प्रश्न .... क्या पशु चलने() के एक कार्यान्वयन "(भले ही यह एक अमूर्त विधि है) प्रदान करे? – 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 
} 

आपके मामले में, समाधान Dog और Cat में walk()public के रूप में घोषित करने के लिए है।

+1

मुझे आश्चर्य है कि इंटरफ़ेस को पैकेज के रूप में घोषित नहीं किया गया था।धन्यवाद – Marin

+1

यह एक अच्छा पकड़ था, ओली। मैं कहता हूं, सबसे बुरी चीजों के साथ मुझे निपटने के लिए हमेशा इस तरह मूर्खतापूर्ण सामान के लिए नीचे आ गया है। – Inversus

1

इंटरफ़ेस विधियां सार्वजनिक होनी चाहिए। आपको बिल्ली में सार्वजनिक विधि के रूप में walk() घोषित करने की आवश्यकता है।

2

त्रुटि ग्रहण देता है:

वॉक

से विरासत में मिली विधि की दृश्यता को कम नहीं किया जा सकता विधि सार्वजनिक किया जाना चाहिए, क्योंकि यह एक अंतरफलक में परिभाषित किया गया है।

1

String walk() कार्यान्वयन public बनाएं। इससे इसे

संबंधित मुद्दे