返回类型多态是怎么实现的?

owydeai 2015-01-25 12:53:51
新手,很多不懂,麻烦了。

ArrayList<Dog> myLIst = new ArrayList<Dog>();

Dog s = new Dog();
myList.add(s);

Dog b = new Dog();
myList.add(b);

get(0).eat();

当 get(0)时是返回 myList[0],此时myList[0]这个对象引用的类型是Dog,相当于把Dog类型作为Object返回了,因为子类可以替代父类,所以这样是可以的。

但是返回之后它虽然还是指向原来的方向,但是用它来引用Dog中私有且独有(即Object没有的)的方法,编译器会允许吗?

此时get(0)的类型不是Object吗?如果是的话,编译器应该不会允许它使用Dog私有的方法的,是不是这样?

此时,好像就是父类引用怎么能当子类引用来使用的问题了?

ps:新版public E get(int index) ,旧版Object get( int index),想问下get()具体是怎工作的?
...全文
420 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
owydeai 2015-02-24
  • 打赏
  • 举报
回复
引用 10 楼 t_jl1979 的回复:
[quote=引用 9 楼 owydeai 的回复:] @t_jl1979 @FirstHelloWorld 假设取出方法还是以前的那种;Object get( int index),即在JDk 1.5之前的话。 从ArrayLIst<Object>取出引用时,引用类型是什么? 从ArrayLIst<Dog>取出引用时,引用类型是什么?
1.5之前不支持这种写法。 ArrayList myLIst = new ArrayList(); 那么只能是Object。 [/quote]看得书太烂...... head First java 把我都看迷糊了
冥王之锤 2015-01-27
  • 打赏
  • 举报
回复
引用 5 楼 FirstHelloWorld 的回复:
[quote=引用 3 楼 t_jl1979 的回复:] 定义时指定了Dog类型,ArrayList<Dog> myLIst = new ArrayList<Dog>(); get(0)不再返回Object,而是直接返回的Dog类型对象。 看JDK源码,这是个泛型方法:

    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }
上面的思想++ 不过源码应该是这样的吧(jdk1.5及以上的):
public E get(int index) {
	RangeCheck(index);

	return (E) elementData[index];
    }
ArrayList<Dog> myLIst = new ArrayList<Dog>();从这可以看出lz用的是5.0及以上的版本。当你new一个对象时,你已经为ArrayList的泛型E赋值了Dog,在get时是会进行强制类型转化的((E) elementData[index];)。 不过有一点不是太明白lz这样写get(0).eat();不报错?? 针对你说的旧版本的旧版Object get( int index); (5.0之前的) 源码基本类似,不过没有泛型,也没有强制类型转换,返回的就是一个Object类型。 源码:
public Object get(int index) {
	RangeCheck(index);

	return elementData[index];
    }
注:在jdk新版本中如果未进行泛型设置时,ArrayList myLIst = new ArrayList(); 相当于ArrayList<Object> myLIst = new ArrayList<Object>(); 那么如果get返回的是Object类型,向下调用eat方法,编译肯定会报错的[/quote] 1.8的jdk是我上面这么写的,不知道你看的是1.x的。各个版本的jdk偶尔会有微小的变化。
冥王之锤 2015-01-26
  • 打赏
  • 举报
回复
引用 9 楼 owydeai 的回复:
@t_jl1979 @FirstHelloWorld 假设取出方法还是以前的那种;Object get( int index),即在JDk 1.5之前的话。 从ArrayLIst<Object>取出引用时,引用类型是什么? 从ArrayLIst<Dog>取出引用时,引用类型是什么?
1.5之前不支持这种写法。 ArrayList myLIst = new ArrayList(); 那么只能是Object。
owydeai 2015-01-26
  • 打赏
  • 举报
回复
@t_jl1979 @FirstHelloWorld 假设取出方法还是以前的那种;Object get( int index),即在JDk 1.5之前的话。 从ArrayLIst<Object>取出引用时,引用类型是什么? 从ArrayLIst<Dog>取出引用时,引用类型是什么?
冥王之锤 2015-01-26
  • 打赏
  • 举报
回复
引用 6 楼 owydeai 的回复:
[quote=引用 3 楼 t_jl1979 的回复:] 定义时指定了Dog类型,ArrayList<Dog> myLIst = new ArrayList<Dog>(); get(0)不再返回Object,而是直接返回的Dog类型对象。 看JDK源码,这是个泛型方法:

    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }
从ArrayLIst<Object>取出引用时,引用类型是什么? 从ArrayLIst<Dog>取出引用时,引用类型是什么? 加上取出方法就是Object get( int index)[/quote] 由类型参数指定,也就是<>中的参数。 从ArrayLIst<Object>取出引用时,就是Object。 从ArrayLIst<Dog>取出引用时,就是Dog。
冥王之锤 2015-01-26
  • 打赏
  • 举报
回复
引用 4 楼 owydeai 的回复:
[quote=引用 3 楼 t_jl1979 的回复:] 定义时指定了Dog类型,ArrayList<Dog> myLIst = new ArrayList<Dog>(); get(0)不再返回Object,而是直接返回的Dog类型对象。 看JDK源码,这是个泛型方法:

    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }
以前是这样:Object get( int index); 那时是不是需要强制类型转换?[/quote] JDK1.5之前是要强制转换的。
owydeai 2015-01-26
  • 打赏
  • 举报
回复
引用 3 楼 t_jl1979 的回复:
定义时指定了Dog类型,ArrayList<Dog> myLIst = new ArrayList<Dog>(); get(0)不再返回Object,而是直接返回的Dog类型对象。 看JDK源码,这是个泛型方法:

    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }
从ArrayLIst<Object>取出引用时,引用类型是什么? 从ArrayLIst<Dog>取出引用时,引用类型是什么? 加上取出方法就是Object get( int index)
zhangxm2015 2015-01-26
  • 打赏
  • 举报
回复
引用 3 楼 t_jl1979 的回复:
定义时指定了Dog类型,ArrayList<Dog> myLIst = new ArrayList<Dog>(); get(0)不再返回Object,而是直接返回的Dog类型对象。 看JDK源码,这是个泛型方法:

    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }
上面的思想++ 不过源码应该是这样的吧(jdk1.5及以上的):
public E get(int index) {
	RangeCheck(index);

	return (E) elementData[index];
    }
ArrayList<Dog> myLIst = new ArrayList<Dog>();从这可以看出lz用的是5.0及以上的版本。当你new一个对象时,你已经为ArrayList的泛型E赋值了Dog,在get时是会进行强制类型转化的((E) elementData[index];)。 不过有一点不是太明白lz这样写get(0).eat();不报错?? 针对你说的旧版本的旧版Object get( int index); (5.0之前的) 源码基本类似,不过没有泛型,也没有强制类型转换,返回的就是一个Object类型。 源码:
public Object get(int index) {
	RangeCheck(index);

	return elementData[index];
    }
注:在jdk新版本中如果未进行泛型设置时,ArrayList myLIst = new ArrayList(); 相当于ArrayList<Object> myLIst = new ArrayList<Object>(); 那么如果get返回的是Object类型,向下调用eat方法,编译肯定会报错的
owydeai 2015-01-26
  • 打赏
  • 举报
回复
引用 3 楼 t_jl1979 的回复:
定义时指定了Dog类型,ArrayList<Dog> myLIst = new ArrayList<Dog>(); get(0)不再返回Object,而是直接返回的Dog类型对象。 看JDK源码,这是个泛型方法:

    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }
以前是这样:Object get( int index); 那时是不是需要强制类型转换?
冥王之锤 2015-01-26
  • 打赏
  • 举报
回复
定义时指定了Dog类型,ArrayList<Dog> myLIst = new ArrayList<Dog>(); get(0)不再返回Object,而是直接返回的Dog类型对象。 看JDK源码,这是个泛型方法:

    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }
owydeai 2015-01-26
  • 打赏
  • 举报
回复
引用 1 楼 skyhitnow 的回复:
编译器保证存入的对象是特定的类型,所以可以调用其方法而不需要强制类型转换。请查看泛型类相关知识。
返回类型不是Object吗?这个类型怎么能调用Dog独有的方法?
skyhitnow 2015-01-25
  • 打赏
  • 举报
回复
编译器保证存入的对象是特定的类型,所以可以调用其方法而不需要强制类型转换。请查看泛型类相关知识。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧