2015-03-18 3 views
0

как в теме. Вот пример:Java-класс, расширяющий абстрактный класс и реализующий интерфейс, имеющий те же методы

public abstract class Bird{ 
    public abstract void eat(); 
    public abstract void fly(); 
} 


public interface Flyable{ 
    public void fly(); 
} 

public class Test extends Bird implements Flyable{ 
    public void eat(){ 
     System.out.println("I'm eating"); 
    } 

    // And what's now? 
    public void fly(){ 

    } 
} 

И теперь есть главный вопрос. Что происходит. Является ли ошибка выбрасывается, или летать одинаково для интерфейса и абстрактного класса?

+2

Вы можете реализовать этот метод. Ошибка не возникает. См. Http://stackoverflow.com/questions/11296789/same-method-in-interface-and-abstract-class – apgp88

ответ

2

Ничего не происходит. Просто реализуйте свою логику внутри fly() и будьте счастливы.

2

Если методы имеют одинаковую подпись, все будет хорошо. Также хорошо иметь реализацию в абстрактном классе или реализовать метод, который указан в нескольких интерфейсах класса.

В Java метод идентифицируется по его названию и его параметрам. Следовательно, возвращаемый тип реализованного метода должен быть совместимым со всеми типами возврата всех указанных методов с тем же идентификатором. То же самое относится к предложениям об отправке . Если тип возвращаемого значения или броски реализованного метода несовместимы, вы получите ошибку компиляции.

Этот пример не работает:

public interface Flyable { 
    void eat(); 
    void fly(); 
} 

public abstract class Bird { 
    public int eat() { 
    return 500; 
    } 

    public void fly() throws StallException { 
    } 
} 

public class Eagle extends Bird implements Flyable { 
} 

Eagle.java, линия 1: Исключение StallException в кидает раздел Bird.fly() не совместим с Flyable.fly()

Eagle.java, линия 1: Типы возврата несовместимы для унаследованных методов Flyable.eat(), Bird.eat()

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