2014-10-22 5 views
0

Я просто блуждаю, если следующее нечетное поведение.Java-тестирование результатов интерфейса Нечетное поведение

public interface TestInterfaceTwo {   
    public void sayBye(); 
} 


public interface TestInterfaceOne {   
    public void sayHI(); 
} 


public abstract class TestIntefaceClass implements TestInterfaceOne, TestInterfaceTwo { 
    @Override 
    public void sayHI() {  
     System.out.println("HI"); 
    } 

    @Override 
    public void sayBye() { 
     System.out.println("Bye"); 
    } 
} 


public class InterfaceImplementer extends TestIntefaceClass{  
    @Override 
    public void sayHI() { 
     System.out.println("SAY HI"); 
    } 
} 

public static void main(String[] args) { 
    InterfaceImplementer impl = new InterfaceImplementer(); 
    TestInterfaceOne impl1 = new InterfaceImplementer(); 
    TestInterfaceTwo impl2 = new InterfaceImplementer(); 
    TestIntefaceClass impl3 = new InterfaceImplementer();  

    impl.sayHI(); 
    impl.sayBye(); 
    impl1.sayHI(); 
    impl2.sayBye(); 
    impl.sayBye(); 
    impl3.sayBye(); 
    impl3.sayHI(); 
} 

Эти вызовы приводят следующие

SAY HI 
Bye 
SAY HI 
Bye 
Bye 
Bye 
SAY HI 

мне нужно знать, если экземпляры интерфейса наследуют только ожидаемое поведение из интерфейса или, если он наследует абстрактный класс. Кажется, он делает последнее, и я хотел бы узнать объяснение этого, и если это ошибка или особенность. :)

+0

1. сделайте свой код доступным для чтения, 1 команду за строку !!! 2. добавьте свой вопрос, я не могу понять, что у вас спрашивает – Dima

+0

Просто сделал .. :) понял, что я использовал неправильную кнопку Спасибо за комментарий – Tharanga

+1

он наследует от абстрактного класса. Таким образом, AbstractClass похож на Parent, а ваш InterfaceImplementer является дочерним элементом вашего абстрактного класса. Таким образом, его ребенок (скажем, человеческий ребенок) наследует гены и некоторые особенности от своих родителей. – SMA

ответ

2

Это работает, как ожидалось. Я не совсем уверен, что вас смущает.

Мне нужно было знать, наследуют ли интерфейсные экземпляры только ожидаемое поведение от интерфейса или если он наследует абстрактный класс. Кажется, он делает последнее, и я хотел бы узнать объяснение этого, и если это ошибка или особенность. :)

Интерфейсы не реализуют никакого «поведения» (хотя Java 8 предоставляет default methods), и вы не можете его создать. Все экземпляры, которые вы создаете, представляют собой экземпляры классов - в вашем случае - экземпляры InterfaceImplementer. Итак, давайте посмотрим на этот класс и его родителя:

TestIntefaceClass реализует два интерфейса и их методы. Здесь ничего особенного.

InterfaceImplementer расширяет TestIntefaceClass класса, он наследует реализацию sayBye(), но он обеспечивает свою собственную реализацию sayHi().

Теперь следующее (и другие подобные примеры кода)

TestInterfaceOne impl = new InterfaceImplementer(); 

создает экземпляр InterfaceImplementer, как вы можете увидеть на правой стороне. Таким образом, реализации, которые будут использоваться при вызове sayHi() и sayBye(), будут теми, что Interfaceimplementer переопределяет/наследует.

LE: This link, вероятно, будет вам полезна. В нем обсуждается использование интерфейсов как типов, что вы делаете.

1

«новый InterfaceImplementer()» дает вам точно, что ... его просто вы decalring их различными способами .... он работает, как ожидалось

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