Java:接口参考?
我们都知道不能用Java实例化接口(至少不能直接实例化) 但是像这样的事情:Java:接口参考?,java,interface,Java,Interface,我们都知道不能用Java实例化接口(至少不能直接实例化) 但是像这样的事情: public class Test{ public interface Link { void mySamplemethod(); String myString ="HELLO!"; } public static void main(String []args){ Link b; } } 到底是什么。。。它怎么可能有实际用途呢 b
public class Test{
public interface Link {
void mySamplemethod();
String myString ="HELLO!";
}
public static void main(String []args){
Link b;
}
}
到底是什么。。。它怎么可能有实际用途呢
b
是一个类型为Link
的变量,它没有值,甚至没有null
。为了达到实际目的,必须使用对象引用对其进行初始化,该对象引用的类实现了Link
接口
如果要使用非null
值初始化Link
,则应创建一个实现此接口的类。这在Java中是必须的。如果不想在此类之外创建新类,可以在类内部或方法内部创建一个新类(这将是一个新类)。以下是一个示例:
public static void main(String []args){
Link b = new Link() {
@Override
public void mySampleMethod() {
System.out.println("hello");
}
};
b.mySampleMethod();
}
这里已经很好地解释了使用接口而不是直接类进行编程的目的:(无需重新发明轮子)
b到底是什么
b
包含对实现链接的类实例的引用。当然,引用可以是null
它怎么可能有实际用途呢
它的实际用途与任何其他Java参考几乎相同
当然,代码本身并不能真正发挥b
的作用。然而,不难想象类似的代码(您需要有一个实现链接的类,并创建该类的实例)。例如,实例接口在多态性中被广泛使用。因此,如果您有多个类实现接口,则可以以相同的方式保留它们:
class One implements Link {..}
class Two implements Link {..}
public static void main(String[] arg) {
Vector<Link> links;
Link link1 = new One();
Link link2 = new Two();
links.add(link1);
links.add(link2);
for (Link l : links) {
l.mySampleMethod();
}
}
class-One实现链接{..}
类2实现链接{..}
公共静态void main(字符串[]arg){
矢量链接;
Link link1=新链接();
Link link2=新的两个();
links.add(link1);
links.add(link2);
用于(链接l:链接){
l、 mySampleMethod();
}
}
您可以创建对接口的引用,但不能实例化它。例如,假设您有一个接口a
public interface A {
public void someMethod();
}
现在您有了另一个实现此接口的类
public class B implements A {
public void someMethod() { // do something }
public void someOtherMethod() { // do something else }
}
现在你可以有类似的
A a = new B();
引用类型a实际上实现了B中定义的方法。对象类型是B。引用类型a表示它只能访问B中由a指定的方法,而不能访问其他方法(在本例中,它可以访问someMethod(),而不能访问someOtherMethod().可能重复的b
是对对象的引用,该对象必须是实现链接的类的实例。。。别这么想。另一个似乎是关于拥有接口的一般OOP观点……当您以后这样做时,它可能会有一个用途:b=newsubassoflink()
。如果您没有Link
的子类,那么您可能不需要声明变量。@Duncan:不,这个问题正是您要问的:将变量定义为实现接口而不是实际类的目的是什么。“这就是你的实际目的。”邓肯说,每个局部变量都存在于堆栈中。它可以使用匿名类进行初始化。检查我的答案编辑。局部变量也可能存在于寄存器中。除非你说的是字节码,所有的东西都在堆栈上。