返回类型多态是如何实现的
返回类型多态是怎么实现的?
新手,很多不懂,麻烦了。
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()具体是怎工作的?
------解决思路----------------------
上面的思想++
不过源码应该是这样的吧(jdk1.5及以上的):
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类型。
源码:
注:在jdk新版本中如果未进行泛型设置时,ArrayList myLIst = new ArrayList(); 相当于ArrayList<Object> myLIst = new ArrayList<Object>();
那么如果get返回的是Object类型,向下调用eat方法,编译肯定会报错的
------解决思路----------------------
由类型参数指定,也就是<>中的参数。
从ArrayLIst<Object>取出引用时,就是Object。
从ArrayLIst<Dog>取出引用时,就是Dog。
新手,很多不懂,麻烦了。
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()具体是怎工作的?
------解决思路----------------------
上面的思想++
不过源码应该是这样的吧(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方法,编译肯定会报错的
------解决思路----------------------
由类型参数指定,也就是<>中的参数。
从ArrayLIst<Object>取出引用时,就是Object。
从ArrayLIst<Dog>取出引用时,就是Dog。