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

我们都知道不能用Java实例化接口(至少不能直接实例化)

但是像这样的事情:

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:不,这个问题正是您要问的:将变量定义为实现接口而不是实际类的目的是什么。“这就是你的实际目的。”邓肯说,每个局部变量都存在于堆栈中。它可以使用匿名类进行初始化。检查我的答案编辑。局部变量也可能存在于寄存器中。除非你说的是字节码,所有的东西都在堆栈上。