黑马程序员技术交流社区

标题: 关于多态的小问题 [打印本页]

作者: gaigai7    时间: 2014-4-8 12:26
标题: 关于多态的小问题
多态中上溯造型怎么理解啊    看来很多遍 还是不怎么明白  模模糊糊的
作者: zhangbingyuan    时间: 2014-4-8 15:12
举个例子来说:
public   abstract   class  Animal {
     public  abstract  void  eat(){}
     public void sleep()
     {
        System.out.println("动物睡觉!");
     }
}

class Dog extends Animal
{
   public void eat()
   {
       System.out.println("狗吃骨头");
    }

    public void Guard()
   {
      System.out.println("狗看家!");
   }
}

public class Main {

    public static void upCasting(Animal animal)
    {
        animal.sleep();
        animal.eat();
    }
    public static void main(String[] args) {
        Animal dog = new Dog();
        upcasting(dog);
    }
}

由于upCasting(Animal animal)方法的参数是 Animal类型的,因此如果传入的参数是 Animal的子类,传入的参数就会被转换成父类Animal类型,这样你创建的Dog对象能使用的方法只是Animal中的签名方法;也就是说,在上溯的过程中,Dog的接口变窄了,它本身的一些方法(例如:guard方法)就不可见了。如果你想使用Dog中存在而Animal中不存在的方法(比如guard方法),编译时不能通过的。
作者: gaigai7    时间: 2014-4-8 16:25
zhangbingyuan 发表于 2014-4-8 15:12
举个例子来说:
public   abstract   class  Animal {
     public  abstract  void  eat(){}

恩   阅读了好几遍  明白了
作者: SyouRai_Tsk    时间: 2014-4-9 07:16
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。
实际上就是父类引用指向具体子类引用.但是使用的方法只能是父类中定义的共性方法,但是对以后体系的扩展很有帮助

作者: 2528870651    时间: 2014-4-9 21:14
嗯 各位都讲得很好啊
作者: 周建岐    时间: 2014-4-9 21:25
多态就是某一事物的多种存在形态,父类型引用指向了子类型对象。
例:父类  动物   
      子类  猫       猫 x =new 猫(); =====  动物  y=new 猫();
也就是父类的引用也可以接受自己的子类对象,那当需要定义什么方法,又是子类中都有的那种方法是,就i可以用父类对象定义,那样的话,只要是这个父类的子类就都可以使用,以后再添加子类的时候,也不用单独给它定义这个方法了,直接调用即可。不如这个例子
abstract class Dongwu//父类动物
{
        abstract void eat();
}

class mao extends Dongwu//子类 猫 继承父类动物
{
        public void eat()
        {
                System.out.println("吃鱼");
        }
        public void zhulaoshu()
        {
                System.out.println("抓老鼠");
        }
}
class gou extends Dongwu//子类狗继承父类动物
{
        public void eat()
        {
                System.out.println("吃骨头");
        }
        public void kanjia()  
        {
                System.out.println("看家");
        }
}

public class duotaifuxiDemo {
        public static void main(String[] args)
        {
                Dongwu c=new mao();//父类引用执行子类对象 类型提升 向上转型
                c.eat();//但只能访问父类中的成员
                mao d=(mao)c;//强制将父类父类的引用转换成子类类型 向下转换
                d.zhulaoshu();//访问子类成员
        fangfa(new mao());//可以直接调用吃的方法
                fangfa(new gou());
        }
    public static void fangfa(Dongwu44 a)//用父类建立吃的方法
        {
                a.eat();
        }


}  
instanceof : 用于判断对象的类型。 对象 intanceof 类型(类类型 接口类型)

       public static void fangfa(Dongwu44 a)
        {
                a.eat();
                if(a instanceof mao)//用 instanceof 判断类型 然后强制转换为子类型 就可以调用子类型中的特有成员了
                {
                        mao c=(mao)a;
                        c.zhulaoshu();
                       
                }
                if(a instanceof gou)
                {
                        gou d=(gou)a;
                        d.kanjia();
                }
               
        }




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