Java:多态性
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()); }
}
Java:多态性的更多相关文章
- Java多态性举例说明
Java多态性的概念也可以被说成“一个接口,多个方法”. (一)相关类 class A ...{ public String show(D obj)...{ return ("A and D ...
- java多态性方法的重写Overriding和重载Overloading详解
java多态性方法的重写Overriding和重载Overloading详解 方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是父类与子类 ...
- Java多态性的“飘渺之旅”
原文出处:斯武丶风晴 摘要: 如何从Java多态性进行飘渺之旅呢? 我们用例子来旅行. 朵星人A:人类,是一个很奇妙的物种. 朵星人B:他们好像分为两种,嗯 先生,以及美女? 朵星人C:对,更年轻的有 ...
- [转载]深入理解java多态性
FROM:http://blog.csdn.net/thinkGhoster/article/details/2307001 昨天看到一个关于多态性的帖子,参考了回帖者的理解,加入了一些自己的看法,整 ...
- Java多态性详解 (父类引用子类对象)
面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作准备.那么什么是多 ...
- Java多态性详解——父类引用子类对象
来源:http://blog.csdn.net/hikvision_java_gyh/article/details/8957456 面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实 ...
- Java多态性——分派
一.基本概念 Java是一门面向对象的程序设计语言,因为Java具备面向对象的三个基本特征:封装.继承和多态.这三个特征并不是各自独立的,从一定角度上看,封装和继承几乎都是为多态而准备的.多态性主要体 ...
- java多态性,父类引用指向子类对象
父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new C ...
- java多态性
多态分两种: (1) 编译时多态(设计时多态):方法重载. (2) 运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态.(我们平时说得多的事运行时 ...
- Java多态性理解
Java中多态性的实现 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对 ...
随机推荐
- 【每日scrum】NO.6
Yesterday:组内各种乱八七糟的问题,还有自己的效率问题 Today:进行小范围的测试实验 Problem:在显示各景点构成的邻接矩阵的时候,第一次编译未出现任何错误的提示,但是在程序运行时,无 ...
- 着色Test
1 2 3 4 5 6 7 8 9 10 def test: print "just a test" print "just a test" ...
- JavaEDU614 团队第三周项目总结
JavaEDU614 团队第三周项目总结 本周,根据项目计划完成模块的设计代码 本项目主要是完成俄罗斯方块的基本操作.用户可以自己练习和娱乐.需要满足以下几点要求. (1)界面控制游戏开始.暂停和结束 ...
- javascript 对象数组排序
参考地址:http://blog.csdn.net/kavensu/article/details/17851329
- android开发实现静默安装(root权限)
方式是将应用设置为内置的系统应用,注意事system/app目录下面,采用copy2SystemApp()方法就可以,注意chmod 777的权限,若是直接将apk拷贝到system/app目录,没有 ...
- android开发 解决启动页空白或黑屏问题
遇到的情况: app启动时进入启动页时出现白屏页,然后大概一秒之后就出现了背景图片. 原因:app启动时加载的是windows背景,之后再加载布局文件的,所以开始的黑屏/白屏就是windows的背景颜 ...
- 数码管字符产生器GenSym 1.0发布
本软件可以实现以下功能: 1.支持共阴极和共阳极数码管的字符代码的生成. 2.支持C语言和ASM语言方式产生字符串代码的序列. 3.可定制数码管的最高位和最低位的代码产生次序. 4.支持记忆功能,可以 ...
- 3527: [Zjoi2014]力 - BZOJ
题目大意:给出n个数qi,定义 Fj为 令 Ei=Fi/qi,求Ei. 看了很久题解,终于有些眉目,因为知道要用FFT,所以思路就很直了 其实我们就是要±1/(j-i)^2 ( j-i大 ...
- NYOJ-214 单调递增子序列(二) TLE 分类: NYOJ 2014-01-28 22:57 171人阅读 评论(0) 收藏
#include<stdio.h> #include<stdlib.h> #define max(x,y) x>y?x:y #define MAXX 100005 int ...
- Solr Schema.xml和solrconfig.xml分析(转)
Solr Schema.xml和solrconfig.xml分析 (http://yinwufeng.iteye.com/blog/964040) 一.字段配置(schema) schema.xml位 ...