Интерфейс секвенсора API JavaSound

Как может метод getSequencer в API JavaSound возвращать экземпляр интерфейса Sequencer?

Sequencer sequencer=MidiSystem.getSequencer();

Я читал, что мы не можем создать экземпляр интерфейса.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
54
1

Ответы 1

статический - в лучшем случае очень хлопотная концепция, ее самая большая проблема с объяснением - это "изменчивое" объявление ключевого слова.

У вас будет меньше проблем с ключевым словом "synchronized" в блоке кода, чем с двумя предыдущими для объяснения их параметров и концепции использования!

«static» не создается как «новый», потому что это не «отдельный экземпляр» он уже доступен при компиляции как статический объект. Все интерфейсы в Java абстрактны, но имеют только «статические» поля (переменные)., ТОЛЬКО ОДНА из загруженных версий инструкций статического класса AKA (вид псевдонима) «экземпляр» класса (или, альтернативно, интерфейса) будет присутствовать на этом уровне иерархии классов в процессе в среде выполнения JVM в этой конкретной иерархической структуре вызовов "пользовательских классов" для любое количество созданных классов, которые фиксируют вызов статического объекта или статического метода (статический код НЕ СОЗДАЕТ НОВЫЙ ОТДЕЛЬНЫЙ НАБОР ИНСТРУКЦИЙ, ЕСЛИ ВЫЗЫВАЕТСЯ СОВМЕСТНО ИЗ РАЗЛИЧНЫХ КОПИЙ КЛАССА).

В случае чего-либо «статического» используется только одна копия для всей программы в этом вызывающем классе на уровне процесса PID в JVM во время выполнения.

Вы не можете создать экземпляр MidiSystem, потому что все его методы "статичны" Итак, чтобы использовать ЛЮБОЙ статический класс для вызова одного из его статических методов из него (или то же самое на интерфейсе)вы используете только его имя класса, за которым следует оператор точки в методе, который вы хотите вызвать. Точно так же, как в опубликованном вами коде и синтаксисе. (ПРИМЕЧАНИЕ «Секвенсор» на самом деле статичен)

Но если вам нужна ваша переменная нестатический для удаления статики, вы приводите ее, если тип класса для преобразования не является статическим, только если класс, который вы преобразовываете, сам не является фактическим "статическим" скомпилированным классом!

например DriverManager.getDriver () для базы данных JDBC, запускающей более одного соединения одновременно, не может использовать статические копии драйверов, иначе во время выполнения будет доступна только одна копия с шаблоном инструкций (байтовый код класса для статического класса)! Чтобы удалить "статический" из объекта, объект должен быть преобразован в нестатический в переменную того же типа объекта, который не имеет статической нотации (объявлен).

// the getDriver() method is static inside class DriverManager , 
// Driver is an Interface not a class
Driver driver = (Driver) DriverManager.getDriver( configuration.jdbcUrl() );
// After casting, there is now a separate non static reference of Driver 
// interface , so **note that neither MidiSystem or DriverManager class are** 
// actually declared static and both have no constructor and not declared 
// abstract but contain only static methods !

"INSTANCE" это то, что вы строите, поэтому Еще один - это экземпляр новый! Интерфейсы не создаются, они работают как «абстрактные» и «статические» объявления. Использование только имени класса - это синтаксис вызова ЛИБО абстрактные или статические классы для получения своих методов.

И наконец, чтобы называть интерфейс «типом данных», нужно создать ссылочную переменную для его представления, потому что интерфейс ЯВЛЯЕТСЯ типом данных (известным как объект), таким же, как класс или абстрактный класс.

Итак, в приведенном выше коде в качестве типа данных используется интерфейс «Секвенсор». Когда класс «реализует» интерфейс, сам класс может быть приведен к этому интерфейсу, потому что он ТАКЖЕ является этим типом объекта. например

    public class Example implements Extra{.....}
    Extra example = (Extra)new Example();
// next below shorthand implicit cast is compiler dependent
    public class Example implements Extra{.....}
    Extra example = new Example();

Если вы не реализуете интерфейс в классе, интерфейс можно вызвать в коде с присвоением ссылочной переменной с помощью класса, у которого есть метод, который получает этот тип данных интерфейса. Между абстрактными классами и интерфейсами существует огромная взаимосвязь, но это не одно и то же.

Абстрактные классы не имеют глобальных переменных.

Интерфейсы имеют глобальные переменные, но все они должны быть статическими и окончательными. Абстрактные классы не могут иметь глобальных переменных или «пример класса» и тогда потребуется построить как «новый».

Абстрактные классы имеют менее строгие правила объявления методов, чем интерфейсы.

Абстрактные классы могут иметь большинство модификаторов классов, все интерфейсы являются общедоступными.

Интерфейсы имеют модификатор «по умолчанию» для методов, которые содержат тело реализации кода или должны быть статическим методом.

Короче говоря, переменная для интерфейса Sequencer не является переменной экземпляра, это ссылка и (пункт для статики)вы имеете в виду нечто, определяемое как "статическое", поэтому ЭТО ДОЛЖНО быть там, когда класс, который его вызывает, запускается!

Другие вопросы по теме