[讨论]关于私有方法在继承中的疑问
<P>class Test2 extends Test{<BR> public void f1(){<BR> System.out.println("public f1()");<BR> }<BR>}</P><P>public class Test {<BR> private void f1(){<BR> System.out.println("private f1()");<BR> }<BR> public static void main(String args[]){<BR> Test t=new Test2();<BR> t.f1();<BR> }<BR>}<BR>该代码结果为:private f1()<BR>主类的私有方法子类是看不见的,所以子类无法调用父类的私有方法。这里相当于子类重新写了一个f1()方法。问题在于,t是指向Test2类的对象,应该调用子类对象的方法啊,为什么结果还是调用父类方法?</P>
<P>class P2 extends P1{<BR> public void p1(){<BR> System.out.println("p2");<BR> }<BR>}<BR>public class PrivateOverriding {<BR> public static void main(String args[]){<BR> P1 p=new P2();<BR> p.p1(); <FONT color=#ee1111>//这里出错,因为p1()对于p这个对象来说是不可见的<BR></FONT> }<BR>}<BR>为什么这里会出错?而在上面一个例子里面又不会出错?类创建的引用到底是怎么一回事啊?[em06]</P> <P>因为你的父类方法是私有的,所以不能被继承,没继承也就没覆盖这一说了,也就没多态可言。<BR>而父类不能调用子类里定义的方法。你的p是P1类型的,它就不能访问P2子类里的p1()方法,而P1里的p1()方法是私有的,也不可访问,所以报错了。<BR>你的第一个程序因为main()方法就在父类里,所以可以访问它自己私有的方法。</P> <P>那么我想知道,P1 p=new P2()和P2 p=new P2()有什么区别?他们创建的引用不都是指向P2类的新对象的吗?</P> <P>啊 不懂啊 Test t=new Test2();<BR> t.f1();<BR><BR>t明明是指向Test2啊 为什么调用 Test的方法? 为什么不是调用Test2里的f1()啊?</P> 对于private,static ,final修饰的方法都不是动态绑定的。<BR>也就是说private方法一开始就知道它被P1调用的。而对于其他方法都是动态调用的,一直到调用其方法时才知道调用哪个方法。<BR>对于P1 p=new P2(),相当于p2=new P2();P1 p=(P1)p2;他被强制转换为P1类型。此时调用p.p1(),它就调用父类里的p1().因为它一开始就已经被绑定了。<BR><BR>对于多态来说,当调用方法时,虚拟机会先用Class来判断类型,然后调用相应的方法。 P1 p=new P2()和P2 p=new P2()的具体区别是什么啊?如果P1是P2的父类的话。 6楼不是讲的好清楚了啊.<BR>相当于: P1 p=(P1)(new P2());被强制转行了.<BR> 也就是说,P1 p=new P2()实际上p是指向一个P1类的对象了?不能调用P2类有而P1类没有的方法? 不是的,你在另一类中,怎么能访问一个类的私有方法呢?所以会出错.<BR>而你第一个,是在同一个类中,所以能访问私有方法 那就普通的情况来说,什么时候会用父类的引用指向子类的对象呢?这样做有什么好处吗在实际应用中? 具体的,你可以看下think in java 中有个很详细的介绍. 目前我就在看这本书,看到这个地方才有问题的...[em03]<BR>我只有英文版... <P>116381938 我给你传个中文的吧``</P> <P>谢啦!不过公司里没法用QQ,MSN等工具,外网也被封了,晚上回去我加你</P> <P>啊,终于想通了!谢谢大家!</P> <DIV class=quote><B>以下是引用<U>袁小六</U>在2007-8-10 12:07:23的发言:</B><BR>
<P>啊 不懂啊 Test t=new Test2();<BR> t.f1();<BR><BR>t明明是指向Test2啊 为什么调用 Test的方法? 为什么不是调用Test2里的f1()啊?</P></DIV>
<P>这就是动态绑定和静态绑定的东西了</P> 帮不上忙,I'SORRY..... 楼上在灌水?还是哪个大牛的马甲....???? 挖坟...
页:
[1]
2
