Инициализация интерфейса?

в текущей проблеме у меня есть (печать файла на физический принтер в Java) Я бегал по коду, как сумасшедший, пытаясь поглотить любую полезную пропущенную информацию из javadoc каждого используемого класса.

теперь я вытащил довольно много этого кода из предыдущих вопросов, поэтому я не написал сам. Проблема, которую я заметил, заключается в том, что код, который я схватил, инициализирует объект, скажем "SimpleDoc", который реализует интерфейс (Doc) и присвоить его этому интерфейсу?!

маленький фрагмент кода:

Doc mydoc = new SimpleDoc(textStream, flavor, null);

теперь, насколько я понял в java, мы создаем объекты. Я знаком с наследованием, и я знаком с трюком использования интерфейсов, чтобы позволить классу "наследовать" несколько суперклассов.

но это просто не подвязаны. Вы можете создать класс, который реализует интерфейс, который меня устраивает. Но что происходит здесь, когда создается интерфейс и объекта сводится к его интерфейсу? Что мне доступ, когда я ссылку mydoc точно?

2 ответов


фокус в том, чтобы понять, что вы не "создаете", "создаете экземпляр" или "инициализируете" интерфейс. Вы просто определяете переменную как нечто, что, как вы знаете, реализует этот интерфейс.

вы по существу говорите другим программистам, работающим над этим кодом, что для остальной части этого метода вас интересует только тот факт, что myDoc это Doc (т. е. что-то, что удовлетворяет Doc интерфейс). Это может упростить программирование, потому что IDE автозаполнение теперь покажет вам только методы, определенные этим интерфейсом, а не все, что SimpleDoc способен делать.

представьте, что в будущем вы хотите расширить свою функциональность, чтобы у вас могли быть разные реализации Doc в зависимости от некоторого ввода. Вместо создания явно SimpleDoc, вы говорите:

Doc mydoc = docFactory.getByType(inputType);

The docFactory смогите произвести любой тип Doc, и этот метод действительно не заботится о том, какой вид получает экземпляр, потому что он будет рассматривать его как Doc независимо от.


вы не можете создавать интерфейсы, что вы делаете здесь, вы создаете объект mydoc класса SimpleDoc, который реализует интерфейс Doc. Поскольку класс реализует этот интерфейс, Вам разрешено обрабатывать mydoc как будто это был экземпляр этого интерфейса. Это позволяет получить доступ ко всем объявленным методам в интерфейсе, которые реализованы в классе SimpleDoc

если, например, ваш Doc-интерфейс будет выглядеть так:

public interface Doc {
    void print();
}

и ваш класс SimpleDoc будет выглядеть следующим образом:

public class SimpleDoc implements Doc {

    public void clear() { ... }

    @Override
    public void print() { ... }

}

... тогда вы могли получить доступ только к print()-метод вы mydoc-объект. Но вы также можете сказать:

SimpleDoc mydoc = new SimpleDoc();

... и тогда вы также сможете позвонить clear()