Java基础第12讲:面向对象之多态

1、多态(动态绑定)

动态绑定是指在运期间,判断所引对象的实际类型,根据其实际的类型调相应的法,多态即:个对象具有多种状态的为。

1.1、多态的3个必要条件

要有继承
要有重写
父类的引用指向子类的对象

1.2、方法重写的案例回顾

动物类

public class Animal {

   public void speek(){
      System.out.println("动物都会叫");
   }

}

狗类,继承自动物类

class Dog extends Animal {  

   /**

    * 重写父类的speek方法

    */
   @Override
   public void speek() {
      System.out.println("我是狗,旺旺旺...");

   }

}

猫类,继承自动物类

class Cat extends Animal {

   /**

    * 重写父类的speek方法

    */
   @Override
   public void speek() {
      System.out.println("我是猫,喵喵喵...");
   }

}

1.3、完善案例实现多态性

public class Test {

   public static void main(String[] args) {
      Dog d = new Dog();
      Cat c = new Cat();
      Animal ani = null; 

      ani = d; //动物变成了狗
      ani.speek(); //我是狗,旺旺旺...
 
      ani = c; //动物变成了猫
      ani.speek(); //我是猫,喵喵喵...
   }
}

2、对象转型

2.1、向上转型

   父类的引用指向子类的对象,称为向上转型

2.1.1、回顾多态的案例

public class Test {

   public static void main(String[] args) {

      Dog d = new Dog();
      Cat c = new Cat();
      Animal ani = null;    

      ani = d; //动物变成了狗
      ani.speek(); //我是狗,旺旺旺...    

      ani = c; //动物变成了猫
      ani.speek(); //我是猫,喵喵喵...
   }
}

代码中将父类的引用指向了子类的对象,该写法是对象的向上转型;向上转型是自动的。

2.2、向下转型

2.2.1、回顾多态的案例,并修改main方法

public class Test2 {

   public static void main(String[] args) {
      Dog jinMao = new Dog();
      Animal ani = jinMao;     

      Dog erHa = (Dog) ani; //向下转型
   }
}

代码中将子类的引用指向了父类的对象,该写法是对象的向下转型;向下转型不是自动的,需要强制类型转换符进行转换。

3、经典案例——木兰从军

Java基础第12讲:面向对象之多态_第1张图片

3.1、需求分析

该案例中需要3个类,分别是父亲类Father.java,女儿类Daughter.java,还有一个测试类Test.java

Java基础第12讲:面向对象之多态_第2张图片Java基础第12讲:面向对象之多态_第3张图片

3.2、代码实现

Father.java

package test;

public class Father {

	public String name;
	public int age;
	
	public void fight(){
		System.out.println("我是花弧我要去打仗");
	}
}

Daughter.java

package test;

public class Daughter extends Father {

	@Override
	public void fight() {
		System.out.println("姓名:"+name);
		System.out.println("年龄:"+age);
		System.out.println("我是女儿,我替父从军");
	}
	
	public void dressup(){
		System.out.println("姓名:"+name);
		System.out.println("年龄:"+age);
		System.out.println("我是女儿,我要画一个美美的妆");
	}
}

Test.java

package test;

public class Test {

	public static void main(String[] args) {
		// 女扮男装,转型父亲的角色去征兵打仗
		Daughter mulan = new Daughter();
		mulan.name = "花木兰";
		mulan.age = 18;
		//花木兰替父从军(向上转型)
		Father huaHu = mulan; 
		mulan = null;
		huaHu.fight();; // 征兵打仗
		
		// 得胜回朝
		System.out.println("****得胜回朝*****");
		// 之前转型父亲角色的花木兰重新转型为女儿角色(强制向下转型)
		mulan = (Daughter) huaHu; 
		huaHu = null;
		mulan.dressup(); // 梳妆打扮
	}

}

你可能感兴趣的:(Java基础,Java)