A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵然 中级黑马   /  2013-6-30 14:06  /  2112 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

复习中看到多态又蛋疼了:听毕老师将多态时表示看了几遍还是没看懂,怎么也没搞明白内存中到底是怎么个存法和指向,求助啊~~~
多态时,Fu f = new Zi();这时如果子父类中如果有同名的静态成员方法和成员变量的话,如果之后使用的话是使用父类的,问下子类中的静态方法和变量是覆盖过父类的么,也就是说是自己定义的那些么?另外这个时候的非晶态成员函数又是咋搞的?这个f到底是指向谁的,这个谁中都有些什么方法。  请大神们画个图解释下。
现在规律是背下来了但是就是搞不清内存中是怎么搞的。心里还是不得劲。求正解图~~绝不问为什么那么存那么指向的、、、哈哈

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1

查看全部评分

9 个回复

倒序浏览
f是父类引用,这是毫无疑问的,了解这个以后,调用哪个静态成员就容易理解了
1.静态成员(函数和变量)。
静态成员又叫类成员,也就是说他们是属于类的,那么引用变量是哪个类的,调用的就是哪个类的静态成员。

回复 使用道具 举报
郑锐 发表于 2013-6-30 22:48
f是父类引用,这是毫无疑问的,了解这个以后,调用哪个静态成员就容易理解了
1.静态成员(函数和变量)。
...

能详细解释下么   没看得太懂
回复 使用道具 举报
来人啊    我郁闷~~~~
回复 使用道具 举报
那我告诉你一个简单的记忆方法
多态的含义是:同一种方法在不同的对象身上会产生不同的执行结果。
这里有两个关键字:1.方法。2.对象
第一:引用变量类型就是创建他使用的类型,比方Fu f=new Zi(),那f就是Fu的应用变量。
1.多态针对的是方法,和属性无关,也就是说f是谁的引用,调用的就是谁的属性,不存在多态。
2.多态针对的是对象的方法,而静态方法是类方法,和对象无关,就是说f是那个类的引用,调用的就是哪个类的静态方法。
简单点说,多态只应用与非静态的方法。如果还有疑问的话,可以自己做个Demo演示一下,就明白了。
回复 使用道具 举报 1 0
如果是静态的成员或者非静态成员变量,编译和运行都看左边,也就是看Fu类中是否有你调用的方法,若没有则编译失败,运行也失败。如果是非静态成员函数,则编译看左边,运行看右边。也就是说,编译看Fu类是否存在调用的方法,若不存在,则编译失败。运行的结果子类复写的方法内容。
回复 使用道具 举报
我的理解是如果子类覆盖了父类方法就是调用子类方法的实现,如果没有覆盖就是父类的方法的实现。
回复 使用道具 举报
多态研究的内容(对象):
                A:成员变量:
                        编译看左边,执行看左边

                B:成员方法:
                        编译看左边,执行看右边
               
                C:静态修饰成员:
                        编译看左边,执行看左边
                       
                        注意: 静态修饰的东西跟对象无关,也可以说不能算作多态的内容。
                             

                向上转型:为了多态使用对象
                向下转型:为了使用对象的特殊功能

                举例:
                        孔子爹:
                                年龄:40
                                功能:教书("JavaSE")
                        孔子:
                                年龄:20
                                功能:教书("论语")
                                      玩游戏();

                        想符合多态:
                                孔子爹 k爹 = new 孔子(); //多态,向上转型。穿上爹的衣服,带上爹的眼镜。装爹。
                               
                                sop(k爹.age); //40
                                k爹.教书(); //论语
                                //k爹.玩游戏(); //报错

                                //下班了
                                孔子 k = (孔子)k爹; //回家了,脱去爹的衣服,摘下眼镜,回到自己。向下转型。
                                k.教书(); //论语
                                k.玩游戏();
                                sop(k.age); //20
希望能帮到你
回复 使用道具 举报
亲们啊  我想要的是 在内存中的指向  存储  不是规则 这些规则我懂  但是我想如果我弄明白了原理来记忆的话不是更容易么   所以我求的是内存中存储和指向的原理图  你们说的这些我明白  但是就是内存中的原理图不懂   麻烦各位亲们认真看下我的问题 谢了
回复 使用道具 举报
oxf974025918 发表于 2013-7-1 13:58
我的理解是如果子类覆盖了父类方法就是调用子类方法的实现,如果没有覆盖就是父类的方法的实现。 ...

恩 我想你说的应该是成员函数的覆盖吧  如果是变量覆盖了这时用的还是父类的 对吧  所以。。。。--!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马