JAVA的三大特征之一--------------多态

一:多态的定义:

一个对象有多种形态  就称为多态

 

JAVA的三大特征之一--------------多态

package 面向对象.多态.A;

class Animal {
     void eat()
     {
         System.out.println("动物吃东西!");
     }
}

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

class Cat extends Animal{
    void eat()
    {
        System.out.print("猫吃鱼!");
    }
}

public class Test {
     public static void main(String[] args) {
         //狗是动物类
         //一个对象有多种形态  就称为多态
         //一个表示自己的类,一个表示自己父类的类型
         //子类对象赋值给父类类型
         //运行时,表现得是子类的特征(先去找子类)
         //Animal dog = new Dog();
         Dog dog = new Dog();
         dog.eat();
         //Animal cat = new Cat();
         Cat cat= new Cat();
         cat.eat();
        System.out.println(cat.getClass()); 
        
        /***
         * 子类对象赋值给父类类型
         * 运行时,表现的是子类的特征(先去找子类)
         */
    }
}

 

 

二、多态的好处

class Person{
    
    /***
     * 如果动物的种类很多,要写很多动物的eat方法;如果直接定义动物类,减少代码的复用。
     * @param dog
     */
    void feedDog(Dog dog) {
        dog.eat();
    }  
    void feedCat(Cat cat) {
        cat.eat();
    }
    void feedAnimal(Animal anim)
    {
        anim.eat();
    }
}

public class Test {
     public static void main(String[] args) {
        Dog dog = new Dog();       
        Cat cat = new Cat();
        Person per = new Person();
//        per.feedDog(dog);
//        per.feedCat(cat);
        per.feedAnimal(dog);
        per.feedAnimal(cat);               
    }
}

JAVA的三大特征之一--------------多态

JAVA的三大特征之一--------------多态

void feedAnimal(Animal anim)
    {
        anim.eat();
        //类的强制类型转换,把父类对象赋值给子类类型
        // instanceof : 判断一个类是否是指定的类,如果是,返回true;不是,就返回 false
        if(anim instanceof Dog) {    
        Dog dog = (Dog)anim;
        dog.doWork();
        }else if(anim instanceof Cat)
        {
           Cat cat = (Cat)anim;
           cat.doWork();
        }    
    }

三、注意: 字段不存在多态
public class Test2 {
    
    public static void main(String[] args) {    
        //本类对象实例化
    //    subclass sub = new subclass();
        // 把子类对象赋值给父类类型
        SuperClass sub = new subclass();
        sub.mych();
        //字段不存在多态,注意调用的还是父类的成员变量。在编译的时候就已经确定要调用谁
        System.out.println(sub.name);
    }