重载
public class Human {
}
public class Man extends Human{
}
public class Woman extends Human{
}
public class Party {
public void play(Human human){
System.out.println("人类的狂欢!");
}
public void play(Man man){
System.out.println("男人的狂欢!");
}
public void play(Woman woman){
System.out.println("女人的狂欢!");
}
public static void main(String[] args) {
Party party = new Party();
Human human = new Human();
party.play(human);
Human man = new Man();
party.play(man);
Human woman = new Woman();
party.play(woman);
}
}
结果
人类的狂欢!
人类的狂欢!
人类的狂欢!
虚拟机在选择重载方式时,是通过【静态类型】决定的而不是动态类型。由于静态类型编译时就可知,事实上虚拟在编译期就已经知道选择哪一个重载方法,并且把这个方法的符号引用写在了invokevirtual的指令中。
重写
public class Human {
public void play(){
System.out.println("人类的狂欢!");
}
}
public class Man extends Human{
@Override
public void play() {
System.out.println("男人的狂欢!");
}
}
public class Woman extends Human{
@Override
public void play() {
System.out.println("女人的狂欢!");
}
}
public static void main(String[] args) {
Human human = new Human();
human.play();
Human man = new Man();
man.play();
Human woman = new Woman();
woman.play();
}
人类的狂欢!
男人的狂欢!
女人的狂欢!
动态分派的过程,是根据运行时类型确定具体调用谁的 play() 方法,因为运行时类型是human、man、woman,所以最终的方法选择是对应的类的 play() 方法。