多态:指的是不同类创建的对象,在调用相同的方法时,呈现出多种不同的行为。
多态体现方式:在有继承关系的父子类中,子类继承父类的方法后,重写父类的方法,当子类创建对象后赋值给父类型的变量,父类型变量调用子类重写后的方法,呈现出多种不同的形态。
一个父类可以有多个子类,多个子类可以重写父类方法;创建的多个子类对象可以指向同一个父类,因此,在程序运行时才能知道具体代表的哪一个子类对象,这样就体现出了多态性。
简述来说:就是父类引用指向子类对象,调用子类方法,呈现出不同形态。
package PolymorphicPro;
abstract class Animal{
abstract void eat();
}
class Dog extends Animal{
public void eat() {
System.out.println("狗在狼吞虎咽地吃肉!");
}
}
class Cat extends Animal{
public void eat() {
System.out.println("猫在细嚼慢咽地吃鱼!");
}
}
public class TestDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal animalOne = new Dog();
Animal animalTwo = new Cat();
animalOne.eat();
animalTwo.eat();
}
}
执行结果:
多态使用场景:
场景一:使用父类作为方法形参实现多态,使方法参数的类型更为宽泛。
package PolymorphicPro;
abstract class Animal{
abstract void eat();
}
class Dog extends Animal{
public void eat() {
System.out.println("狗在狼吞虎咽地吃肉!");
}
}
class Cat extends Animal{
public void eat() {
System.out.println("猫在细嚼慢咽地吃鱼!");
}
}
public class TestDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal animalOne = new Dog();
Animal animalTwo = new Cat();
feed(animalOne);
feed(animalTwo);
}
public static void feed(Animal animal) {//父类作为方法形参实现多态
animal.eat();
}
}
执行结果:
场景二:使用父类作为方法返回值实现多态,使方法可以返回不同子类对象。
package PolymorphicPro;
abstract class Animal{
abstract void eat();
}
class Dog extends Animal{
public void eat() {
System.out.println("狗在狼吞虎咽地吃肉!");
}
}
class Cat extends Animal{
public void eat() {
System.out.println("猫在细嚼慢咽地吃鱼!");
}
}
public class TestDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
String fishName = "fish";
String boneName = "bone";
Animal animalThree = feed(boneName);
Animal animalFour = feed(fishName);
animalThree.eat();
animalFour.eat();
}
public static Animal feed(String feedName) {//父类作为方法返回值实现多态
Animal animal = null;
if("fish".equals(feedName))
animal = new Cat();
else if("bone".equals(feedName))
animal = new Dog();
return animal;
}
}
执行结果:
拓展:通过多态,降低了类之间的耦合关系,使得程序的扩展性和维护性提高。
耦合:模块与模块之间的关联程度,关联越密切,耦合越高;关联松散,耦合低。
Example:
class Sell{//售卖水果
public void sellGoods(Apple apple) {
apple.sell();
}
public void sellGoods(Orange orange) {
orange.sell();
}
public void sellGoods(Banana banana) {
banana.sell();
}
}
由于sellGoods方法与Apple类形参之间是一 一对应关系,当sellGoods方法里没有传Apple类对应的实参,那么apple.sell();将永远不会执行。同理Orange、Banana和方法sellGoods之间一 一对应,这种关系称为强耦合。如用父类作为方法形参,可以降低耦合度。因为父类可以接收所有子类对象。
如:Apple、Orange、Banana它们的父类是水果类。