我们都知道,面向对象有三大特征:封装,继承,多态;
多态:就是指相同的事物的不同状态,比如:水。水可以有三种状态。那么在JAVA中的多态也可以理解成这个意思,就是:
将父对象设置成为和一个或多个它的子对象相等的技术,
比如Animal = Dog;
当满足这三个条件 1.有继承 2. 有重写 3. 要有父类引用指向子类对象,就有多态的影子;
多态性使得能够利用同一类(父类)引用不同类的对象,
以及根据所引用对象的不同,以不同的方式执行相同的操作。
多态实现包括两种方式:重载和重写
例如:Animal a = new Dog();
父类引用指向子类对象,Animal类中包含一个eat()方法,而 Dog类继承自
Animal类,如果子类重写了父类的eat()方法,则调用的时候,就可以按照子类
的形式调用,本质上是父类的方法,但是子类重写之后,就成了另一种方式,
这就是多态。
转型:
* 向上转型,父类的引用指向子类的对象
通俗的说就是将子类对象转换为父类对象,此处的父类对象可以是接口
* 向下转型,把指向子类对象的父类引用赋值给子类的引用(要强制转换)
*
举个例子:

`package com.tr; 
 class Animal{ 
 //描述动物,动物有吃饭,跑的行为 
 public void eat(){ 
 System.out.println(“父类吃的方法!!”); 
 } 
 public void run(){ 
 System.out.println(“父类跑的方法!!”); 
 }} 
 class Dog extends Animal{ 
 //描述狗,同样的有吃饭,看家,睡觉的属性 
 public void eat(){ 
 System.out.println(“子类dog吃的方法!!!”); 
 } 
 public void housekeeping(){ 
 System.out.println(“子类dog看家的方法”); 
 } 
 public void sleep(){ 
 System.out.println(“子类dog睡觉的方法”); 
 }}
class Ma extends Animal{ 
 //描述狗,有吃饭喝水的行为 
 public void chi(){ 
 System.out.println(“Ma吃的方法”); 
 } 
 public void he(){ 
 System.out.println(“Ma喝的方法”); 
 } 
 } 
 public class DuotaiDemo {
public static void main(String[] args) {

    //父类的引用指向子类的对象,而不能是子类的而子类的引用不能指向父类的对象
    //能说dog是动物,而不能说动物就是dog
    /**
     * 向上转型,父类的引用指向子类的对象
     * 通俗的说就是将子类对象转换为父类对象,此处的父类对象可以是接口
     */
    Animal a = new Dog();
    //a.eat();; //注意,向上转型之后子类a会遗失除与父类共有的其他方法,比如在这 a调不到housekeeping方法和sleep方法
    /**
     * 向下转型,把指向子类对象的父类引用赋值给子类的引用(要强制转换)
     * 首先要向上转型,然后在向下转型,两个步骤
     * 向下转型之后d能调到父类和子类的所有公有方法
     * Girl g2=new Girl();
     * MMGirl mmg1=(MMGirl)g2; //不安全的向下转型,编译无错但会运行会出错
     * 运行出错:
     * Exception in thread "main" java.lang.ClassCastException: com.wensefu.other1.Girl 
     * at com.wensefu.other1.Main.main(Girl.java:36)
     * 如代码所示,可以通过instanceof来防止出现异常
     */
     Dog d =(Dog)a;
        d.run();
        d.eat();
        d.housekeeping();
        d.sleep();

}
/**
 * 有多个狗和马对象都要调用吃饭这个方法,这样会使
 * d.eat()代码重复性非常严重
 * Dog d = new Dog()
 * d.eat()
 * d.housekeeping();
    d.sleep();
 * 为了提高代码的复用性,可以将d.eat()封装起来
}
然后创建对象,直接调用fun()方法即可


public static void fun2(Dog d){
    d.eat();
    d.housekeeping();
    d.sleep();
}
fun2(new Dog());   //static方法在同一个类中可以直接方法名调,不同类中要  类名.方法名  调用,要 public 修饰的

public static void fun3(Ma m){
    m.eat();
    m.chi();
    m.he();
}
 * public static void fun1(Animal h){
    h.eat();
 */

}`