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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 涂金哲 中级黑马   /  2012-6-6 09:37  /  1452 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

详细讲解一下,多态中,静态成员方法和非静态成员方法的调用方式以及静态成员数据和非静态成员数据的调用?

6 个回复

正序浏览
在多态中成员函数的特点:(动态绑定)
在编译时期:参阅引用型变量所属类中是否有调用的方法。如果有,编译通过,如果没有编译失败
在运行时期:参阅对象所属类中是否有调用的方法。
简单总结就是:成员函数在多态调用是,编译看左边,运行看右边
在多态中成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)
在多态中,静态成员函数的特点:
无论编译和运行,都参看左边
这就是静态绑定和(非静态)动态绑定的区别
我们能转换的是父类引用指向了自己的子类对象。该引用可以被提升,也可以被强制转换
多态自始至终都是子类对象在做变化
千万不要出现这样的操作,就是将父类对象转换成子类类型
回复 使用道具 举报
本帖最后由 徐炯 于 2012-6-6 12:46 编辑
王月 发表于 2012-6-6 10:36
1:成员函数:
           编译时:要查看引用变量所属的类中是否有所调用的成员,如果有就调用然后 ...


你上面说的是:毕老师是对于不同情况(特殊情况)下的多态不同表现的总结。
               Fu f = new Zi();
                A:成员变量:编译和运行都看Fu。
                B:非静态方法:编译看Fu,运行看Zi。
                C:静态方法:编译和运行都看Fu。


但我个人感觉如果已经懂的人看总结是有用的,但是如果没有懂的人去看反而会出问题。所以我的建议是楼主要理解多态的真正含义和在静态时候等特殊情况下到底发生什么,先别管毕老师的总结为好!

我个人根据我所知道尽力给你解释下你提问的3点:

前两个问题是一个问题:A:成员变量:编译和运行都看Fu和 B:非静态方法:编译看Fu,运行看Zi------------------------------首先你要理解多态的含义:(如果要讲多态的话估计一两天都能丢进去,多态的应用太广,太大,在这不扩展,楼主可以查看下)我在这讲我的理解:多态必须依靠继承关系,并且在“通用”情况下是由于有函数复写机制造成的。
好了,明白上面2点后,我们在来分析Fu f = new Zi();----------我们首先了解变量F到底是什么,我们把这句子分2段:Fu f;这是声明一个变量f为Fu这个类,那么我们知道了f肯定是Fu类。然后我们f=new Zi();中建立一个子类对象赋值给了f,结果是什么难??
结果是,拥有了被Zi类函数覆盖后的Fu类对象----f------。

-------------------------------------------也就是说:只有子类的函数覆盖了父类的函数这一个变化,但是f肯定是Fu这个类,也就是说f不可能变成其他比如Zi这个类等等(突然f拥有了Zi类特有函数,成员变量等都是不可能的)。所以f所代表的是函数被复写后(多态的意义)的一个Fu类,而Fu类原来有的成员变量(不是成员函数不可能被复写)没有任何变化----------------获得结论:A:成员变量:编译和运行都看Fu。
-------------------------------------------但是f的Fu类函数被复写了。--------------获得结论:B:非静态方法:编译看Fu,运行看Zi


第三个问题在静态情况下:(特殊情况)C:静态方法:编译和运行都看Fu!!
其实很简单,首先我们要理解静态情况下发生了什么?----------------当静态时,Fu类的所有函数跟随Fu类加载而加载了。也就是Fu类的函数(是先于对象建立之前就存在了,无法被后出现的Zi类对象所复写的,所以没发生复写,那么获得:C:静态方法:编译和运行都看Fu。


希望可以帮到LZ!
回复 使用道具 举报
多态:首先要确定多态的前提:1:必须有继承类或者实现一个接口2:父类的引用指向子类对象。多态的使用必须是子父类都有方法。
静态的方法或者变量可以直接被类名调用。静态的方法只能访问静态的内容。

回复 使用道具 举报
对了,理解这些之前,一定要真正明白多态的前提:

1,类与类或者接口之间必须是有继承或者实现的关系。
2,子类必须重写父类的方法。
3,父类引用指向子类对象。

回复 使用道具 举报

     1:成员函数:

           编译时:要查看引用变量所属的类中是否有所调用的成员,如果有就调用然后编译。
           在运行时:要查看对象所属的类中是否有所调用的成员,如果有的话就会执行。
                总结:          编译看左边,运行看右边。
    2:成员变量:
          这个比较简单:它只看引用变量所属的类。
               总结:          编译看左边,运行也看左边
         
    3:静态方法
        编译时:要查看引用变量所属的类中是否有所调用的成员。
        运行时:和编译是一样,也要查看引用变量所属的类中是否有所调用的成员。
          总结:            编译看左边,运行也看左边。

    这些是多态的精髓,lz好好理解

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
以下是我的理解,如有错误的地方希望指点下,谢谢了~
因为静态是先于对象存在的,所以静态成员方法只能调用静态成员数据和其他的静态方法,不能调用非静态成员数据和方法。
非静态成员成员方法是对象建立以后调用的,所以可以访问和调用所有的静态成员方法和静态成员数据,也可以访问非静态的成员数据和其他方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马