多态:它允许不同类型的对象对同一方法进行不同的实现,
具体来说,多态性指的是
:通过父类的引用变量,来引用子类的对象,从而实现对不同对象的统一操作。
多态,只适用于方法,不适用于属性
多态实现的条件:
1、继承关系
,存在继承关系的类之间才能使用多态性,多态性通常通过一个父类用变量引用子类对象来实现
2、方法重写,子类必须重写(Override)父类的方法,
通过在子类中重新定义和实现父类的方法,可以根据子类的特点行为改变这个方法的行为,如猫和狗吃东西的独特行为。
3、父类引用指向子类对象,使用父类的引用变量来引用子类对象,
这样可以实现,对不同类型的对象的统一操作,而具体调用哪个子类的方法会在运行时多态决定
举个例子:根据,猫 和 狗,叫的动作的不同,而实现的多态,
class Animal { // 父类Animalpublic void sound() {System.out.println("动物发出声音");}
}class Dog extends Animal { // Dog 继承 父类Animal@Overridepublic void sound() {System.out.println("狗发出汪汪声");}
}class Cat extends Animal { // Cat 继承 父类Animal@Overridepublic void sound() {System.out.println("猫发出喵喵声");}
}public class Main {public static void main(String[] args) {Animal animal1 = new Dog(); // 父类引用指向子类对象Animal animal2 = new Cat(); // 父类引用指向子类对象# 下面这两个方法调用,就是,多态性的应用:虚拟方法调用,解释如下:/* 在多态的场景下,调用方法时,编译时,认为方法是左边声明的父类的类型的方法(即被重写的方法)执行时,实际执行的是,子类中重写父类的那个方法简称:编译看左边,运行看右边*/animal1.sound(); // 输出:狗发出汪汪声animal2.sound(); // 输出:猫发出喵喵声}
}
对上述代码的解释
:
在这个例子中,
Animal类是父类,Dog、Cat类是它的子类,
通过将父类的引用变量分别指向子类对象,实现了多态性,
在运行时,根据引用变量的实际类型来调用相应的子类方法,从而输出不同的声音。
多态的弊端:在多态的场景下,我们创建了子类对象,也加载了子类特有的属性和方法,
但是由于声明为父类的引用,
导致我们没有办法直接调用子类特有的属性和方法
例子
public class AnimalTest {public static void mian(String[] args) {AnimalTest test = new AnimalTest()test.adopt(new Dog);// 如果没有多态的话,像下面这一句代码,我们想弄一个Fish的,// 因为我们这里只有一个 public void adopt(Animal animal){...代码},// 那么,就只能再多声明一个 public void adopt(Fish fish) { ...代码 } 的// 那如果,想再要一个monkey的呢,// 那就得再多声明一个 public void adopt(Monkey monkey) { ...代码 } 的// 多麻烦啊test.adopt(new Fish);}public void adopt(Animal animal){/* 这里声明的是Animal animal,但是,实际上new的是 new Dog因为,上面是 test.adopt(new Dog);而,这里的声明的是Animal animal,所以,实际上是:Animal animal = new Dog*/animal.eat()animal.dump()// 这个里面,你只能调用 Animal类中声明过,且,被子类重写的方法// animal.watchDoor() 和 animal.catchMouse() 在这里是调用不到的}
}class Animal {public void eat()){System.out.println("动物进食")}public void dump()){System.out.println("动物跳")}
}class Dog {public void eat()){System.out.println("狗啃骨头")}public void dump()){System.out.println("狗急跳墙")}public void watchDoor()){ // 这个是 Dog 特有的方法System.out.println("狗看门")}
}class Cat {public void eat()){System.out.println("猫吃鱼")}public void dump()){System.out.println("猫跳")}public void catchMouse()){ // 这个是 Cat 特有的方法System.out.println("猫抓老鼠")}
}