概述:同一个事物,在不同的时刻表现出不同的状态。
代码中如何体现:
要有继承, 要有方法重写, 父类引用指向子类对象
多态的成员访问特点
成员变量:编译看左边(父类), 运行看左边
成员方法:编译看左边,运行看右边(子类)对象(注意:这就是多态的精华)---父类引用指向子类对象,在执行的过程中执行子类重写的方法
构造方法:子类不能继承构造方法,默认访问父类空参构造
静态方法:编译看左边,运行看左边
package cn.czbk.no5; import java.util.Scanner; public class PolyTest { public void polyUse(DBConn dbtype){ dbtype.conn(); /** * 向上类型转换后父类引用就不能使用子类特有的功能 * 通过向下类型转换(强制类型转换)可以解决这个问题 */ OracleConn oracle =(OracleConn)dbtype; oracle.oraclePrint(); } public static void main(String[] args) { DBConn dbtype = null; PolyTest pt=new PolyTest(); //在用户输入之前你并不知道要调用哪一个数据库连接 //在程序执行之后用户输入完毕之后才能确认 Scanner sc =new Scanner(System.in); String dbName=sc.nextLine(); switch (dbName) { case "Oracle": dbtype=new OracleConn(); break; case "DB2": dbtype=new DB2Conn(); break; case "Mysql": dbtype=new MysqlConn(); break; default: System.out.println("end"); break; } //多态的使用可以减少代码的编写,直接下面一句话就可以了 //提高代码的扩展性,要加其他类型的数据库的话直接在下面加就可以了上面的并不需要改 pt.polyUse(dbtype); } } class DBConn{ public void conn(){ System.out.println("连接数据库"); } } class OracleConn extends DBConn{ public void conn(){ System.out.println("连接Oracle数据库"); } public void oraclePrint(){ System.out.println("%like%"); } } class DB2Conn extends DBConn{ public void conn(){ System.out.println("连接DB2数据库"); } } class MysqlConn extends DBConn{ public void conn(){ System.out.println("连接Mysql数据库"); } }
多态的好处: 提高代码的扩展性;
如何使用多态?
1.写一个父类
2. 写一个或多个子类, 重写父类的方法
3.写一个使用类,在使用类中写一个方法,方法的参数类型定义为父类类型.
4.调用使用类的方法,传入不同的子类对象
多态的弊端: 不能调用子类特有功能.
如何解决: 向下转型(强制转换):
向上转型和向下转型 向上转型:
1. Animal a = new Cat();
2. Cat c = new Cat(); Animal a2 = c; 向下转型(强制转换): Cat c2 = (Cat)a;
注意:java.lang.ClassCastException,异常经常在向下转型中出现,不能指鹿为马.