参考资料:《Head First Java》
首先是一组代码:
import java.util.ArrayList;//导入ArrayList类;
class Dog1 {//Dog1类;
private String name;//成员变量;
public void bark() {//成员方法;
System.out.println("bark");
}
}
public class ObjectTest {//测试主类;
public static void main(String[] args) {
ArrayList<Dog1> dList = new ArrayList<>();//保存Dog1的ArrayList;
Dog1 d = new Dog1();//新建一个Dog1;
dList.add(d);//装到ArrayList中;
Dog1 ad = dList.get(0);//将Dog1赋值给新的Dog1引用变量;
ad.bark();
}
}//结果输出bark;
但如果是下面的情况:
import java.util.ArrayList;
class Dog1 {
private String name;
public void bark() {
System.out.println("bark");
}
}
public class ObjectTest {
public static void main(String[] args) {
ArrayList<Object> dList = new ArrayList<>();
Dog1 d = new Dog1();
dList.add(d);
Dog1 ad = dList.get(0);
ad.bark();
}
}//程序就会报错;
//Type mismatch: cannot convert from Object to Dog1;
我们知道在Java中的所有类都是从Object这个类继承出来,说白了,就是它是个“万用类”。
然而,在使用Object的多态引用时会有一个问题,比如上面的ArrayList<Object>,可以存Dog1的对象,但是调用get()方法取出来的对象就是Object类型,此时编译器已无法确认它是Dog1,因此就会报错。
任何从ArrayList<Object>取出的东西都会被当作Object类型的引用而不管它原来是什么。
网友评论