为什么是List list=new ArrayList();?

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。为什么是List list=new ArrayList();?,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

转载!https://blog.csdn.net/IWTSAMY/article/details/105760501

很久之前思考过这个问题,现在理解多态之后再看到这篇文章,受益匪浅。

如何理解:List list=new ArrayList();为什么要声明为List 而不是ArrayList?

ArrayList LinkedList 都是List 的子类,就像 Set 也是Collection 的子接口。

首先我们探究一下类的继承 对于java的对象,从类的继承关系来说,父类为上,子类为下,所以向上转型就是从子类型转换成父类型,而向下转型就是从父类型转化成子类型。

public class UpcastingAndDowncasting {
    public static void main(String[] args){
        //向上转型--成功
        Person p1 = new Student();
        p1.say();

        //向下转型--成功
        Person p2 = new Student();
        Student s1 = (Student)p2;
        s1.say();
        s1.study();

        //向下转型--失败
        /*Person p3 = new Person();
        Student s2 = (Student)p3;
        s2.say();
        s2.study();*/

    }
}
class Person{
    public void say(){
        System.out.println("Person say");
    }
}
class Student extends Person{
    @Override
    public void say(){
        System.out.println("Student say");
    }
    public void study(){
        System.out.println("Student study");
    }
}

1、向上转型:
根据上面的例子很容易看出向上转型一般不会存在很大的问题,用的就是面向对象的多态特性,父类引用指向子类对象,如果父类引用想调用子类对象中特有的方法编译时不会通过的。
向上类型转换:
语法规则:<父类型> <引用变量名> = new <子类型>();

2、向下转型
(1)可以正常使用的情况:
可以看到向下转型存在两种形式,可以正常使用的依然用到了多态,父类引用指向子类对象,再将父类引用指向的对象强制类型转换为子类并赋值给子类引用,因为本来就是子类对象,最后用的时候还是子类对象,所以不会有问题。

(2)不能正常使用的情况
如果实例化的时候就是让父类对象指向了父类变量,再将父类引用指向的对象强制类型转换为子类并赋值给子类引用,就会出现问题了,虽然编译阶段不会报错但是运行会出错,因为实例化的就是父类对象,不包含子类的方法,所以调用子类特有方法的时候就会报错。

————————————————————————————
对于
ArrayList list=new ArrayList();
List list=new ArrayList();

向上转型(声明使用父类):子类对象会遗失与父类不同的方法

向下转型:可以调用子类那些特有的方法,重新获得丢失的子类特有方法<泛型是常用>

第一种形式用当前类作为引用类型,那么可以访问到ArrayList这个类中的所有公用方法。

第二种形式,用ArrayList实现的接口List作为引用类型,那么通过list引用可以访问到接口中定义的方法。

也就是说ArrayList这个类实现了List接口,除了要必须实现接口List中声明的方法外,还可以实现额外的一些方法。

但是,第二种形式就无法调用的List接口以外的方法。
使用上,设计模式中有:“代码尽量依赖于抽象,不依赖于具体”。第一种形式就是依赖具体,第二种形式就是依赖于抽象。因为List是接口。代码依赖于抽象的好处是,代码可以方便替换。

例如:代码List list = new ArrayList();下面通过list来操作集合。代码编写后发现集合使用的不准确,应该使用LinkedList,那么只要修改一行代码List list = new LinkedList();就可以,这行以后的代码不需要修改,因为List接口保证了调用的都是接口中的方法,而ArrayList与LinkedList都实现了List接口。而如果当时用ArrayList list = new ArrayList()这种形式的话,那么list访问到的就可能是ArrayList里独有的方法而非List接口中的方法。这样替换成LinkedList的时候就有可能需要修改很多的代码。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/159842.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!