多态和分派

多态是什么?
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作


首先想要有多态的三个条件:
1、有继承
2、有重写
3、有父类引用指向子类对象Father father = new Son();

多态的优点
1.消除类型之间的耦合关系
2. 可替换性
3. 可扩充性
4. 接口性
5. 灵活性
6. 简化性



通过字节码解析多态
静态分派选择是静态类型的一个版本的方法,而后根据invokevirtual指令运行指向的具体对象,
来选择这个对象的的这个版本的方法。所以,一个对象能调用的方法由它的【静态类型】决定。




分派(重载)
  jvm在进行方法重载,是根据静态类型决定而不是动态类型。择哪一个重载方法,并且把这个方法的符号引用写在了invokevirtual的指令中。
  选择方法的过程就叫分派,依靠方法的综量(方法名,参数个数两个,则综量是1+2=3),之后还可以根据匹配程度
来看(例如字符'a'匹配的优先级是 char int long
Character Object char... 来匹配具体的方法
public class Overload {
public void sayHello(Object arg){
System.out.println("hello object");
}
public void sayHello(int arg){
System.out.println("hello int");
}
public void sayHello(long arg){
System.out.println("hello long");
}
public void sayHello(Character arg){
System.out.println("hello Character");
}

public void sayHello(char arg){
System.out.println("hello char");
}
public void sayHello(char... arg){//类型后面加 ... 是可变参的意思,可以多个参数
System.out.println("hello char...");
}
public static void main(String[] args) {
new Overload().sayHello('a');
  }
}

延伸

多态只和方法有关系
(对象的多态,其实也是方法多态的延伸)和属性、成员变量无关,因为属性没有invokevirtual对应的调用指令。

重载(overloading)和重写(overriding)是java多态性的体现,但是由于重载是静态分派的原因,有些博客不认为重载也能体现多态性
对象的多态是方法多态的延伸,所以,都可以说是方法的多态
 
所以,一个对象能调用的方法由它的【静态类型】决定
posted @ 2021-12-23 17:01  CcYcHu  阅读(49)  评论(0)    收藏  举报