多态是什么?
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作
首先想要有多态的三个条件:
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多态性的体现,但是由于重载是静态分派的原因,有些博客不认为重载也能体现多态性
对象的多态是方法多态的延伸,所以,都可以说是方法的多态
所以,一个对象能调用的方法由它的【静态类型】决定