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中多态性的实现 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对 ...
随机推荐
- Java实现Tire
Trie,又称单词查找树或键树,是一种树形结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比 ...
- Entity Framework 学习之--Ling to entity实现分页
最近用MVC做的一个项目涉及到分页,中间用了entity framework来查数据库,不用直接写sql语句,方便了很多. 一般分页的思路是获得两个变量的值: 1.一共有多少条记录 totalCoun ...
- Java 7 中 NIO.2 的使用——文件递归操作
众所周知,递归编程是一项有争议的技术,因为它需要大量的内存,但是它能简化一些编程任务.基本上,一个递归操作都是程序调用自己传递参数修改的值或者参数传递到当前的程序循环中.递归编程通常用来计算阶乘斐波那 ...
- poj 2711 Leapin' Lizards && BZOJ 1066: [SCOI2007]蜥蜴 最大流
题目链接:http://poj.org/problem?id=2711 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1066 Your p ...
- Matlab稀疏矩阵
一.矩阵存储方式 MATLAB的矩阵有两种存储方式,完全存储方式和稀疏存储方式 1.完全存储方式 将矩阵的全部元素按列存储,矩阵中的全部零元素也存储到矩阵中. 2.稀疏存储方式 仅存储矩阵所有的非零元 ...
- 引入代码后,在@override报错
最近引入了spring的源码到工程里,发现凡是@override修饰的代码都会报错 这里有java历史的原因 5及以前不支持@override的注解,所以,此时,你最需要知道的是当前项目djk的编译版 ...
- NYOJ-102 次方求模 AC 分类: NYOJ 2014-02-06 18:53 184人阅读 评论(0) 收藏
地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=102 //a^b mod c=(a mod c)^b mod c很容易设计出一个基于二分的递归 ...
- 16进制转rgb
- (void)colorWithHexString: (NSString *) stringToConvert { //去掉前后空格换行符 NSString *cString = [[stringT ...
- YARN-RPC
运行在YARN平台上面的RPC. 当前存在非常多的开源RPC框架,比较著名的有Thrift.Protocol Buffers 和 AVRO.他们均有两部分构成:对象序列化和远程过程调用. 重要类: Y ...
- samsung-smart app 开发
http://www.samsungdforum.com/ http://seller.samsungapps.com/login/signIn.as?returnURL=%2fmain%2fsell ...