黑马程序员技术交流社区

标题: 多态问题。。。 [打印本页]

作者: 樊玲    时间: 2013-3-13 00:04
标题: 多态问题。。。
class  Demo
{
        public static void main(String[] args)
        {
                Father f=new Son();          //f引用指向对象的真实类型是Son
                if(f instanceof Son)          //判断对象指向的真实类型是否是Son        疑问:既然Father f=new Son();能实现,说明Father
                                                      //与Son有继承关系,而且,是子父类的继承关系。***  f引用肯定是会指向Son对象的,为什么要做判断呢?
                                                                                        //而且,*** 既然f引用指向的是Son对象,为什么 f instance of Father 也成立呢? f 到底真实指向了谁??
                {
                        Son son=(Son)f
                }
        }
}
class Father
{
        void say()
        {
                System.out.println("father run");
        }
}

class Son
{
        void say()
        {
                System.out.println("son run");
        }
        void print()
        {
                System.out.println("son print ");
        }
}

作者: wanggang    时间: 2013-3-13 00:44
instanceof 是用来判断后面的类是不是前面的子类,起到验证的作用
作者: 黑马17期-闫东东    时间: 2013-3-13 00:45
本帖最后由 黑马17期-闫东东 于 2013-3-13 00:46 编辑

Father f=new Son();//

              if(f instanceof Son)//instanceof 的作用是测试他左边的对象是不是右边类的类型,返回boolean类型,做判断可能是因为这代码是你写的你当然知道,到后别人来添加新功能时,就不确定了
           {                     
               Son son=(Son)f  ;//
}//多态自始至终都是子类对象在做着变化,向上转型,向下强转。
作者: 李阳    时间: 2013-3-13 01:32
Father f=new Son();
  if(f instanceof Son)
{                     
               Son son=(Son)f  ;
}判断f是不是Son类型肯定是有道理的。电脑又不知到f是不是Son类型。万一传递来的f不是Son类型就会运行时报异常。用户在使用程序是胡乱传入参数就会导致异常,所以要判断下。虽说本程序不判断也没问题,但是写上判断语句不就更加严谨嘛。要养成好的编程习惯,以后才会不痛苦。
作者: 安鹏宇    时间: 2013-3-13 02:35

Father f = new Son();//父类引用指向子类对象
if(f instanceof Son);      //这里比较 虽不能确定指向的真实类对象是son还是Father但是
if(f instanceof Father)        //不论是son 还是 Father都能证明两个类之间有继承关系。(我感觉可以这样理解)
Son son = (Son)f;       

/*老师说过,因为这代码是自己写的,明知道它到底指向谁,可以省略,但以后开发中看别人代码
                                     改进别人代码 如果类太多当然需要咱自己去验证啦
                                     你要是纠结到底指向谁就用
                                f.getClass()==Son.class比较吧,会确定到底指向哪个对象。*/
作者: 李辉    时间: 2013-3-13 03:27
问题一:关于为什么要判断,楼上的各位说的都挺有道理的,你可以借鉴一下。不过,我想说的是不要太过纠结于此,我们现在还太缺乏编程经验,就算别人告诉我们这样写是为了严谨、安全、、、,还是不能深刻的理解,以后遇到真实的案例自然就明白了,现在知道有那回事就行了,毕竟还有很多更重要的东西要学。
问题二:f引用指向的是Son对象,这个对象同时也是一个Father对象。这就是继承的向上转型。给你举个简单的例子:你是一个中国人,但同时也是一个亚洲人,那你到底是中国人还是亚洲人?其实说你是中国人更准确点,说你是亚洲人也没错。这和继承的道理是一样的。
作者: TK13761    时间: 2013-3-13 09:06
l楼上几位说的都非常明白 受教了
作者: 猫腻    时间: 2013-3-13 09:39
请及时结贴,否则扣除技术分。
作者: 樊玲    时间: 2013-3-13 10:57
猫腻 发表于 2013-3-13 09:39
请及时结贴,否则扣除技术分。

:'(          弱弱地问一下,在哪儿结贴,,




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