黑马程序员技术交流社区

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

作者: quicksand007    时间: 2016-8-28 11:17
标题: 关于多态形式参数的小问题
[AppleScript] 纯文本查看 复制代码
class Animal {
        public void eat(){
                System.out.println("eat");
        }
       
        public void sleep(){
                System.out.println("sleep");
        }
}

class Dog extends Animal {
        public void eat(){
                System.out.println("狗吃肉");
        }
       
        public void sleep(){
                System.out.println("狗站着睡觉");
        }
}

class Cat extends Animal {
        public void eat() {
                System.out.println("猫吃鱼");
        }
       
        public void sleep() {
                System.out.println("猫趴着睡觉");
        }
}

//针对动物操作的工具类
class AnimalTool {
        private AnimalTool(){}

        public static void useAnimal(Animal a) {
                a.eat();
                a.sleep();
        }       
}

class DuoTaiDemo {
        public static void main(String[] args) {
                Cat c = new Cat();
                c.eat();
                c.sleep();
               
                Cat c2 = new Cat();
                c2.eat();
                c2.sleep();
               
                Cat c3 = new Cat();
                c3.eat();
                c3.sleep();
                //...
                System.out.println("--------------");
               
                AnimalTool.useAnimal(c);
                AnimalTool.useAnimal(c2);
                AnimalTool.useAnimal(c3);
                System.out.println("--------------");
               
                Dog d = new Dog();
                Dog d2 = new Dog();
                Dog d3 = new Dog();
                AnimalTool.useAnimal(d);
                AnimalTool.useAnimal(d2);
                AnimalTool.useAnimal(d3);
                System.out.println("--------------");
               
        }       
}


看视频自学ing  老师讲到多态时说了这个猫狗案例 不过关于上面针对动物的操作工具不太懂 希望大神能解惑~~
35行 定义useAnimal参数是Animal a  ,从57行开始可以直接调用AnimalTool.useAnimal(c);  但是前面创建对象时Cat c = new Cat();
不应该是Animal c = new Cat();吗? 按上面定义了Cat变量  useAnimal方法可以直接调用Cat类变量??



作者: quicksand007    时间: 2016-8-28 11:25
有没有好心人可以讲解下
作者: 13402849575    时间: 2016-8-28 11:33
类名.方法名(对象名),就可以输出啦
作者: quicksand007    时间: 2016-8-28 11:35
13402849575 发表于 2016-8-28 11:33
类名.方法名(对象名),就可以输出啦

但是useAnimal要求的对象是Animal类的呀 可以直接拿Cat类的来用吗?
作者: 13402849575    时间: 2016-8-28 11:40
quicksand007 发表于 2016-8-28 11:35
但是useAnimal要求的对象是Animal类的呀 可以直接拿Cat类的来用吗?

AnimalTool.useAnimal()这个方法,接收的是Animal,而Cat和Dog都是Animal的子类,可以接收这个两种类型的实参

作者: 13402849575    时间: 2016-8-28 11:43
AnimalTool.useAnimal()这个方法,接收的是Animal,而Cat和Dog都是Animal的子类,可以接收这个两种类型的实参

作者: quicksand007    时间: 2016-8-28 11:49
13402849575 发表于 2016-8-28 11:43
AnimalTool.useAnimal()这个方法,接收的是Animal,而Cat和Dog都是Animal的子类,可以接收这个两种类型的实 ...

可以直接用子类对象啊……
那就是说不用非得写一句 Animal a = new Cat() 吗?
作者: 水月灬清影    时间: 2016-8-28 12:20
你没理解的是继承。
Cat和Dog是Animal的子类,将子类对象作为实参传递,运行子类重写后的方法。
作者: 细听风语为梧桐    时间: 2016-8-28 17:31
useanimal();方法里面传入一个animal 类的a 参数,猫和狗都是animal的子类,可以传入当做参数。
运行的时候调用的是猫 和 狗的eat和sleep 方法;
作者: quicksand007    时间: 2016-8-29 13:29
水月灬清影 发表于 2016-8-28 12:20
你没理解的是继承。
Cat和Dog是Animal的子类,将子类对象作为实参传递,运行子类重写后的方法。 ...

恩恩 谢谢你啦
感觉自学还是理解的不够
作者: quicksand007    时间: 2016-8-29 13:30
细听风语为梧桐 发表于 2016-8-28 17:31
useanimal();方法里面传入一个animal 类的a 参数,猫和狗都是animal的子类,可以传入当做参数。
运行的 ...

谢谢解答~
作者: life写实    时间: 2016-8-29 17:00
该方法需要的而参数是Animal a,你传递具体动物cat或dog等于多态,其实就是Animal a=new Dog();刘老师为什么要把该方法的形参变成Animal a?为什么不是俩个方法Use(Dog d)加Use(Cat c)?因为这样的话每增加一种动物就得修改工具类添加一个新的Use方法,而这是开发忌讳的,工具类一旦被做成,最好是永不修改,所以形参给一个Animal a 一劳永逸,既可以传new Dog()也可以传new Cat(),将来你想添加蛇宠也可以传递new snake(),只需要添加一个新类snake继承Animal重写eat和sleep方法即可,不需要修改工具类。你学到了吗
作者: a623562486    时间: 2016-8-29 21:24
这就是多态呀,父类引用指向子类对象呀,只要父类/子类中有相同方法,编译时看父类是否有,执行时执行子类的成员方法,就可以完成输出.其实我觉得,如果你继续往后看,看完抽象方法和接口,这个定义就更好理解了,拓展性嘛
作者: 小超超    时间: 2016-8-29 21:45
支持一下,顶一下。
作者: 天河边吃紫英    时间: 2016-8-29 21:45
可以的,看到你们讲的这么详细,我就当一个旁观者了 吧~~
作者: quicksand007    时间: 2016-8-29 22:00
life写实 发表于 2016-8-29 17:00
该方法需要的而参数是Animal a,你传递具体动物cat或dog等于多态,其实就是Animal a=new Dog();刘老师为什 ...

哇塞!真是太感谢了~有种醍醐灌顶的赶脚~~
作者: quicksand007    时间: 2016-8-29 22:01
a623562486 发表于 2016-8-29 21:24
这就是多态呀,父类引用指向子类对象呀,只要父类/子类中有相同方法,编译时看父类是否有,执行时执行子类的成 ...

恩恩 我还没有看完视频 赶脚路漫漫呀~~
作者: 梦想的小草    时间: 2016-8-29 22:48
可以呀,Cat是animal的子类,而useAnimal是animal的工具类,想要使用里面的方法就需要animal的对象,而Cat就是animal的一个对象,并且工具类里的方法是静态的方法,所有可以通过类名打点访问,因此直接在调用useAnimal方法的时候把Animal的对象Cat传过去就ok了。这样解释能明白吗?




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