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中多态性的实现 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对 ...
随机推荐
- DataGridView控件
DataGridView控件 DataGridView是用于Windows Froms 2.0的新网格控件.它可以取代先前版本中DataGrid控件,它易于使用并高度可定制,支持很多我们的用户需要的特 ...
- 四则运算2--设计思路--软件工程-c++
1.题目避免重复. 2.可定制(数量 打印方式). 3.可以控制下列参数:是否有乘除法.是否有括号.数值范围.加减有无负数.除法有无余数.是否支持分数(真分数,假分数...).是否支持小数(精确到多少 ...
- PHP图形图像处理之初识GD库
d=====( ̄▽ ̄*)b 引语 php不仅仅局限于html的输出,还可以创建和操作各种各样的图像文件,如GIF.PNG.JPEG.WBMP.XBM等. php还可以将图像流直接显示在浏览器中. 要处 ...
- 3527: [Zjoi2014]力 - BZOJ
题目大意:给出n个数qi,定义 Fj为 令 Ei=Fi/qi,求Ei. 看了很久题解,终于有些眉目,因为知道要用FFT,所以思路就很直了 其实我们就是要±1/(j-i)^2 ( j-i大 ...
- C语言函数指针基础
本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...
- CSS水平导航条和纵向导航条
问题描述: 使用CSS制作水平导航条和纵向导航条 问题解决: (1)水平导航条 1.1 效果预览: 1.2 ...
- zoj 2314 Reactor Cooling 网络流
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 The terrorist group leaded by a ...
- ios读取通讯录信息
ios读取通讯录信息 (2012-05-22 14:07:11) 标签: ios读取通讯录 it iphone如许app读取通讯录信息,读取通讯录信息时需要加载AddressBookUI 和Add ...
- javascript禁止复制网页内容,兼容三大浏览器
javascript禁止复制网页内容可以通过以下方式实现:禁止鼠标右键+禁止选中文本. 代码很简单,只需要在head标签的javascript内加入以下两行代码即可. document.onconte ...
- Gitlab仓库规范实践建议
记录一下Gitlab仓库实践信息: 仓库是指一个可以git clone的地址,用于存储某个服务,模块,子系统或某类辅助代码的地方 仓库的visibility level一般设置为Private(访问需 ...