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中多态性的实现 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对 ...
随机推荐
- Teamwork-Week3 职责划分及团队分数分配原则
本组人数:5. 一.人员职责划分 PM:1 柴泽华 PM的职责: 1)根据项目范围.质量.时间与成本的综合因素的考虑,进行项目的总体规划与阶段计划. 2)设置项目组中的各种角色, ...
- Bootstrap入门二:响应式页面布局
Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列.它包含了易于使用的预定义类,还有强大的mixin 用于生成更具 ...
- 制作C/C++动态链接库(dll)若干注意事项
一.C\C++ 运行时库编译选项简单说明 问题:我的dll别人没法用 运行时库是个很复杂的东西,作为开发过程中dll制作需要了解的一部分,这里主要简单介绍一下如何选择编译选项. 在我们的开发过程中时常 ...
- MVC缓存技术
一.MVC缓存简介 缓存是将信息(数据或页面)放在内存中以避免频繁的数据库存储或执行整个页面的生命周期,直到缓存的信息过期或依赖变更才再次从数据库中读取数据或重新执行页面的生命周期.在系统优化过程中, ...
- Python2.x与3.x版本区别
Python的3.0版本,常被称为Python 3000,或简称Py3k.相对于Python的早期版本,这是一个较大的升级. 为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下相容 ...
- 【Merge K Sorted Lists】cpp
题目: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...
- WooCommerce微信支付插件免费版下载
WooCommerce微信支付插件免费版下载 2016-05-11 点击:605 免费版来了 免费版终于来了,直接下载用吧,当然免费少一些功能,只有PC扫码支付,没有微信原生支付,没有汇率,没有退款, ...
- poj 1470 Closest Common Ancestors LCA
题目链接:http://poj.org/problem?id=1470 Write a program that takes as input a rooted tree and a list of ...
- 【UOJ Easy Round #2】
然而UER我也照样跪…… 第一题 忘了取模sad || 操作符将整个区间分成了一些段,每个手机只会执行其中某一段,执行次数为这一段中&&的个数?+1? ans=ans*num[i]+1 ...
- 【BZOJ】【3280】小R的烦恼
网络流/费用流 和软件开发那题基本相同,只是多加了一个“雇佣研究生”的限制:不同价格的研究生有不同的数量…… 那么只需加一个附加源点,对每一种研究生连边 S->ss 容量为l[i],费用为p[i ...