2016-07-28 2 views
1

Я пытаюсь реализовать интерфейс, как это:Почему мои методы интерфейса не могут быть переопределены?

public interface Human{ 

    void talk(); 
} 



public class Ame implements Human{ 

    public static void talk(){ 
     System.out.println("Speak English"); 
    } 
} 



public class Chin implements Human{ 

    public static void talk(){ 
     System.out.println("Speak Chinese"); 
    } 
} 


public class test { 

    public static void main(String[] args){ 

     Chin c = new Chin(); 
     c.talk(); 
     Ame a = new Ame(); 
     a.talk(); 
} 
} 

Но это показывает ошибку:
Ame и Чин говорить() не может реализовать человеческий разговор().
Методы переопределяются как статические.
Пожалуйста, скажите мне, почему это заглохло и как исправить эту ошибку.

+4

Почему вы пытаетесь использовать статические методы? – John3136

+1

У вас не может быть статический и нестатический метод с тем же именем и сигнатурой. И статический метод не реализует интерфейс. – Thilo

+0

Мне просто интересно, почему Human talk() нельзя переопределить как static talk(). – AngusMurphy

ответ

2

Static methods являются частью Class и не объектов. Overriding - это концепция polymorphism, то есть метод, связанный с экземпляром, может иметь множественное поведение.

Статические методы не связаны с экземпляром и polymorphism не могут быть применены.

0

Когда вы объявляете метод как static, он принадлежит классу в целом, а не конкретному экземпляру. Методы интерфейса не могут быть статичными в Java. Когда вы реализуете интерфейс, вы должны предоставить метод экземпляра для абстрактных методов интерфейса. Когда вы используете статический метод, ваш статический метод пытается скрыть метод экземпляра с тем же именем. Но это нарушит правила, которым необходимо следовать при реализации интерфейса. Таким образом, мы не можем сделать методы интерфейса статичными в классе реализации.

0

Вы не можете ссылаться на нестатический интерфейс из статического метода таким образом. По существу, статический метод - это тот, к которому можно получить доступ напрямую, без повторного создания локального дублированного объекта, но его значения не могут быть изменены таким же образом. Действительно, решение этой проблемы довольно просто. Удалить статический модификатор из методов overriding talk()

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