转载!原文链接: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