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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小邱 中级黑马   /  2015-4-1 22:14  /  313 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


/*
        1.多态的体现:Animal a=new Cat();
                父类的引用a指向了子类的对象new Cat();
                父类的引用a可以接收子类的对象new Cat();
        2.多态的前提:类与类之间有继承或实现关系。通常还有另外一个:覆盖
        3.多态的好处:提高了程序的扩展功能。
        4.多态的弊端:只能父类的引用访问父类中的成员;若要访问子类成员需要将引用强转成子类的类型:如Cat c=(Cat) a;
               
*/
abstract class Animal
{
   abstract        void eat();
}
class Cat extends Animal
{
        void eat()
        {
                System.out.println("猫吃鱼");
        }
        void catchMouse()
        {
                System.out.println("猫抓老鼠");
        }
}
class Dog extends Animal
{
        void eat()
        {
                System.out.println("狗啃骨头");
        }
        void kanJia()
        {
                System.out.println("狗看家");
        }
}


class Test1 //Test1中function方法传进去的是对应的动物类型,如Cat Dog类型,每添加一种动物,都要重载一次对应类型的function方法,
                        //而Test2中function方法传进去的是Animal类型,只需一个function方法即可,这是多态的一个好处:提高代码复用性
{
        public static void main(String[] args)
        {
                //Cat c =new Cat();
                //function(c);
                //Dog d=new Dog();
                //function(d);
               
                //以上代码等同于以下代码
               
                function(new Cat());
                function(new Dog());
        }
        public static void function(Cat c )
        {
                c.eat();
                c.catchMouse();
        }
        public static void function(Dog d)
        {
                d.eat();
                d.kanJia();
        }
}
class Test2
{
        public static void main(String[] args)
        {
                //Animal c =new Cat();
                //function(c);
                //Animal d=new Dog();
                //function(d);
               
                //以上代码等同于以下代码
               
                function(new Cat());
                function(new Dog());
        }
        public static void function(Animal a)//父类的引用a可以接收子类的对象new Cat()或new Dog()
        {
                a.eat();
                if(a instanceof Cat)//instanceof关键字用于判断传进来的引用是指向哪个对象
                {
                        Cat c=(Cat) a;//因为父类引用只能访问父类成员(重写后的子类成员),所以要将Animal类型的a转换成Cat类型
                        c.catchMouse();//调用Cat类的特有方法catchMouse();
                }
                if(a instanceof Dog)
                {
                        Dog d=(Dog) a;//因为父类引用只能访问父类成员(重写后的子类成员),所以要将Animal类型的a转换成Dog类型
                        d.kanJia();//调用Dog类的特有方法kanJia();
                }
        }
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马