面向对象3

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,960评论 18 399
  • 1.继承:单继承,多继承 第一种(单): 第二种:多继承 注意:在继承中,一旦父类里有私有属性,不能直接继承 2....
    a荷包蛋阅读 1,202评论 0 0
  • 美国心理学家安德森曾经绘制了一张表,列出了550个描写人的形容词。他让大学生们选出最喜欢的品质和最...
    willson_p阅读 1,111评论 0 0
  • 之前我一般是通过wifi连入我的iMac,然后使用HttpScoop或者Charles来进行数据抓取及分析。前者非...
    PengPengPro阅读 8,254评论 0 0
  • 预解析: 获取元素结构:parentNode document 结构父级定位:offsetPare...
    简单的名字吧阅读 1,254评论 0 0