面向对象3

2016-11-24  本文已影响10人  科学旅行者

参考资料:《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类型的引用而不管它原来是什么。

上一篇 下一篇

猜你喜欢

热点阅读