gpt4 book ai didi

java - JavaSound API Sequencer接口(interface)

转载 作者:行者123 更新时间:2023-12-02 11:24:22 26 4
gpt4 key购买 nike

JavaSound API中的getSequencer方法如何返回接口Sequencer的实例?

Sequencer sequencer=MidiSystem.getSequencer();


我读过我们不能创建接口的实例。

最佳答案

static充其量是一个非常麻烦的概念,其最大的麻烦在于解释“ volatile”关键字声明。

与前面的两个代码块解释其用法参数和概念相比,在代码块上使用“ synchronized”关键字的麻烦要小得多!

“静态”不是构造为“新”,因为它不是“单独的实例”,因此在作为静态对象编译时已经可用。
Java中的所有接口都是抽象的,但仅具有“静态”字段(变量),
类(或替代接口)的AKA(一种别名)“实例”的那些已加载静态类指令版本中,只有一个会出现在该特定“用户类”中的JVM运行时中的该类层次结构级别上创建的任何数量的类的调用的层次结构,这些类提交对静态对象或静态方法的调用(如果从各种类副本中同时调用,则静态代码不会产生新的单独指令集)。

对于任何“静态”,在运行期间,JVM的PID进程级别上的那个调用类的所有程序都只使用一个副本。

您无法实例化MidiSystem,因为其所有方法都是“静态”的
因此,要使用ANY静态类从其中调用其静态方法之一(或在接口上使用相同的方法)
 您只能在要调用的方法上使用其类名,后跟点运算符。
与发布的代码和语法完全相同。 (注意“ Sequencer”实际上是静态的)

但是,如果您需要使用非静态变量来删除静态变量,则仅当要转换的类类型本身不是实际的“静态”编译类时,才将其强制转换为非静态!

例如同时运行多个连接的JDBC数据库的DriverManager.getDriver()无法使用静态驱动程序副本,或者在运行时带有指令模板(静态类的类字节码)的副本只有一个可用!
要从对象中删除“静态”,必须将该对象强制转换为非静态的非静态符号(声明)的相同对象类型的变量。

// 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”是您构造的东西,因此另一个是一个新实例!
接口不是构造的,它们的操作更像“抽象”和“静态”声明。
仅使用类名称是调用EITHER抽象或静态类以获取其方法的语法。

最后一点,将接口称为“数据类型”是使引用变量表示它,因为接口是与类或抽象类相同的数据类型(称为对象)。

因此,您上面的代码具有“ Sequencer”接口作为数据类型。
当类“实现”接口时,该类本身也可以转换为该接口,因为它也是对象类型。
例如

    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接口的变量不是实例变量,它是一个引用,并且(对于静态而言是)您所引用的是定义为“静态”的内容,因此,在调用它的类开始时,必须存在!

关于java - JavaSound API Sequencer接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49714464/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com