1.虚拟方法调用也叫动态绑定
2.具体是什么用代码来说明
Person类
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 package com.alibaba.com.miao; 2 3 public class Person { 4 5 protected String name; 6 protected int age; 7 8 public String getName() { 9 return name; 10 } 11 12 public void setName(String name) { 13 this.name = name; 14 } 15 16 public int getAge() { 17 return age; 18 } 19 20 public void setAge(int age) { 21 this.age = age; 22 } 23 24 public Person(String name, int age) { 25 super(); 26 this.name = name; 27 this.age = age; 28 } 29 30 public Person() { 31 32 } 33 34 public String getInfo() { 35 return "Person [name=" + name + ", age=" + age + "]"; 36 } 37 38 }
Student类继承Person类
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 package com.alibaba.com.miao; 2 3 public class Student extends Person { 4 public String getInfo() { 5 return "Student [name=" + name + ", age=" + age + "]"; 6 } 7 }
Test测试类
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 package com.alibaba.com.miao; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 //没有使用虚拟方法调用 7 Person p = new Person(); 8 p.setAge(20); 9 p.setName("super hacker"); 10 System.out.println(p.getInfo()); 11 12 Student stu = new Student(); 13 stu.setAge(21); 14 stu.setName("geek"); 15 System.out.println(stu.getInfo()); 16 //使用虚拟方法调用 17 Person p1 = new Student(); 18 p1.setAge(19); 19 p1.setName("me"); 20 System.out.println(p1.getInfo()); 21 } 22 }
由此可见:
编译时p1为Person类型,而方法的调用是在运行时确定的,所以调用的是Student类的getInfo()方法。
这样做的好处可以降低类之间的耦合性。
虚拟方法调用--在多态下使用