java中传递接口引用和类引用之间的区别

时间:2014-02-05 07:49:58

标签: java performance object interface encapsulation

传递接口引用或类引用之间是否有任何区别,如示例所示;

Interface MyInterface
{
     void foo();
}
public class MyClass implements MyInterface
{


 public void foo()
    {
        doJob();
    }
}

....
//in another class or etc..
public void case1(MyClass mc)
{
    mc.foo();
}

public void case2(MyInterface mi)
{
    mi.foo();
}
....
//In somewhere
MyClass mc = new MyClass();
case1(mc);
case2(mc);

case1和case2之间的主要区别是什么?它们在性能,可见性,保护对象免受非法使用方面有任何优势吗?像这样使用它有什么缺点吗?

2 个答案:

答案 0 :(得分:4)

通过传递接口,您将创建传递实现接口的所有类的机会。但在case1中,您只能传递MyClass及其子类。

例如,考虑以下情况

public class YourClass implements MyInterface
{

 public void foo()
    {
        doJob();
    }
}

现在在case2中,您可以传递MyClass和YourClass的实例。但在案例1中你不能。

  

现在,它的重要性是什么?

在OOP中,建议编程到界面而不是类。因此,如果你考虑好的设计,就没有案例1。只有case2才能为你完成这项工作。

答案 1 :(得分:2)

编程到接口

唯一的好处是您通过使用接口MyInterface 隐藏了确切的实现,并且您可以在将来更改实现。

但是当你使用具体的类时,你就会受到那个类的行为的约束。

假设您在其他类的方法中传递List<Integer>,那么它可以是用户不关心的列表的任何实现。但是,如果您通过ArrayList<Integer>,则用户可以使用ArrayList具体方法,以后您将无法将其更改为LinkedList

因此case2()优于case1()

没有其他好处。

  

他们在性能,可见度方面是否有任何优势,   保护对象免受非法使用?

传递任何类型的引用时性能都是相同的,无论是接口还是具体的类引用都无关紧要。

编辑:根据评论和@maaartinus的进一步帖子,使用界面时性能似乎有些差异。但我再也不担心,除非它被证明是我的代码中的瓶颈,这将永远不会。