多态性,是面向对象中最重要的概念,在Java中的体现:
对象的多态性:父类的引用指向子类的对象
》可以直接应用在抽象类和接口上

Java引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。简称:编译时,看左边:运行时,看右边。

》若编译时类型和运行时类型不一致,就出现了对象的多态性(Polymorphism)
》多态情况下,“看左边”:看的是父类的引用(父类中不具备子类特有的方法)
“看右边”:看的是子类的对象(实际运行的是子类重写父类的方法)

package mk.bigdata.java4;

public class Person {
    String name;
    int age;

    public void  eat(){
        System.out.println("人:吃饭");
    }

    public void walk(){
        System.out.println("人:走路");
    }


}
package mk.bigdata.java4;

public class Man  extends Person{
    boolean isSmoking;

    public  void earnMoney(){
        System.out.println("男人负责挣钱养家");
    }

    @Override
    public void eat(){
        System.out.println("男人多吃肉,长肌肉");
    }


    @Override
    public void walk(){
        System.out.println("男人霸气的走路");
    }


}
package mk.bigdata.java4;

public class Woman extends Person{
    boolean isBeauty;


    public void goShopping(){
        System.out.println("女人喜欢购物");
    }

    @Override
    public void  eat(){
        System.out.println("女人少吃,为了减肥");
    }

    @Override
    public void walk(){
        System.out.println("女人窈窕的走路");
    }
}
package mk.bigdata.java4;
/*
* 面向对象特征之三:多态性
*
*
*1. 理解多态性:可以理解为一个事物的多种形态。
*2. 何为多态性:
*       对象的多态性:父类的引用指向子类的对象
*
*3. 多态的使用:虚拟方法调用
*   有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是
*   子类重写父类的方法。
*   总结:编译,看左边;运行,看右边。
*
*
*4.多态性的使用前提:① 类的继承关系    ②  要有方法的重写
*
* */
public class PersonTest {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.eat();

        Man man = new Man();
        man.eat();
        man.age = 25;
        man.earnMoney();

        //*****************************************

        //对象的多态性:父类的引用指向子类的对象
        Person p2 =  new Man();
        System.out.println("***************************");

        //多态的使用:当调用子父类 同名同参数的方法时,实际执行的是子类重写父类的方法--虚拟方法调用
        p2.eat();
        p2.walk();

 //      p2.earnMoney();

//        Person p3 = new Woman();


    }

}

//***********************************************************
测试

package mk.bigdata.java4;

import java.sql.Connection;

/*
* 多态性的使用举例一:
*
*
* */
public class AnimalTest {
    public static void main(String[] args) {
        AnimalTest test = new AnimalTest();
        test.func(new Dog());

        test.func(new Cat());
    }



    public void func(Animal animal){// Animal  animal = new Dog();
        animal.eat();
        animal.shout();
    }

//        public void func(Dog dog){
//            dog.eat();
//            dog.shout();
//        }
//
//
//        public void func(Cat cat){
//             cat.eat();
//             cat.shout();
//        }


}



class 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("汪汪汪");

    }
}

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

    public void shout(){
        System.out.println("喵!喵喵");
    }
}


//举例二:
class Order{

    public void method(Object obj){

    }

}

//举例三:
class Driver{
    public void doData(Connection conn){//conn = new MySQLConnection() //con  = new Oracle()
        //规范的步骤去操作数据

        conn.method1();
        conn.method2();
        conn.method3();
    }

}