Java implement polymorphism
来源:互联网 发布:百度浏览器打不开淘宝 编辑:程序博客网 时间:2024/06/08 16:22
本文章转自博客:https://originals-tz.github.io/
何为多态性
多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
多态的作用:消除类型之间的耦合关系。
现实中,关于多态的例子不胜枚举。比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。
多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象。
何为动态绑定
后期绑定:在运行时根据具体对象的类型进行绑定。
若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。也就是说,编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的。但我们至少可以这样认为:它们都要在对象中安插某些特殊类型的信息。
java当中的向上转型或者说多态是借助于动态绑定实现的,所以理解了动态绑定,也就搞定了向上转型和多态。
前面已经说了对于java当中的方法而言,除了final,static,private和构造方法是前期绑定外,其他的方法全部为动态绑定。而动态绑定的典型发生在父类和子类的转换声明之下:
动态绑定的过程
虚拟机提取对象的实际类型的方法表;
虚拟机搜索方法签名;
调用方法。
比如:C x = new D()
其具体过程细节如下:
1:编译器检查对象的声明类型和方法名。假设我们调用x.f(String)方法,并且x已经被声明为C类的对象,那么编译器会列举出C类中所有的名称为f的方法和从C类的超类继承过来的f方法
2:接下来编译器检查方法调用中提供的参数类型。如果在所有名称为f 的方法中有一个参数类型和调用提供的参数类型最为匹配,那么就调用这个方法,这个过程叫做“重载解析”
3:当程序运行并且使用动态绑定调用方法时,虚拟机必须调用同x所指向的对象的实际类型相匹配的方法版本。假设实际类型为D(C的子类),如果D类定义了f(String)那么该方法被调用,否则就在D的超类中搜寻方法f(String),依次类推
对于多态,可以总结以下几点:
一、使用父类类型的引用指向子类的对象;
* 二、该引用只能调用父类中定义的方法和变量;*
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。
实例
public class Test_implementPolymorphism { public static void main(String[] args) { A a1 = new A(); A a2 = new B(); B b = new B(); B b2 = new B(); a1.show(b); //A.show(A o) a2.show(a1); //B.show(A o) a2.show(b); //B.show(A o) b.show(b2); //B.show(B o) }}class A { public void show(A o) { System.out.println("A and A"); }}class B extends A { //重写父类方法 public void show(A o) { System.out.println("B and A"); } public void show(B o) { System.out.println("B and B"); }}
Out Put
A and AB and AB and AB and B
当注释掉子类的show(A o)
public class Test_implementPolymorphism { public static void main(String[] args) { A a1 = new A(); A a2 = new B(); B b = new B(); B b2 = new B(); a1.show(b); //A.show(A) a2.show(b); //A.show(A) a2.show(a1); //A.show(A) b.show(b2); //B.show(B) }}class A { public void show(A o) { System.out.println("A and A"); }}class B extends A { /* public void show(A o) { System.out.println("B and A"); }*/ public void show(B o) { System.out.println("B and B"); }}
out Put
A and AA and AA and AB and B
- Java implement polymorphism
- Java Polymorphism
- How to implement Polymorphism in C
- Java-polymorphism-01
- Java-polymorphism-02
- Java - Constructors and Polymorphism
- 【Java】多态性Polymorphism
- Java 基础 polymorphism(多态)
- Thinking in java : polymorphism
- java info polymorphism
- Polymorphism
- Polymorphism
- polymorphism
- Polymorphism
- Polymorphism
- Polymorphism
- Polymorphism
- Polymorphism
- 病毒式营销
- spring框架访问properties配置文件的设置方法
- 代数系统
- MySQL——修改root密码的4种方法(以windows为例)
- [NOIP模拟][状压DP]乘积
- Java implement polymorphism
- 【MTK】MTK不开机问题分析
- 第七周项目三
- 严蔚敏数据结构——算法2.11和2.12
- 计算机网络作业四
- GeekBand笔记-《STL与泛型编程 》 第一周
- 代码高亮测试
- Redis基础——sort排序
- 数据结构图文解析之:AVL树详解及C++模板实现