2 sinat 25136209 sinat_25136209 于 2017.01.14 19:04 提问

在非父子类关系中是否存在类似与父类引用指向子类对象的情况?

举个例子定义了一个list集合

 list<test> aa=new arraylist<test>();

其中test是个类
里面有a和b两个私有(int型的)变量,然后又有参构造和无参构造以及get,set方法。
现在已经往aa集合中添加了元素aa.add(new(1.2)).
然后

 test bb=aa.get(0);     //可能问了一个挺傻逼的问题。。

我的问题是:上面我单独列出来的语句,为啥能等式成立?我知道aa.get(0)它的类型
是test类型的,但是能不能用用父类引用指向子类对象这个来解释这个??
虽然这里并没有什么继承关系。。

5个回答

u010528826
u010528826   2017.01.14 22:01

List 是个接口:public interface List extends Collection
ArrayList 是它的一个实现类:public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable**
这里实际是接口引用指向其实现类。
跟父类引用指向子类对象一个道理

erdanhei
erdanhei   2017.01.14 21:03

test bb=aa.get(0); aa.get()使用的是List的方法图片说明,得到存入的第一个test类型对象,所以相等,api上讲的很清楚

sinat_25136209
sinat_25136209   2017.01.14 22:16

我想问的是test bb=aa.get(0);能不能用父类引用指向子类对象这个来解释,而不是问get是个什么方法。。我知道get方法,我也知道list集合。。。
test bb=aa.get(0);这个只是我举的一个例子,还有类似的比如说安卓的调用布局填充器的View v=view.inflate(xxx)这样的情况

sinat_25136209
sinat_25136209 可能我没说清我想说的,但是有木有前辈领会到那个意思的
一年多之前 回复
u010528826
u010528826   2017.01.14 22:51

test bb=aa.get(0);能不能用父类引用指向子类对象这个来解释?不能。
因为这里使用的是泛型,跟多态没关系。你在声明List的时候已经告诉list要往里面方Test类型的数据,所以aa.get(0)返回直接就是Test类型。

如果你改成这样:List aa=new arraylist();,那么 Test bb=aa.get(0);就会不成立,需要强转。

这里的核心是泛型,而不是多态。所以不能用父类引用指向子类对象来解释。

不知道这个回答是否跟你想问的一样

dabocaiqq
dabocaiqq   2017.01.14 22:50
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
父类引用指向子类对象,为什么会调用的是子类中重新的方法
老毕的"编译看左边,运行看右边"(多态执行)   (对面向对象语言中理解多态、继承很有帮助~~~)   老毕在讲到多态执行问题时,结合下面的例子,给我们总结了一套口诀:“成员变量,静态方法看左边;非静态方法:编译看左边,运行看右边。”意思是:当父类变量引用子类对象时(Fu f = new Zi(); ),在这个引用变量f指向的对象中,他的成员变量和静态方法与父类是一致
父类引用指向子类对象的理解
虽然接触java已经好长时间了,但对于一些知识点,还是有些模糊,就比如今天说的这个。 接触java的人都知道,继承是面向对象的三个特征之一(封装、继承、多态),继承中有一对概念,即父类和子类。他们通过关键字extends关联。 eg: 父类:parent 子类:son son extends parent parent  par = new son(); 关于这句,说明两点,
Java 父类引用指向子类对象
1.背景 面向对象的三大特点,继承,封装,多态。何为多态(Polymorphism)?接口的多种不同的实现方式就是多态(百度百科)。  PC上的一个USB接口,可以插入U盘,可以插鼠标,也可以连接手机,在PC上会有针对这些设备不同的驱动程序以实现连接,也就是谁使用谁去实现。 在程序语言中,通过子类继承父类,然后重写覆盖的方法,在创建对象时,将父类的引用指向子类的对象,就可以利用父类引用调
java 父类引用指向子类对象---动态绑定之易错点详解
知识点: 1、java 中父类引用指向子类对象时动态绑定针对的只是子类重写的成员方法; 2、父类引用指向子类对象时,子类如果重写了父类的可重写方法(非private、非 final 方法),那么这个对象调用该方法时默认调用的时子类重写的方法,而不是父类的方法; 3、对于java当中的方法而言,除了final,static,private 修饰的方法和构造方法是前期绑定外,其他的方法全部为动态
从对象的内存角度来理解“父类的引用指向子类的对象”
 多态中总不理解Father f = new Son()是怎么引用子类对象的,现在从从对象的内存角度来理解试试. 假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,它里面的变量需要占用0.5M内存. 现在通过代码来看看内存的分配情况: Father f = new Father();//系统将分配1M内存. Son s = new S
多态的理解(父类引用指向子类对象)
多态:要有继承,方法的重写,父类引用指向子类对象           ?疑问:Animal cat = new Cat(); //向上转型。        父类引用指向子类对象,该引用不能再访问子类新增加的成员,那么这样和直接new一个父类实例(Animal a = new Animal())有什么区别?            1、当父类是抽象类或是接口时,不能实例化时,只能运用多态,向上转型
对用父类指针(或引用)指向父类对象和子类对象时,从而用父类指针或者引用访问成员时的深刻理解;
赋值兼容规则永远不变,父类指针既可以指向父类对象,也可以指向子类对象;当父类指针指向父类对象时,访问父类的成员;当父类指针指向子类对象时,那么只能访问子类中从父类继承下来的那部分成员;不能访问子类独有的成员,如果访问,编译阶段会报错;函数隐藏(将父类的成员隐藏,通过子类对象或者在子类内部只能访问子类的同名成员;但是父类的成员仍然存在),是指当子类中有和父类同名的成员变量时,此时子类中有两个名字相同的
集合的父子类关系
一.Collection的父子类关系 1.Iterable(java集合的顶级接口之一)——实现此接口的类可以使用新的for循环 2.Iterator(接口,遍历器)ListIterator 方法:hasNext();next();remove(); 3.Collection(接口,继承Iterable) 方法: add();addAll();remove();removeAl
父类类型的引用指向子类的对象
对于多态,可以总结以下几点: 一、使用父类类型的引用指向子类的对象;  二、该引用只能调用父类中定义的方法和变量;  三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)  四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。
关于父类引用指向子类对象的那些事
废话不多说,先上代码:public class Father { static int b=7; int a=5; public void say(){ System.out.println("父亲say"); } public void write(){ System.out.println("父亲write");