什么叫多态:一个对象具备多种形态,也可以理解为事物存在的多种体现形态(父类的引用类型变量指向了子类对象,或者是接口的引用类型变量指向了接口实现类的对象)。
为什么需要多态:
(1)消除类型之间的耦合关系。
(2)可扩展,可替换性。
(3)接口性。
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
多态的实现方式:
方式一:重写
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。
实例:
public class Animal {//父类 public void eat() { System.out.println("动物可以吃东西"); } }
public class Dog extends Animal{//子类 public void eat() { System.out.println("狗吃骨头"); } public void sleep() {//子类中的特有成员方法 System.out.println("狗睡觉"); } }
public class demoTest { public static void main(String[] args) { Animal animal = new Animal();//Animal对象 Animal dog = new Dog();//Dog对象 animal.eat();//执行Animal类的方法 dog.eat();//执行Dog类的方法 // dog.sleep();//执行Dog类的特有方法,因为Dog类的引用类型Animal类中没有sleep()方法。 } }
方式二:接口
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法的抽象。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
实例:
public interface Animal {//Animal接口有eat()和sleep()两个抽象方法 public abstract void eat(); /* public abstract */ void sleep(); }
public class CatImpl implements Animal {//Cat类实例化接口Animal中的抽象方法 public void eat() { System.out.println("猫吃鱼"); } public void sleep() { System.out.println("猫睡觉"); } public void catchMouse() {//Cat类中的特有方法 System.out.println("猫抓老鼠"); } }
public class demoInterFace { public static void main(String[] args) { Animal cat = new CatImpl();//创建一只猫 cat.eat(); cat.sleep(); // cat.catchMouse();//错误无法调用右侧实现类专有的方法,只能调用接口公共的方法; } }