黑马程序员技术交流社区

标题: 小问题。。。。。。。 [打印本页]

作者: lizhangzhi    时间: 2013-9-25 20:07
标题: 小问题。。。。。。。
  1. class Outer {
  2.         String string="Outer string";
  3.         public void printing(){
  4.                 System.out.println("Outer");
  5.         }
  6. }
  7. class inner extends Outer{
  8.          String string="inner string";
  9.      public void printing(){
  10.              System.out.println("inner");
  11.      }
  12. }
  13. public class Test2 {
  14.    
  15.         /**
  16.          * @param args
  17.          */
  18.         public static void main(String[] args) {
  19.                 // TODO Auto-generated method stub
  20.           Outer i=new inner();
  21.         (( Outer) i).printing();
  22.            System.out.println(((Outer)i).string);
  23.         }

  24. }
复制代码

作者: 罗凯健    时间: 2013-9-25 20:12
问题是?
作者: 罗凯健    时间: 2013-9-25 20:26
假如你的问题是问为什么两次的打印结果不一样的话,我就说说吧。
根据Java的多态机制,父类引用指向子类对象的时候,它访问的方法是子类中的方法。所以打印的是子类中的属性。而访问引用中的属性的话,它还是指向本类的属性。
作者: 暮雨    时间: 2013-9-25 20:47
你是想问结果为什么是
  1. inner
  2. Outer string
复制代码
的吧。
其实也很简单,就是多态的表现吧,这里Outer i=new inner();就是多态的一个运用,多态实现的三个条件
1.有继承 2.有覆盖 3父类引用指向子类对象  很显然你的代码都满足。那么结果也是显而易见的
首先输出inner 是因为你在inner类里对Outer类的方法printing进行了重写(也就是覆盖),所以调用printing方法时就会调用inner类的printing方法。
第二个输出Outer string 是因为你的引用是Outer类的,(Outer)i).string 父类对象是看不到子类特有的东西的,所以访问的也还是父类的属性。
希望能帮到你。
作者: 问天    时间: 2013-9-25 21:15
同意楼上的说法, 还有 就此问题中 主方法中不必转型
作者: 疯宇    时间: 2013-9-26 02:17
你们好厉害啊,楼主没问,你们都能答上啊!{:soso_e179:}
作者: 黄炳期    时间: 2013-9-26 07:54
⊙﹏⊙b汗。。。
作者: 杨修    时间: 2013-9-26 09:37
楼主想刷帖???




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