ArrayList list=new ArrayList<>();和 List list = new ArrayList<>();之间有什么区别
list 和 ArrayList 之间的关系
List是一个接口(抽象类),所以需要具体的实现类,需要implements来实现。
而ArrayList<>()是List的实现类,这应该Java里面的具体封装好了的。
List list = new ArrayList<>();这段代码这是表示接口list被 ArrayList类实现。因为List接口本身是一个特殊的类,无法自身创建对象,因此只能通过具体的实现类来实现。
ArrayList<string> list=new ArrayList<>();这类似正常的类创建对象。只是这里的ArrayList被Java指定成了List的实现类。
因此,他们之间的关系是实现和被实现关系。
为什么一般不用 ArrayList list=new ArrayList<>(),而用 List list = new ArrayList<>()?
这里就体现了可替代性,如果直接写ArrayList<string> list=new ArrayList<>()这代码的话,
这直接创建了一个具体实现类的数据结构对象,而且是具体的而不是抽象的。我觉得意思就是把写死了的意思。
但如果使用List<String> list = new ArrayList<>(),这是接口被实体类实现了,
而接口本身是抽象的,可以有多个实现,也可以变更实现方式,意思就是list可以在被ArrayList时,可以将其切换到不同的实现上。如果直接写了
ArrayList<string> list=new ArrayList<>()时,之后再想转换该对象的数据类型泽比较麻烦。说到这就很清楚了。这也是使用List<String> list = new ArrayList<>()的原因之一。
其二原因就是,List<String> list = new ArrayList<>()中,接口的对象只能调用被实现类实现的方法,而ArrayList里边独有的方法则不能被调用。提高代码可读性,也规范代码,同时减少编写代码时的错误。这里的接口调用逻辑和父类与子类之间的方法调用有些类似,上转型对象不能调用子类独有的方法,只能调用子类继承的方法。
切换到其他 List 实现代码示例
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
public class ListExample {
public static void main(String[] args) {
// 使用 List<String> 声明变量
List<String> arrayListExample = new ArrayList<>();
List<String> linkedListExample = new LinkedList<>();
// 添加元素
arrayListExample.add("Apple");
linkedListExample.add("Banana");
// 遍历并输出元素
System.out.println("ArrayList Elements:");
for (String fruit : arrayListExample) {
System.out.println(fruit);
}
System.out.println("LinkedList Elements:");
for (String fruit : linkedListExample) {
System.out.println(fruit);
}
}
}
接口只能调用被实现类实现的方法
接口声明
public interface Animal {
void say();
void listen();
}
实现类
public class Dog implements Animal {
@Override
public void say() {
System.out.println("say");
}
@Override
public void listen() {
System.out.println("listen");
}
public void run(){
System.out.println("run");
}
}