2011-05-09 63 views
2
interface Block{ 

    void printblock(); 
} 
interface Block2{ 
    void printblock(); 
} 
class Impl2 implements Block,Block2{ 

    @Override 
    public void printblock() { 
     // TODO Auto-generated method stub 
     System.out.println("Impl2"); 
    } 

} 
public class Import 
{ 
    public static void main(String[] args) { 
     new Impl2().printblock(); 
    } 
} 

现在请告诉我哪个printblock方法是通过类Import.Its实现Block接口或Block2接口来实现的吗?java界面问题

+0

反问:它会有什么不同? – 2011-05-09 05:14:44

+0

instanceof将为这两个接口返回true。 – 2011-05-09 06:05:07

回答

2

由于两个接口都有相同的方法签名,两种方法都将作为一个方法由Impl2类实现。 Impl2类正在实现一个方法printblock()两个接口都有相同的签名。所以你可以说Imlp2正在实现两个接口的方法。

3

接口只是一个契约,在你的情况下,有两个不同的接口证明一个类有一个方法实现了一个特定的签名,所以这个方法属于哪个接口并不重要。

1

当你写

新Impl2()printblock()。

它没有关系printblock是方法的一部分的接口。

如果你写了类似

Block block1 = new Impl2(); block1.printlblock();或类似的block2.printblock()。

这里现在都是有效的语句,并且由于两者具有相同的方法定义,所以将执行相同的方法。有趣的是,因为他们的定义是一样的不可能实现同样的方法定义两种不同的方式(尽管你希望它不同为他们每个人)

你的问题已经回答了here

0

在语法上,一个接口除了某个特定名称的某种方法存在以外,并不意味着任何其他意义。

然而,从语义上讲,接口的强大之处在于它们形成了某种方法实现的“保证”,以符合接口本身所描述的行为。也就是说,通过选择实施Block或Block2,你可以让自己符合他们的行为预期(特别是包含他们的方法)。

在你的榜样,你的类实现块和块2的事实是一个明确的说法你正在实现两者 - 不要的事实,他们的方法名是相同的混淆!该语法只会告诉您,Impl2中的方法EXISTS。更重要的是Block和Block2定义/期望的行为。例如,如果您有两个名为List和Set的接口,并且希望一个数据结构能够在语义上表示两个接口,那么您可能有一个size()方法,它们对于两者都是相同的,因此它同时实现了两个List.size()和Set.size()。

当然,如果你不小心使用语义,接口也很容易被滥用。如果定义了相同的add()方法,那么实现List和Set都会遇到大问题,因为根据定义,List.add()行为允许重复,而Set.add()不允许。所以这里有一个陷阱 - 你可能认为你可以基于某些方法的相似性来实现这两个接口,但事实证明它们在其他方法中定义了基本不同的行为。

总的来说,在我看来,就像任何时候你用同样的方法同时实现两个接口一样,类设计有些问题。也许你真正想要做的是将共享行为组合成一个超级界面,并实现它。这将是一个更强大的构造,因为您将显式定义接口的共享部分,并且不会遇到具有不同部分的实现问题。