从实现Java接口的类创建对象

时间:2011-09-02 16:50:24

标签: java

  

可能重复:
  Why should the interface for a Java class be prefered?

在Java中,这两行之间有区别吗?如果是这样,它是什么,我什么时候应该使用其中任何一个?是否有首选惯例?

请注意,ArrayList实现了List。

List<String> bunchOfStrings = new ArrayList<String>();

ArrayList<String> bunchOfStrings = new ArrayList<String>();

5 个答案:

答案 0 :(得分:2)

  

在Java中,这两行之间有区别吗?

是的,存在细微差别,首选List<String>变体。

  

是否有首选惯例?

约定说你应该“针对接口编程”。原因是交换实际实现变得容易得多(在这种情况下从ArrayListLinkedList)。

答案 1 :(得分:1)

您应该使用最通用的类​​型。所以在这种情况下是List。您使用更具体类型的唯一时间是,如果该类型上定义了方法,则更通用的类型不会。

原因是如果方法接受类型List,则该方法的用户可以提供他们想要的任何类型的列表。如果方法只接受ArrayList,则用户不能使用任何其他类型的List。

答案 2 :(得分:1)

在这两种情况下,您都要实例化一个ArrayList。不同之处在于,在第一种情况下,您将其称为List(ArrayList实现的接口),因此您无权访问ArrayList类的特定方法,而只能访问interfaces方法。

首先使用:

List<String> bunchOfStrings = new ArrayList<String>();

这样你可以切换不同的List实现(ArrayList,Vector):

public class AClass(){
   List<String> bunchOfStrings;

   public List<String> getList(){
        bunchOfStrings = new ArrayList<String>();
        //or you can switch to : bunchOfStrings = new Vector<String>();
        return bunchOfString;
   }
}

答案 3 :(得分:0)

如果您将bunchOfStrings声明为List,则无法调用任何ArrayList方法(无需转换),即使它指向ArrayList object - 您只能调用List类中声明的方法。

出于这个原因,您可能认为最好始终声明您的变量类型尽可能具体,但通常更喜欢将其声明为List,因为它允许您更改您的基础实现List,无需更改代码中的任何其他内容。您可以按照以下方式轻松修改代码,而不会破坏代码中的任何其他内容:

List<String> bunchOfStrings = new LinkedList<String>();

根据经验,如果你......只会声明变量的类型是特定的子类...

  1. ...需要访问仅在子类中可用的方法。
  2. ...需要将对象实例传递给只接受该子类对象的方法。

答案 4 :(得分:0)

这称为Polymorphism。它非常有用,并没有真正的缺点。

优点:

您可以将此实例变量发送到任何需要“List”对象的方法。

在方法声明中使用List,您将方法打开到List的子类型,而不仅仅是ArrayList类型。

缺点:

您必须将变量转换为ArrayList才能访问或设置ArrayList中的任何功能/方法/字段(但不在List中)。但那些东西仍然可用。