JavaSound API中的方法getSequencer如何返回接口Sequencer的实例?
Sequencer sequencer=MidiSystem.getSequencer();
我已经读过我们无法创建接口的实例。
答案 0 :(得分:1)
静态充其量只是一个非常麻烦的概念,它最大的解释方法就是" volatile"关键字声明。
使用" synchronized"会减少麻烦。代码块上的关键字比前两个用于解释其使用参数和概念!
<强>&#34;静态&#34;不构造为&#34;新&#34;因为它不是一个单独的实例&#34; ,它在作为静态对象编译时已经可用。 Java中的所有接口都是抽象的,但具有静态&#34;仅字段(变量), 只有一个加载的静态类指令版本的AKA(一种别名)&#34;实例&#34;一个类(或者交替的接口)将出现在该特定的&#34;用户类&#34;中的JVM运行时中的进程的该类层次结构级别。调用的层次结构用于创建的任何数量的类,它们提交静态对象或静态方法的调用(静态代码如果同时从各种类别调用,则不会创建一个新的单独的指令集副本)。
任何事情&#34;静态&#34;在运行期间,在JVM中的PID进程级别上,该调用类的所有程序只使用了一个副本。
您无法实例化MidiSystem,因为所有方法都是&#34;静态&#34; 所以要使用任何静态类来调用它的一个静态方法(或在接口上相同) 您只能在其要调用的方法上使用其类名,后跟点运算符。 正如您在发布的代码和语法中所拥有的那样。 (注意&#34;音序器&#34;实际上是静态的)
但是如果您需要变量非静态来移除静态,那么如果要转换为的类类型是非静态的,则只有当您要转换的类本身不是实际的#34时才转换它;静&#34;编译课!
e.g。同时运行多个连接的JDBC数据库的DriverManager.getDriver()不能使用静态驱动程序副本,或者在运行时使用指令模板(静态类的类字节代码)时只能使用一个副本! 删除&#34;静态&#34;从对象中,必须将对象强制转换为非静态对象,该对象类型不是静态表示法(声明)。
// 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 !
&#34; INSTANCE&#34; 是您构建的内容,因此另一个是新实例! 接口不是构造的,它们的操作更相似&#34;抽象&#34;和&#34;静态&#34;声明。 仅使用类名是调用EITHER 抽象或静态类以获取其方法的语法。
最后一点,将接口称为&#34;数据类型&#34;是一个引用变量来表示它,因为接口是一个数据类型(称为对象),与类或抽象类相同。
所以你的上面的代码有&#34; Sequencer&#34;接口作为数据类型。 当一个班级&#34;实施&#34;类本身可以转换为该接口的接口,因为它也是该对象类型。 e.g。
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();
如果未在类中实现接口,则可以通过使用具有获取该接口数据类型的方法的类,将接口调用到引用变量的代码中。 抽象类和接口之间存在巨大的关系,但它们并不相同。
抽象类没有全局变量。
接口确实有全局变量,但它们都必须是静态的和最终的。 抽象类不能包含任何全局变量,或者它是&#34; 实例的类&#34;然后需要构建作为&#34; new&#34;。
抽象类对方法声明的规则不如接口。
抽象类可以使大多数类修饰符接口都是公共的
接口有&#34;默认&#34;包含代码实现主体的方法的修饰符,或者必须是静态方法。
简而言之,Sequencer接口的变量不是实例变量,它是一个引用,(静态子句) 你指的是定义为&#34; static&#34的东西; 所以当调用它的类开始时,它必须在那里!