一道面试题,以下程序的输出是?

public class StaticDispatch {
static abstract class Human{
}
static class Man extends Human{
}
static class Woman extends Human{
}
public void sayHello(Human guy){
System.out.println("hello , guy!");
}
public void sayHello(Man guy){
System.out.println("hello, gentleman!");
}
public void sayHello(Woman guy){
System.out.println("hello, lady!");
} public static void main(String[] args) {
Human man = new Man();
Human woman = new Woman();
StaticDispatch sd = new StaticDispatch();
sd.sayHello(man);
sd.sayHello(woman);
}
}

结果是

hello , guy!

hello , guy!

------------------------

对于 Human man = new Man();

上面代码中的“Human”称为 变量的静态类型(static type),或者叫做外观类型。后面的Man是实际类型

变量本身的静态类型不会被改变,而且终于的静态类型在编译期可知的。而实际类型变化的结果在执行期才可确定。

我们能够对上面的代码做些改动

public static void main(String[] args) {
Human man = new Man();
Human woman = new Woman();
StaticDispatch sd = new StaticDispatch();
sd.sayHello((Man)man);
sd.sayHello((Woman)woman);
}

输出就变成了

hello, gentleman!

hello, lady!

最新文章

  1. Hilbert-Huang Transform(希尔伯特-黄变换)
  2. 如何在windows上编译Chromium (CEF3) 并加入MP3支持(二)
  3. 网盘的选择,百度网盘、google drive 还是 Dropbox
  4. curl的POST与GET方法
  5. berkeley db replica机制 - 主从同步
  6. 图之BFS和DFS遍历的实现并解决一次旅游中发现的问题
  7. C# winFrom 制作、打包、签名、发布Activex全过程
  8. Java之字符串学习
  9. GPS功能:百度路书自定义【轨迹回放】
  10. ASP.NET获取IP的6种方法 【转】
  11. Java 四种线程池的使用
  12. linux ip 转发设置 ip_forward
  13. 在linux 上安装ansible
  14. C# 程序修改config文件后,不重启程序刷新配置ConfigurationManager
  15. springBoot(9)---定时任务,异步任务
  16. Hdoj 1115.Lifting the Stone 题解
  17. Java 模拟面试题
  18. 安卓自动化测试——rf
  19. SQL那些事儿(十一)--ODBC,OLE-DB,ADO.NET区别[转]
  20. 2018-03-17 handler学习使用

热门文章

  1. python----面向对象:1类的定义
  2. RMSE、RMS、标准差
  3. vim calendar插件配置
  4. 第二章 andrid studio创建项目
  5. docker 保存更改的镜像:
  6. java 多线程使用方法及Socket的使用
  7. [Oracle] - 性能优化工具(3) - ADDM
  8. 简单的Ajax
  9. SQL中的去重操作
  10. 混淆篇之原生DOM操作方法小结