2016-04-20 3 views
0
package chap8; 
interface Interfaces 
{ 
    void nMethod(); // normal method of interface 

    default void dMethod() // default method of interface 
    { System.out.println("Default Method of Interface"); } 

    static void sMethod() // static method of interface 
    { System.out.println(" static method of interface"); } 

} 
class IClass implements Interfaces 
{ 
    public void nMethod() 
    { System.out.println("Normal Method of Interface in IClass ");} 
    static void sMethod() 
    { System.out.println("Does function overrided ?");} 
    public void dMethod() 
    { System.out.println("default Method of Interface in IClass ");} 
} 
class MainClass 
{ 
    public static void main(String args[]) 
    { 
     IClass ob =new IClass(); 

     ob.nMethod(); 
     ob.sMethod(); // overrided method ?? 
     ob.dMethod(); 

     // calling static 

     //Interfaces.sMethod // via Interfaces 
     // IClass.sMethod(); // via IClass  (why all these sMethod calling showing error) 



    } 
} 

Вопрос: а) Объявлен ли sMethod в интерфейсе, переопределенный sMethod, присутствующим в IClass?Java: переопределение интерфейса метода

b) Почему я не могу вызвать sMethod через интерфейс и IClass?

Thk fpr help !!!

ответ

1

Упрощая ваш пример

public class A { 
    interface I { 
     static void sMethod() { 
      System.out.println("In the interface I"); 
     } 
    } 
    static class C implements I { 
     void sMethod() { 
      System.out.println("In the class C"); 
     } 
    } 
    public static void main(String[] args) { 
     I.sMethod(); 
     new C().sMethod(); 
    } 
} 

печатает

In the interface I 
In the class C 

ли sMethod объявлены в интерфейсе перекрытая по sMethod настоящее время в IClass?

static методы скрыты, а не переопределены. Это означает, что вызов статического метода для определенного класса, вы всегда будете получать, чем метод, поскольку он не будет следовать за наследованием и даст вам переопределенный метод (на самом деле он не может, поскольку он не использует экземпляр)

Почему я не могу вызвать sMethod через интерфейс и IClass?

Это не ясно для меня, см. Пример выше, какие слова, как ожидалось.

Вы больше не можете звонить им.

Чтобы уточнить комментарий Халка. Вы не можете вызвать их через экземпляр, но вы можете позвонить им через class или interface, который их реализует.

+1

@ Питер Lawrey Насколько мне известно, статический метод не может быть переопределен, то почему его переопределение повторно? –

+0

@Lalitkumar Я пропустил это, нужно пересмотреть. –

+0

@ Hulk Почему sMethod (который является статическим) не может быть вызван процедурой classname.staticmethodname? –

2

См. Документацию о оракуле по адресу default methods и статические методы.

Расширение интерфейсов, которые содержат по умолчанию методы

При расширении интерфейса, который содержит метод по умолчанию, вы можете сделать следующее:

  1. Не говоря уже метод по умолчанию на всех, что позволяет вашему расширенный интерфейс наследует метод по умолчанию.
  2. Redeclare метод по умолчанию, который делает его абстрактным.
  3. Переопределить метод по умолчанию, который переопределяет его.

Что касается запросов:

  1. Если применить эти понятия к вашему примеру, ваш dMethod является overridden в IClass
  2. Ваш sMethod() в IClass скрывает sMethod() в Interfaces