Java三大特征之------多态
1.定义
指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。
2.存在条件
2.1存在父子关系
2.2子类中存在重写方法
2.3父类类型的变量指向子类对象的引用
3.实现方式
3.1接口实现
3.2继承父类进行方法重写
3.3同一个类中进行方法重载
4.类型的强制转换
4.1转换格式:子类 +新变量=(子类)+变量(父类类型的变量引用指向子类对象)
4.2父类类型的变量可以转换成子类类型的变量,但是可能出现“类型转换异常”
4.3使用x instance A判断异常,要求x所属的类B与类A为父子关系:结果为true,不抛出异常
5.实例分析
实例一:
class A {
public String show(A obj) {
return ("A and A");
}
public String show(D obj) { //方法的重载
return ("A and D");
}
}
class B extends A {
public String show(B obj) { //方法的重载
return ("B and B");
}
public String show(A obj) { //方法的重写
return ("B and A");
}
}
class C extends B {
}
class D extends B {
}
public class Duotai {
public static void main(String args[]) {
A a1 =new A();
B b = new B();
C c = new C();
D d = new D();
//多态:父类类型的变量指向子类对象的引用
A a2 =new B();
//多态的表现形式:相同类型的变量,调用相同的方法,产生不一样的结果。
System.out.println(a1.show(b));
a1.show(b):
1.先看引用变量a1的类型,为A,b是B的一个实例;
2.在类A中查看是否有方法show(B obj),发现不存在;
3.查看A是否有超类(父类),发现不存在;
4.查看A中是否有方法show(A obj),存在;
注:参数b是B的实例,B为A的子类,将参数b转换为a再找方法,在A中查找是否有B可以继承的方法show(A obj)
5.a1是对本身对象的引用,所以不考虑方法的重写,答案为 A and A.
System.out.println(a1.show(c));
a1.show(c):
1,2,3同上
4.A中不存在方法show(B obj);继续步骤3,没有;继续步骤4,类A中有show(A obj);
5.同上
System.out.println(a1.show(d));
System.out.println(a2.show(b));
a2.show(b):
1,2,3同上
4.A中是否有方法show(A obj),存在;
注: 将参数b转换为a
5.a2是对子类B对象的引用,考虑方法的重写,在子类B中对类A的show(A obj)进行了重写,所以答案为B and A.
System.out.println(a2.show(c));
System.out.println(a2.show(d));
System.out.println(b.show(b));
System.out.println(b.show(c));
b.show(c):
1,2同上
3.B的父类A中是否有方法show(c obj),不存在;
4.B中是否有方法show(B obj),存在;
5.b是对本身对象的引用,不考虑方法的重写,答案为B and B.
System.out.println(b.show(d));
}
}

实例二:
public class Person {
public void walk(){
System.out.println("走路");
}
}
public class Man extends Person{
public void walk(){
System.out.println("男人快步走");
}
public void work(){
System.out.println("男人是个工作狂");
}
}
public class Woman extends Person{
public void walk(){
System.out.println("女人漫步走");
}
public void shopping(){
System.out.println("女人是个购物狂");
}
}
public class Test {
public static void main(String args[]){
Person p1=new Person();
//多态:父类类型的变量指向子类对象的引用
Person p2=new Man();
Person p3=new Woman();
//多态的表现形式:相同类型的变量,调用相同的方法,产生不一样的结果。
p1.walk();
虚拟方法调用:当父类的方法被子类重写时,会调用子类重写的方法,而不是父类的方法。
p2.walk();
p3.walk();
在多态的情况下,只能调用父类的方法和被子类重写的方法;如果向调用子类的方法,需要进行类型的前置转换
// p2.work(); 错误
Man m=(Man) p2;
m.work();
Woman w=(Woman) p3;
w.shopping();
父类类型的变量可以转换成子类类型的变量,但是可能出现“类型转换异常”。
/*Woman w=(Woman) p2;
w.shopping();*/
/*instanceof操作符
x instance A,要求x所属的类B与类A为父子关系
instanceof可以检测是否会抛出类型转换异常,返回true表示可以转换类型*/
System.out.println(p2 instanceof Man);
}
}

Java三大特征之------多态的更多相关文章
- Java三大特征之多态(三)
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
- Java 三大特征之--多态
http://www.cnblogs.com/chenssy/p/3372798.html
- Java的OOP三大特征之一——多态
OOP(面对对象)三大特征之一——多态 What:多态性是指允许不同类的对象对同一消息作出响应,多态性包括参数化多态性和包含多态性,多态性语言具有灵活.抽象.行为共享.代码共享的优势,很好的解决了应用 ...
- JAVA三大特性之多态
面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据 ...
- Java三大特征之继承(二)
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- Java面试题,Java三大特性之一——多态的理解
首先我们知道Java是一门面向对象的语言 面向对象三大特性,封装.继承.多态. 封装.继承.多态 ↓ 无论是学习路线,还是众人的口语习惯,都是按照这个这样进行排序,这是有原因的.因为封装好了才能继承, ...
- java中类的三大特征之多态
Java 多态 同一种事物由于条件不同,展示出不同的结果,叫做多态. 父类的引用类型,由于使用不同的子类对象实例,而执行不同的操作. 多态存在的三个必要条件 1. 子类继承父类: 2. 子类重写父类方 ...
- Java三大特征:封装 继承 多态
内部类:成员内部类.静态内部类.方法内部类.匿名内部类. 内部类:定义在另外一个类里面的类,与之对应,包含内部类的外部类被称为外部类. 内部类的作用:(1)内部类提供了更好的封装,可以把内部类隐藏在外 ...
- 面向对象三大特征之多态——Java笔记(七)
多态: 同一个实体同时具有多种形式 编译时的类型有声明该变量时使用的类型决定,运行时的类型有实际赋值给变量的对象决定 如果编译时类型和运行时类型不同,就出现多态 例: clas ...
随机推荐
- 请求webservice接口的某方法数据
NSURL *url = [NSURL URLWithString:@"http://xxx.xxx.com/xxx/xxxxWS?wsdl"]; NSString *soapMs ...
- python_way day12 sqlalchemy,原生mysql命令
python_way day12 sqlalchemy,mysql原生命令 1.sqlalchemy 2.mysql 原生命令 一,sqlalchemy SQLAlchemy本身无法操作数据库,其必 ...
- XAF学习笔记之 Upcasting
通常,我们会定义继承层次结构,假设有类型,CustomerBase,CustomerTrialed,CustomerRegistered三个类型,并且继承结构如下: 业务对象代码定义如下: using ...
- 整理的一些常用的CSS HACK
ie8以下兼容透明都和支持CSS圆角,这两个都要在服务器上才看到效果,可以本地搭建一个服务器如IIS -pie-background: rgba(255, 255, 255, 0.10);/*IE6 ...
- spring集成quartz scheduler
创建项目 有两种创建quart配置作业 1.使用MethodInvokingJobDetailFactoryBean Quartz Scheduler 配置作业(MethodInvokingJobD ...
- [转载] 深入 nginx 架构
原文: http://www.cnbeta.com/articles/402709.htm 了解 nginx 架构帮助我们学习如何开发高性能 web 服务. 为了更好地理解设计,你需要了解NGINX是 ...
- 设计js通用库
设计js通用库的四个步骤: 1.需求分析:分析库需要完成的所有功能. 2.编程接口:根据需求设计需要用到的接口及参数.返回值. 3.调用方法:支持链式调用,我们期望以动词方式描述接口. (ps:设计链 ...
- Object Pascal 过程与函数
过程与函数 过程与函数是实现一定功能的语句块,是程序中的特定功能单元.可以在程序的其他地方被调用,也可以进行递归调用.过程与函数的区别在于过程没有返回值,而函数有返回值. 1.过程与函数的定义 过程与 ...
- Android Contacts (android通讯录读取)-content provider
Content Provider 在数据处理中,Android通常使用Content Provider的方式.Content Provider使用Uri实例作为句柄的数据封装的,很方便地访问地进行数据 ...
- you don't have permission to view it 解决
the file couldn't be opened because you don't have permission to view it 简单设置下面的选项即可,不要谢我啊! change ...