1.什么是多态性?
个人对多态性的理解:多态性依赖于继承性,在定义了父类及其子类后
例如父类Animal(其中有eat()和shout()方法)
子类Dog,Cat(重写了eat()和shout()方法)
那么我就可以用子类的实例实现对父类的赋值
即:Animal animal = new Dog();
Animal animal = new Cat();
2.多态性的特点
在1中,我们把Dog Cat实例赋给了animal
那么我们能调用的animal的函数必须是父类Animal拥有的,但是实际功能是由Dog和Cat重写的
即:编译是否通过看父类,具体功能实现看子类
3.多态性的好处
以具体代码解析
要求:定义父类动物类,实现eat和shout方法,定义子类猫类和狗类,实现对eat和shout的重写,并输出结果
3.1有多态性
package MultiTest; public class Test { public static void main(String[] args) { Test t = new Test(); t.show(new Animal());//输出动物的叫声 参数相当于:Animal animal = new Animal(); t.show(new Dog());//输出狗的叫声 参数相当于:Animal animal = new Dog(); t.show(new Cat());//输出猫的叫声 参数相当于:Animal animal = new Cat(); } public void show(Animal animal) {//定义了Animal animal.eat(); animal.shout(); } } class Animal{ public void eat() { System.out.println("动物:吃东西"); } public void shout() { System.out.println("动物:发出叫声"); } } class Cat extends Animal{ public void eat() { System.out.println("猫:吃鱼"); } public void shout() { System.out.println("猫:喵喵喵"); } } class Dog extends Animal{ public void eat() { System.out.println("狗:吃骨头"); } public void shout() { System.out.println("狗:汪汪汪"); } }
在有多态性的情况下,仅仅需要一个函数就实现了输出动物,猫,狗的eat和shout方法,只需要填入不同的子类实例即可
3.2没有多态性
package MultiTest; public class Test { public static void main(String[] args) { Test t = new Test(); t.showAnimal(new Animal());//输出动物的叫声 参数相当于:Animal animal = new Animal(); t.showDog(new Dog());//输出狗的叫声 参数相当于:Dog dog = new Dog(); t.showCat(new Cat());//输出猫的叫声 参数相当于:Cat cat = new Cat(); //对不同的类就要写不同的方法 //造成了大量的冗余 } public void showAnimal(Animal animal) {//只对Animal类有效 animal.eat(); animal.shout(); } public void showCat(Cat cat) {//只对Cat类有效 cat.eat(); cat.shout(); } public void showDog(Dog dog) {//只对Dog类有效 dog.eat(); dog.shout(); } } class Animal{ public void eat() { System.out.println("动物:吃东西"); } public void shout() { System.out.println("动物:发出叫声"); } } class Cat extends Animal{ public void eat() { System.out.println("猫:吃鱼"); } public void shout() { System.out.println("猫:喵喵喵"); } } class Dog extends Animal{ public void eat() { System.out.println("狗:吃骨头"); } public void shout() { System.out.println("狗:汪汪汪"); } }
后果:哪怕在子父类中定义了同样的办法,面对不同参数,最后就要有多少个方法,造成了大量的冗余和重复性工作
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)