黑马程序员技术交流社区

标题: 多态规则的问题 [打印本页]

作者: 赵然    时间: 2013-6-30 14:06
标题: 多态规则的问题
复习中看到多态又蛋疼了:听毕老师将多态时表示看了几遍还是没看懂,怎么也没搞明白内存中到底是怎么个存法和指向,求助啊~~~
多态时,Fu f = new Zi();这时如果子父类中如果有同名的静态成员方法和成员变量的话,如果之后使用的话是使用父类的,问下子类中的静态方法和变量是覆盖过父类的么,也就是说是自己定义的那些么?另外这个时候的非晶态成员函数又是咋搞的?这个f到底是指向谁的,这个谁中都有些什么方法。  请大神们画个图解释下。
现在规律是背下来了但是就是搞不清内存中是怎么搞的。心里还是不得劲。求正解图~~绝不问为什么那么存那么指向的、、、哈哈
作者: 郑锐    时间: 2013-6-30 22:48
f是父类引用,这是毫无疑问的,了解这个以后,调用哪个静态成员就容易理解了
1.静态成员(函数和变量)。
静态成员又叫类成员,也就是说他们是属于类的,那么引用变量是哪个类的,调用的就是哪个类的静态成员。


作者: 赵然    时间: 2013-7-1 10:21
郑锐 发表于 2013-6-30 22:48
f是父类引用,这是毫无疑问的,了解这个以后,调用哪个静态成员就容易理解了
1.静态成员(函数和变量)。
...

能详细解释下么   没看得太懂
作者: 赵然    时间: 2013-7-1 10:30
来人啊    我郁闷~~~~
作者: 郑锐    时间: 2013-7-1 11:43
那我告诉你一个简单的记忆方法
多态的含义是:同一种方法在不同的对象身上会产生不同的执行结果。
这里有两个关键字:1.方法。2.对象
第一:引用变量类型就是创建他使用的类型,比方Fu f=new Zi(),那f就是Fu的应用变量。
1.多态针对的是方法,和属性无关,也就是说f是谁的引用,调用的就是谁的属性,不存在多态。
2.多态针对的是对象的方法,而静态方法是类方法,和对象无关,就是说f是那个类的引用,调用的就是哪个类的静态方法。
简单点说,多态只应用与非静态的方法。如果还有疑问的话,可以自己做个Demo演示一下,就明白了。

作者: x.love    时间: 2013-7-1 12:24
如果是静态的成员或者非静态成员变量,编译和运行都看左边,也就是看Fu类中是否有你调用的方法,若没有则编译失败,运行也失败。如果是非静态成员函数,则编译看左边,运行看右边。也就是说,编译看Fu类是否存在调用的方法,若不存在,则编译失败。运行的结果子类复写的方法内容。
作者: oxf974025918    时间: 2013-7-1 13:58
我的理解是如果子类覆盖了父类方法就是调用子类方法的实现,如果没有覆盖就是父类的方法的实现。
作者: j816326    时间: 2013-7-1 16:02
多态研究的内容(对象):
                A:成员变量:
                        编译看左边,执行看左边

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

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

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

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

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

恩 我想你说的应该是成员函数的覆盖吧  如果是变量覆盖了这时用的还是父类的 对吧  所以。。。。--!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2