黑马程序员技术交流社区

标题: 一个面试题 有些不懂的地方 [打印本页]

作者: 攀攀    时间: 2014-4-30 18:57
标题: 一个面试题 有些不懂的地方
  1. class Userful
  2. {
  3. public void f()
  4. {
  5. System.out.println("Now in f method of super class");
  6. }
  7. public void g()
  8. {
  9. System.out.print("Now in g method of super class");
  10. }
  11. }
  12. class MoreUserful extends Userful
  13. {
  14. public void f()
  15. {
  16. System.out.println("Now in f method of derived class");
  17. }
  18. public void g()
  19. {
  20. System.out.println("Now in g method of derived class");
  21. }
  22. public void u()
  23. {
  24. System.out.println("Now in u method of derived class");
  25. }
  26. public void v()
  27. {
  28. System.out.println("Now in v method of derived class");
  29. }
  30. public void w()
  31. {
  32. System.out.println("Now in w method of derived class");
  33. }
  34. }
  35. class Test
  36. {
  37. public static void main(String[] args)
  38. {
  39. Userful[] x = { new Userful(), new MoreUserful() };
  40. x[0].f();
  41. x[1].g();
  42. ((MoreUserful)x[1]).u();
  43. }
  44. }
复制代码
别的我都明白但是((MoreUserful)x[1]).u(); 这句是什么意思 不明白 为什么要把类名加到对象前边 是怎么一回事 麻烦大神帮忙解读一下


作者: 谢振宣    时间: 2014-4-30 19:29
本帖最后由 谢振宣 于 2014-5-1 21:21 编辑
  1. class Userful
  2. {
  3.         public void f()
  4.         {
  5.                 System.out.println("Now in f method of super class");
  6.         }
  7.         public void g()
  8.         {
  9.                 System.out.print("Now in g method of super class");
  10.         }
  11. }
  12. class MoreUserful extends Userful
  13. {
  14.         public void f()
  15.         {
  16.                 System.out.println("Now in f method of derived class");
  17.         }
  18.         public void g()
  19.         {
  20.                 System.out.println("Now in g method of derived class");
  21.         }
  22.         public void u()
  23.         {
  24.                 System.out.println("Now in u method of derived class");
  25.         }
  26.         public void v()
  27.         {
  28.                 System.out.println("Now in v method of derived class");
  29.         }
  30.         public void w()
  31.         {
  32.                 System.out.println("Now in w method of derived class");
  33.         }
  34. }
  35. class Test
  36. {
  37.         public static void main(String[] args)
  38.         {
  39.                 Userful[] x = { new Userful(), new MoreUserful() };
  40.                 x[0].f();
  41.                 x[1].g();
  42.                 ((MoreUserful)x[1]).u();//此处属于强制类型转换,但是x[1]本来就是MoreUserful类型的,此处转换无意义
  43.         }//之前的解释错了,修正一下:此处属于多态的应用,当子类要调用父类中没有定义的方法时,要向下转型为自己的类型
  44. }//才能调用自己独有的方法。
复制代码

作者: Lin0411    时间: 2014-5-1 17:54
此处必须加上MoreUserful的强制类型转换!!!
因为数组的类型是Userful,而数组中第二个元素存放的是Userful的子类MoreUserful类的实例对象。
x[1]相当于(Userful)(new MoreUserful() ),若不进行强制类型转换,则x[1]中只有覆盖了Userful中方法的方法,即f方法和g方法,而没有u方法,从而在直接运行x[1].u()时编译器报错找不到相应的方法。




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