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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黄兴旺 于 2013-8-9 22:12 编辑
  1. 3.
  2. 写出程序结果
  3. interface A{}  
  4. class B implements A
  5. {
  6.         public String func()
  7.         {
  8.                 return "func";
  9.         }
  10. }
  11. class Demo
  12. {
  13.         public static void main(String[] args)
  14.         {
  15.                 A a=new B();
  16.                 System.out.println(a.func());
  17.         }
  18. }
  19. 编译失败:因为A接口中并未定义func方法。


  20. ====================================================================
  21. 4.
  22. 写出程序结果        
  23. class Fu
  24. {
  25.         boolean show(char a)
  26.         {
  27.                 System.out.println(a);
  28.                 return true;
  29.         }
  30. }
  31. class Demo extends Fu
  32. {
  33.         public static void main(String[] args)
  34.         {
  35.                 int i=0;
  36.                 Fu f=new Demo();
  37.                 Demo d=new Demo();
  38.                 for(f.show('A'); f.show('B')&&(i<2);f.show('C'))
  39.                 {
  40.                         i++;
  41.                         d.show('D');
  42.                 }        
  43.         }
  44.         boolean show(char a)
  45.         {
  46.                 System.out.println(a);
  47.                 return false;
  48.         }
  49. }
  50. A B
复制代码
我疑惑的是为什么3题中a.func()调用的是A中的方法,而4题中f.show('A')调用的却是Demo中的方法。谢谢!!!

18 个回复

正序浏览
第三题:这是老师多次强调的一个多态问题:父类不能预先调用子类的方法,因为父类根本不具备那个功能。只能将其强制向下转型成子类后,才能调用。

第四题:这题就是第三题的扩展了,当父类中有该方法时,如果子类也有,就会覆盖该父类方法。

评分

参与人数 1技术分 +2 收起 理由
黄兴旺 + 2 ....

查看全部评分

回复 使用道具 举报
黑马王晓明 发表于 2013-8-9 21:39
多态中的细节问题:
非静态成员变量的特点:
编译时期,参考引用型变量中,是否有这个变量

灰常感谢。。
回复 使用道具 举报
645420297 发表于 2013-8-9 20:50
你要明白方法中的就进调用原则
3题中的父类接口指向子类对象,用f调用子类特有方法需要强转,所以你当然编 ...

灰常感谢。。
回复 使用道具 举报
夜写意 发表于 2013-8-9 20:42
题3:
B实现了A接口。但是建立对象的时候是A类的引用指向了B。a是属于A接口的对象,它里面只有a的方法。A里 ...

灰常感谢。。
回复 使用道具 举报
会飞的狼 发表于 2013-8-9 18:14
是的,你说的是多态,也就是这种定义方式:父类声明  类名 = new 子类();
这种形式下如果子类于父类有 ...

灰常感谢。。
回复 使用道具 举报
天涯海角 发表于 2013-8-9 18:06
是这样的,因为4题中子类与父类中都有show方法,子类的show方法覆盖了父类的show方法,所以f.show(‘A’) ...

灰常感谢。。
回复 使用道具 举报
会飞的狼 发表于 2013-8-9 16:21
第四题Fu f=new Demo();父类引用指向了子类对像,子类对像中覆盖了父类中的show方法,所以调用的是demo中的 ...

灰常感谢。。
回复 使用道具 举报
崔一恒 发表于 2013-8-9 17:02
第三题使用接口来指向新对象的,而接口中又没有func()方法自然不行。
楼主第四题中子类覆写了show(char  ...

灰常感谢。。
回复 使用道具 举报
多态中的细节问题:
非静态成员变量的特点:
编译时期,参考引用型变量中,是否有这个变量
运行时期,参考引用型变量中的变量的值

静态成员患变量特点
编译时期,参考引用型变量中,是否有这个变量
运行时期,参考引用型变量中的变量的值

静态成员方法的特点
编译时期,参考引用型变量中,是否有这个方法
运行时期,参考引用型变量中的方法

非静态成员方法的特点
编译时期,参考引用型变量中,是否有这个方法
运行时期,参考子类对象中的方法

在编译时期,JVM静态的绑定在父类的引用变量中
只要在非静态成员方法运行的时候,JVM动态的绑定到子类对象中

简单的说:
   除了(非静态成员方法)以外,编译看左边,运行看左边
   只有在非静态方法中,编译看左边,运行看右边
回复 使用道具 举报
你要明白方法中的就进调用原则
3题中的父类接口指向子类对象,用f调用子类特有方法需要强转,所以你当然编译失败
4题中,子类复写了父类方法,父类引用指向了子类对象
就进原则,先找子类show方法,子类有就调用子类,没有才会去调用父类的
回复 使用道具 举报
题3:
B实现了A接口。但是建立对象的时候是A类的引用指向了B。a是属于A接口的对象,它里面只有a的方法。A里面并没有定义func()方法,所以调用失败,如果想要用到B中的方法的话,必须加上一句:B b = (B)a;  通过b.func();调用。这个是将a向下转型为B类,可以取得B中的方法。
题4:
在Demo继承了Fu以后,将Fu中的show(char a)方法复写了,f是Fu类的引用指向了Demo。所以调用的时候调用的是Demo中的show方法。
回复 使用道具 举报
黄兴旺 发表于 2013-8-9 17:54
意思是不是 如果子类覆盖了父类的方法就用子类的,如果子类没有覆盖父类的方法就用父类的方法?
第3题中 ...

是的,你说的是多态,也就是这种定义方式:父类声明  类名 = new 子类();
这种形式下如果子类于父类有同样的方法,也就是产生了复写的话,那么调用的是子类的方法;如果父类有个方法,子类没有复写,那么调用的是父类方法,如果父类没有该方法,如果用这个类名调用子类方法的话就会错误。
如果父类是个接口,那么调用的一定是子类方法(前提是该接口定义了子类中的抽象方法,否则也会出错),
回复 使用道具 举报
是这样的,因为4题中子类与父类中都有show方法,子类的show方法覆盖了父类的show方法,所以f.show(‘A’)调用的是Demo中的方法。
回复 使用道具 举报
崔一恒 发表于 2013-8-9 17:02
第三题使用接口来指向新对象的,而接口中又没有func()方法自然不行。
楼主第四题中子类覆写了show(char  ...

意思是不是 如果子类覆盖了父类的方法就用子类的,如果子类没有覆盖父类的方法就用父类的方法?
第3题中接口A中没有方法用来调用 所以就编译失败了???
回复 使用道具 举报
会飞的狼 发表于 2013-8-9 16:18
第三题是编译失败的,因为接口A中没有B中的抽象方法,虽然建立了B类对象的A类引用,但是掉用不到B类对像中 ...

意思是不是 如果子类覆盖了父类的方法就用子类的,如果子类没有覆盖父类的方法就用父类的方法?
第3题中接口A中没有方法用来调用 所以就编译失败了???
回复 使用道具 举报
第三题使用接口来指向新对象的,而接口中又没有func()方法自然不行。
楼主第四题中子类覆写了show(char a)方法,所以调用的是字类方法。
关于第四题涉及到动态绑定(池绑定)的问题,动态绑定就是在执行期间(而非编译期)判断所引用对象的实际类型,根据其实际的类型调用期对应的方法。
简单来讲,方法都是存放在方法区的,在new出对象在堆内存就有一个指针指向那个方法,如果覆写了方法,new的又是子类对象那么新指针自然就指向了覆写后的方法了。
回复 使用道具 举报
第四题Fu f=new Demo();父类引用指向了子类对像,子类对像中覆盖了父类中的show方法,所以调用的是demo中的show方法
回复 使用道具 举报
第三题是编译失败的,因为接口A中没有B中的抽象方法,虽然建立了B类对象的A类引用,但是掉用不到B类对像中的方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马