java多态中的虚方法调用
来源:互联网 发布:rhinoceros mac 编辑:程序博客网 时间:2024/05/16 12:16
今天偶然看到这个东西, 想起来以前学的时候有点绕糊, 这里随笔记一下吧.
个人认为虚方法的调用发生在多态中.
例如以下两个类, 一个是Employee, 一个是Programmer
类: Employee
public class Employee { protected int salary; protected int age; protected String name; public void showInfo() { System.out.println("Employee中的showInfo方法"); System.out.println("姓名: " + this.getName() + ", 年龄: " + this.getAge() + ", 工资: " + this.getSalary()); System.out.println(); } /** * 以下getter setter方法省略 */}
类Programmer:
public class Programmer extends Employee { @Override public void showInfo() { System.out.println("Programmer中的showInfo方法" + "\n"); System.out.println("姓名: " + this.getName() + ", 年龄: " + this.getAge() + ", 工资: " + this.getSalary()); }}
通过这两个类我们知道Programmer是Employee的子类, 所以拥有其中所有的方法, 包括我们重写的showInfo方法以及未重写的getter和setter方法.
然后我们再来看下这个代码来了解一下在多态的情况下, 以不同的实例对象调用重写的方法会发生什么情况:
public class TestVitrualMethodInvoke { public static void main(String[] args) { Programmer programmer = new Programmer(); programmer.setAge(23); programmer.setName("张三"); programmer.setSalary(8000); Employee employee = new Programmer(); employee.setAge(30); employee.setName("李四"); employee.setSalary(5000); programmer.showInfo(); employee.showInfo(); }}
首先我们new了2个Programmer, 但用不同的引用接收. 分别是Employee和Programmer引用.
我们知道: Employee employee = new Programmer();
这段代码是一个多态的写法, 就是父类的引用接收子类的实例对象.
概念: 当父类的引用接收子类的实例对象时, 这时候调用重写的方法, 实际上调用的是重写后的方法, 也就是调用子类的方法, 虽然用于接收实例对象的引用是父类类型.
下面是输出结果:
Programmer中的showInfo方法
姓名: 张三, 年龄: 23, 工资: 8000Programmer中的showInfo方法
姓名: 李四, 年龄: 30, 工资: 5000
两次输出都是子类中被重写的方法.
这就是多态中的虚方法调用, 所以我们在今后的开发中需要注意这点.
如果我们想调用非子类中重写的方法, 那么就需要用父类的实例对象.
或者我们在子类中可以使用super.showInfo()这种方式来调用.
补充说明: jvm在执行这两段代码时是这样工作的.
Employee employee = new Programmer();employee.showInfo();
首先编译期间
先检查Employee中有无showInfo方法, 若无则无法编译通过.
然后在运行期间
, 发现这个employee的实际引用的实例对象是Programmer, 所以就去调用Programmer中showInfo()方法, 这就是造成 上述现象的原因.
所以我们说多态的对象只有在运行期才可以确定.
- java多态中的虚方法调用
- DWR调用Java中的方法
- Java 调用 js 中的方法
- Java- 多态和虚方法调用
- java方法调用中的单分派与多分派
- Java Servlet 中的许多方法调用示例
- 在java中父类调用子类中的方法
- java笔记(6) --反射中的方法调用
- java jni 调用cpp文件中的方法
- 关于java反射调用class中的方法
- 使用js直接调用java中的方法
- Java中的RMI(远程方法调用)
- Java方法调用中的内存分析
- JSP中调用java类中的方法
- java中的方法调用-解析与分派
- java调用python文件中的方法
- java继承多态方法调用测试
- java多态之方法调用
- mariadb数据库的安装和简单配置
- EL表达式
- 172. Factorial Trailing Zeroes
- ubuntu Samba 配置
- WEB通信之 长连接、长轮询(long polling)
- java多态中的虚方法调用
- nodejs学习笔记1
- 189. Rotate Array
- javascript表达式和运算符
- java链接数据库
- java并发高级知识点-Lock接口说明
- JavaScript数据类型的一些注意点(2)
- 191. Number of 1 Bits
- centos 中文乱码解决办法