Java的多态性:发送消息给某个对象,让该对象自行决定响应何种行为。 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。
java的多态性要满足三个条件:
1、继承关系
2、在子类重写父类的方法
3、父类引用指向子类的对象,即animal p = new dog()
在多态中非静态成员函数的特点:
在编译时期:参阅引用形变量所属的类中是否有要调用的方法。如果有,编译通过;否则,编译不通过
在运行时期:参阅对象所属的类中是否有要调用的方法。如果有,运行成功;否则,运行失败。
总结:编译时期看做左边,运行时期看右边。
在多太中成员变量和静态成员函数的特点:
无论编译和运行都参考左边(引用类型变量所属的类)
例子1:创建父类动物类Animal、子类猫类Cat、子类狗类Dog
//创建父类animal动物类 abstract class Animal { public abstract void eat(); } //创建动物类子类:猫类 class Cat extends Animal { public void eat() { System.out.println("吃鱼"); } } //创建动物类子类:狗类 class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } } //多态的表现形式 class DuoTaiDemo { public static void main(String[] args) { Animal a = new Cat(); //父类的引用指向子类对象 a.eat(); //父类中有eat()方法,编译通过,子类中也有eat()方法,所以最终编译成功 function(new Cat()); function(new Dog()); } //将动物类的引用当做参数传递给方法 public static void function(Animal a) { //判断如果是Dog if(a instanceof Dog ) { a.eat(); //调用父类的eat()方法 Dog b = (Dog) a; //调用Dog的eat()方法 b.eat(); } //如果是Cat else if(a instanceof Cat) { a.eat();//调用父类的eat()方法 Cat b = (Cat) a;//调用Cat的eat()方法 b.eat(); } } }
例子2:多态的功能扩展
基于电脑的实例(电脑主板)
扩展(网卡、声卡、、、)
interface PCI //扩展功能的接口(规则) { public abstract void open(); public abstract void close(); } class MainBoard //主板类 { public void run() { System.out.println("Mi anBoard run"); } public void usePCI(PCI p) //PCI p = new NetCard() //接口型的引用指向自己的子类对象 { p.open(); p.close(); } } class NetCard implements PCI // 实现网卡的连接 { public void open() { System.out.println("NetCard open"); } public void close() { System.out.println("NetCard close"); } } class SoundCard implements PCI // 实现声卡的连接 { public void open() { System.out.println("soundcard open"); } public void close() { System.out.println("soundcard close"); } } //主函数测试 class DuoTaiDemo1 { public static void main(String[] args) { MainBoard mb = new MainBoard(); mb.run(); mb.usePCI(new NetCard()); mb.usePCI(new SoundCard()); } }
例子3:多态的扩展实例:连接数据库(用户可以create、add、update、delete)
interface UserInfoDao //D:data a:access o:object { public abstract void add(); public abstract void deletde(); } class UserInfoByJDBC implements UserInfoDao //手写连接数据库 { public void add() { 1、JDBC连接数据库 2、使用sql添加语句添加数据 3、关闭数据库连接 } public void delete() { 1、JDBC连接数据库 2、使用sql删除语句删除数据 3、关闭数据库连接 } } class UserInfoByHibernate implements UserInfoDao //框架连接数据库 { public void add() { 1、Hibernate连接数据库 2、使用sql添加语句添加数据 3、关闭数据库连接 } public void delete() { 1、Hibernate连接数据库 2、使用sql删除语句删除数据 3、关闭数据库连接 } } class DBoperate { public static void main(String[] args) { /* UserInfoDao ui = new UserInfoByJDBC(); //多态引用类型指向子类对象 ui.add(); ui.delete(); UserInfoDao ui = new UserInfoByHibernate(); //多态引用类型指向子类对象 ui.add(); ui.delete(); */ ui.add(new UserInfoByJDBC()); ui.delete(new UserInfoByJDBC()); ui.add(new UserInfoByHibernate()); ui.delete(new UserInfoByHibernate()); } }