发布网友
共6个回答
热心网友
List l1=new ArrayList();
第一,这里只是声明了一个接口的引用l1去指向实现它的类的一个对象(即new ArrayList()),并没有实例化接口。
第二,这里是一个java多态性的应用,用接口的引用去指向实现它的类的对象,这样可以很方便的调用这个类里的实现接口的方法。
第三,为什么List l1=new ArrayList()比ArryList l1=new ArryList()好呢?
我们拿着List l1可以指向所有实现了List接口的对象,而我们拿着ArrayList L1却只能指向ArrayList的对象,这就是多态性的好处
热心网友
接口可以定义,但实现不可以是接口,但可以是实现接口的类.ArrayList是一个实现了List接口的类,所以可以实例化
li可以操作list和arraylist的方法,如果直接arraylist那么就只能操作arraylist的方法
热心网友
多态!!
热心网友
是的,所以才使用ArrayList进行实例化,只是被当作List来用而已。
其实就好像说:
我们要把某某人包装成一个明星。
上面的定义就是
我们要把一个新的ArrayList当成一个List。
相对的,下面的例子是错误的。这样才能说把接口实例化。这样是会报错的。
List l1 = new List();
如果定义l1为List,则l1只能使用List里的方法。不过l1其实还是一个ArrayList,所以你可以通过强制转型来把l1转成ArrayList来使用。
比如
ArrayList l2 = (ArrayList)l1;
或者
((ArrayList)l1).ArrayList的特有方法。
使用List来定义应该算个习惯用法,没有太多的意义,因为对于写死的定义来说没有太大的意义,但对于使用注入之类手段来实例化对象的方法来说就比较有意义了,定义为List就代表我不仅可以注入ArrayList的实例也可以注入其它List实现类的实例。这样一来虽然调用的方法是一样的方法,但方法的实现就可以多种多样了。
热心网友
你看清楚了,这里new的不是List,而是ArrayList对象。
热心网友
记住这样的公式就行了,接口 a = new 实现接口的类();你那里是这样子的,new的不是List,而是ArrayList对象