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()); }
}

最新文章

  1. 在本地调试移动设备上的页面——神器weinre介绍
  2. JavaScript中严格模式"use strict";需注意的几个雷区:
  3. Hadoop HDFS编程 API入门系列之路径过滤上传多个文件到HDFS(二)
  4. 反射认识_04_反射调用类方法Method
  5. davlik虚拟机内存管理之一——内存分配
  6. 外部exe窗体嵌入winform
  7. asp.net实现 EXCEL数据导入到数据库功能
  8. C语言之三大查找算法
  9. solr6.5.0版本(Windows安装图解)
  10. Nashorn——在JDK 8中融合Java与JavaScript之力
  11. hibernate原生sql获取list<T>异常解决
  12. 学习 razor pages 指南
  13. JS的基础知识回顾
  14. 感觉不错的随笔 关于C、C++的
  15. 学习 Docker 操作系统版本选择
  16. sonarqube6.7安装
  17. java反射修改final变量
  18. github 最新项目快报
  19. Shell的>/dev/null、2>&1、2>1
  20. 铁乐学python_day29_模块与包学习4

热门文章

  1. nodejs笔记五--MongoDB基本环境配置及增删改查;
  2. 安装Netsharp演示插件
  3. 百分比布局实现响应式布局在 IE6 中填坑思路
  4. Servlet主要的作用
  5. 【数据结构】通用的最小堆(最大堆)D-ary Heap
  6. JS 学习笔记--5---对象和数组
  7. USACO 4.1.2 栅栏的木料
  8. GS初始化
  9. shader 里面的分支
  10. in_array函数的第三个参数 strict