10. 谈谈对编译时多态与运行时多态的理解

1.多态基础知识:
什么是多态
面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。

多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

实现多态的技术称为:动态绑定(dynamic binding)

多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象。

多态的好处:

1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,draw函数对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

2.运行时多态与编译时多态
ps:其实从java多态的定义来说编译多态并不能真正算做多态,有时候我们也叫他静态多态性。ok,让我们进入正题。
编译时多态主要指的是函数的重载,例如有一个类这个C有一个方法F,但是同时存在F(int),和F(String),当我们的代码中有c.F(param)时,编译器会将C类中说有名为F的方法和父类中属性为public且名为F的方法。
接下来编译器会查看param的类型,比如c.F(“hello”)就会挑选F(String)而不是F(int),如果调用c.F(1),编对应的译器就会选择F(int)。如果挑选不到对应的方法或者多个方法对应就会报错。
接下来我们看运行时多态性。
运行时多态性主要运用到动态绑定。就是在运行时动态的确定调用的是哪一个函数。比如:如果A有多个之类,每个子类都有f(Stirng)方法,当我们声明一个A的对象a,对它用不同的子类进行不同的实例化。这样这个方法可以产生不同的效果,也就是实现了多态。接下来让我们看个具体的例子:

public class test {

public static void main(String[] args) {
    A b=new B();
    A c=new C();
    A d=new D();
    D d2=new D();
    b.say();
    c.say();
    d.say();
    d2.say(1);
    d2.say(""); 
}

}
abstract class A{
public abstract void say();
}
class B extends A{

@Override
public void say() {
    System.out.println("this is class b");

}

}
class C extends A{

@Override
public void say() {
    System.out.println("this is class c");

}
public void say(boolean b){
    System.out.println("this is class c boolean");
}

}
class D extends B{

@Override
public void say() {
    System.out.println("this is class d");

}
public void say(int i){
    System.out.println("this is class d int");
}
public void say(String string){
    System.out.println("this is class d string");
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
执行结果
this is class b
this is class c
this is class d
this is class d int

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值