在java多态中,为什么调用子父类中的同名变量及函数时,变量调用的是父类的,函数是子类的
如果子类和父类中有同名的变量和同名的函数时,在多态中被调用时为什么调用的是父类的变量创建的父类对象的指引不是指向的子类的堆内存空间吗。而为什么当调用函数时,调用的又是子类...
如果子类和父类中有同名的变量和同名的函数时, 在多态中被调用时 为什么调用的是父类的变量 创建的父类对象 的指引 不是指向的子类的堆内存空间吗。而为什么当调用函数时,调用的又是子类重写后的方法。不要给我说结论,结论我知道,我是想知道过程,最好把内存的运行过程,及每一步在内存中的位置讲清楚。例子:Fu f= new Zi();f.x和f.x();为什么他俩被调用时,调用的位置不一样,
展开
展开全部
Fu f= new Zi()
首先你要知道“Fu f”是放在栈中,而“new Zi()”是放在堆中;编译的时候,是在的栈中f,就是Fu对象,父类变量;而实际运行的时候,f会指向堆中的“new Zi()”,就是子类对象,自然运行子类的函数
首先你要知道“Fu f”是放在栈中,而“new Zi()”是放在堆中;编译的时候,是在的栈中f,就是Fu对象,父类变量;而实际运行的时候,f会指向堆中的“new Zi()”,就是子类对象,自然运行子类的函数
追问
别闹。
追答
我觉得我说的已经比较清楚了,在栈中的“Fu f”只不过是挂着父类头衔,存着子类对象的地址值,这个f并不代表任何父类的实例,只是一个地址值;所以,只要在编译期间所有的行为jvm都会解析成父类的对象啊,值啊;但是实际运行时,会用这个地址值去找堆中找的实例对象运行;就是子类,自然执行的是子类的方法。
展开全部
变量没有覆盖这种说法,变量只属于特定的类型,只以声明类型作为查找目标。当要明确使用父类相同名称变量时可以使用 "super.变量名"的形式
追问
你都没弄清我问的什么
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这其实就是java多态的实现,首先说成员变量,因为在java中,一个对象实例是存储在堆中的,而这个对象包含的内容有对象头,对象体以及对其字节,首先对象头存放的是对象运行时的数据,像是hashcode,锁标识,类型指针,那么对象体中存放的是对象的成员变量,成员变量包括从父类继承过的成员变量和本类的成员变量,那么如果父类和子类有重名的变量,那么这个时候就要看对象的静态类型是什么了,静态类型就是声明类型,如果声明类型是父类那么就直接选取父类的成员变量,如果声明类型是自己的类那么就选取本身类的成员变量,所以选取同名的成员变量的时候是根据静态类型来的。下面再看下成员方法的选取,方法其实是在方法区存放着一张虚表,虚表中存放着是方法的实际入口地址,在实际对象调用的时候虚表会做动态的改变,如果一个方法在子类中被重写了,而这时静态类型又是父类,那么就把虚表中被重写方法的实际入口地址,替换成被重写的方法的入口地址,所以在调用的时候是访问不到被重写的旧方法的。而静态方法直接就不能被重写,更别说调用被重写之后的方法,而且静态方法是属于类的,所以在调用的时候,直接调用的是本类的方法,与运行时对象是没关系的,希望我讲清楚了,也希望对你有帮助谢谢!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我的理解是这样的既然是多态那就应该用多态的思想去想问题,这里我们把父类看作四边形,子类看作平行四边形,这俩个方法我们看作行为,子类的行为和父类行为,为什么调用的是子类的行为呢
因为子类的行为是固定的,而父类也就是说四边形的行为可以指很多种四边形的行为其实父类也可以看作抽象类
父类这个方法可以有很多种实现方式如果要调用不知道具体实现哪一种 所以在调用的时候调用子类的方法 希望我的理解能帮助你们
因为子类的行为是固定的,而父类也就是说四边形的行为可以指很多种四边形的行为其实父类也可以看作抽象类
父类这个方法可以有很多种实现方式如果要调用不知道具体实现哪一种 所以在调用的时候调用子类的方法 希望我的理解能帮助你们
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询