从上图看,动物包含猫,狗和猪。反过来说,猫,狗和猪都也是动物。这就是一种对象的不同体现也就是对象的多态性。
多态性的作用:提高代码的课扩展性。
下面通过一个需求来理解一下对象的多态性:让学生来喂猫,狗。
不利用对象的多态性来实现,代码:
package itheiomatest;
public class Main {
public static void main(String[] args) {
Student s=new Student("张硕");
Cat c=new Cat("猫");
Dog d=new Dog("狗");
s.FeedCat(c);
s.FeedDog(d);
}
}
//父类 动物
abstract class Animal{
public String name;
public Animal(String name){
this.name=name;
}
public abstract void Eat();
}
//子类 狗
class Dog extends Animal{
public Dog(String name) {
super(name);
}
@Override
public void Eat() {
System.out.println("吃骨头");
}
}
//子类 猫
class Cat extends Animal{
public Cat(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void Eat() {
System.out.println("吃鱼");
}
}
//学生类
class Student{
public String name;
public Student(String name){
this.name=name;
}
public void FeedCat(Cat a){
System.out.println("我是学生"+name+"我在喂"+a.name);
a.Eat();
}
public void FeedDog(Dog a){
System.out.println("我是学生"+name+"我在喂"+a.name);
a.Eat();
}
}
分析上面的代码可以看出,在学生类里面有两个方法,一个喂猫的方法,一个喂狗的方法。
如果这个时候再让我们喂一下猪,我们得在学生类里面再写一个FeedPig()的方法。这样如果再增加喂别的动物的方法呢?会不会出现许多重复的喂小动物的方法?这就会提高代码的冗余程度。该怎么办呢?
分析一下:因为 猫狗和猪都属于动物,所以我们可以 (动物 猫=new 猫()); 也就是可以用父类创建子类对象。所以代码可以这样写:
package itheiomatest;
public class Main {
public static void main(String[] args) {
Student s=new Student("张硕");
s.FeedAnimal(new Dog("狗"));
s.FeedAnimal(new Cat("猫"));
}
}
//抽象父类 狗
abstract class Animal{
public String name;
public Animal(String name){
this.name=name;
}
//因为每种动物都有吃的动作,但是吃的东西却不一样,所以我们把它写为抽象方法。
public abstract void Eat();
}
//子类狗
class Dog extends Animal{
public Dog(String name) {
super(name);
}
@Override
public void Eat() {
System.out.println("吃骨头");
}
}
//子类猫
class Cat extends Animal{
public Cat(String name) {
super(name);
}
@Override
public void Eat() {
System.out.println("吃鱼");
}
}
class Student{
public String name;
public Student(String name){
this.name=name;
}
//在这里我们只需要写一个喂动物的方法,然后把动物的对象传进去。
public void FeedAnimal(Animal a){
System.out.println("我是学生"+name+"我在喂"+a.name);
a.Eat();
}
}
总结多态性的三个特征:有继承,又重写,父类引用指向子类对象。 |
|