1.什么是多态
java多态指的是用基类的引用指向子类的对象。也就是编译时和运行时指向的对象不一样,编译时指向父类,运行时指向子类。
这里的多态一般是指方法的多态,对象的实例变量不具备多态性。
package test; class Fathers{ public String name = "父类"; //定义一个父类的run方法,因为是public的,会被子类的同名run方法覆盖 public void run() { System.out.println("父类的run方法"); } } class Sons extends Fathers{ public String name = "子类"; //覆盖父类的run方法 @Override public void run() { System.out.println("子类的run方法"); } } public class PolDemo01 { public static void main(String[] args) { //编译时,f是Fathers类型的; //运行时,f是Sons类型的 //这里是Sons向上转型为Fathers,由程序自动完成 Fathers f = new Sons(); f.run();//这里将调用子类的run方法——方法多态 System.out.println(f.name);//这里输出的是父类的name——实例变量不能多态 } } //输出: 子类的run方法 父类
2.多态用在哪里
一般用在方法的参数和方法返回类型中。
package test; interface USB { public void start(); public void run(); public void stop(); } // USB接口工作依赖于具体的电脑 class Computer { // USB接口作为参数,动态指定具体的USB实现类,实现多态 public void work(USB u) { u.start(); u.run(); u.stop(); } } // U盘,实现USB接口 class UDisk implements USB { @Override public void start() { System.out.println("U盘开始工作"); } @Override public void run() { System.out.println("U盘工作中"); } @Override public void stop() { System.out.println("U盘停止工作"); } } // 打印机,实现USB接口 class Printer implements USB { @Override public void start() { System.out.println("打印机开始工作"); } @Override public void run() { System.out.println("打印机工作中"); } @Override public void stop() { System.out.println("打印机停止工作"); } } public class PolDemo02 { public static USB createInstance(String name) { if ("Printer".equals(name)) { return new Printer(); } else if ("UDisk".equals(name)) { return new UDisk(); } else { return null; } } public static void main(String[] args) { // 1.用在方法参数的例子 // new一个电脑实例,电脑工作,传入USB接口的具体实现 Computer c = new Computer(); c.work(new UDisk()); c.work(new Printer()); System.out.println("===================华丽分割线====================="); // 2.用在方法返回类型的例子 // 这里用到的是向下转型,右边本是USB类型的,需要向下转为其实现类,也就是Printer类型 Printer u = (Printer) createInstance("Printer"); u.start(); } } //输出: U盘开始工作 U盘工作中 U盘停止工作 打印机开始工作 打印机工作中 打印机停止工作 ===================华丽分割线===================== 打印机开始工作
3.多态的实现条件
Java实现多态有三个必要条件:继承、重写、向上转型。
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。