文档章节

有关于重载(overload)与重写(override覆盖)的思考

仗剑天涯Z
 仗剑天涯Z
发布于 2015/11/27 10:04
字数 569
阅读 14
收藏 0

1、重载-overload ---静态分派

           一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。

            

package jvm;

public class StaticDispach {
	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 man");
	}
	public void sayHello(Woman guy){
		System.out.println("hello woman");
	}
	public static void main(String[] args) {
		Human man = new Man();
		Human woman = new Woman();
		StaticDispach sr = new StaticDispach();
		sr.sayHello(man);
		sr.sayHello(woman);
	}
}

       运行结果:

hello guy
hello guy

    为什么会执行参数为Human的重载呢?

Human man = new Man();

    需要两个概念,1、Static Type(静态类型)也叫 Apparent Type(外观类型)---- Human

                            2、Actual Type(实际类型)  --- Man( )

    静态类型的变化仅仅在使用时发生,变量本身的静态类型的变化紧紧在使用时发生,变量本身的静态类型不会被改变,并且最终的静态类型实在编译期可知的;而实际类型变化的结果在运行期才可确定,编译器在编译程序的时候并不知道一个对象的实际类型是什么。

    而在重载时虚拟机是通过参数的静态类型作为判定依据的。

  //实际类型的变化
  Human man = new Man();
  man = new Woman();
  
  //静态类型的变化
  sr.sayHello((Man)man);
  sr.sayHello((Woman)man);

    下面是一个极端的重载代码、

public class Overload {
	public static void sayHello(Object arg) {
		System.out.println("hello Object");
	}

	public static void sayHello(int arg) {
		System.out.println("hello int");
	}

	public static void sayHello(long arg) {
		System.out.println("hello long");
	}

	public static void sayHello(Character arg) {
		System.out.println("hello Character");
	}

	public static void sayHello(char arg) {
		System.out.println("hello char");
	}

	public static void sayHello(char... arg) {

		System.out.println("hello char ...");
	}

	public static void sayHello(Serializable arg) {
		System.out.println("hello Serializable");
	}

	public static void main(String[] args) {
		sayHello('a');
	}
}

2、重写override ---动态分派

  一般用于子类覆盖父类中的方法。重新实现父类的方法。

public class DynamicDispatch {
	static abstract class Human {
		abstract void sayHello();
	}

	static class Man extends Human {
		@Override
		void sayHello() {
			System.out.println("man say hello'");
		}
	}

	static class Woman extends Human {
		@Override
		void sayHello() {
			System.out.println("woman say hello'");
		}
	}

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

    输出结果

man say hello
woman say hello
woman say hello

    这是由于虚拟机根据实际类型来分派方法执行的。

    按照继承关系,从底向上寻找方法。

© 著作权归作者所有

上一篇: Java NIO 概述
仗剑天涯Z
粉丝 1
博文 14
码字总数 6260
作品 0
昌平
程序员
私信 提问
override, overload, overwrite

override:覆写是对接口方法名实现 overload:重载 同一个类里同一个方法名,有不同入参 overwrite:重写 重写父类所属方法 覆盖(override) 继承了父类的同名无參函数:当子类从父类继承一...

robslove
2018/11/22
9
0
C++的重写,重载,重定义

1. 重写 (override): 父类与子类之间的多态性。子类重新定义父类中有相同名称和参数的虚函数。 1) 被重写的函数不能是 static 的。必须是 virtual 的,或者是 override 的 ( 即函数在最原始的...

晨曦之光
2012/04/13
3.5K
0
C++编程思想(两卷合订本)上重载问题

在书中17页,“改变已经存在的基类函数的行为,这称为重载(overriding)这个函数”,我查资料override(重写,覆盖) 、overload(重载,过载) 。书中的重载是不是应该是重写?...

双峪
2016/09/08
193
4
覆盖(重写),重构,重载的区别

论坛中常常看到有人问这样的问题,因此总结一下: 首先这三个概念描述得范围是不同的: 重构, 是对软计设计方法的描述, 这个层面是架构和设计方法, e.g: 你今天写了一个应用, 读txt文档并显示,...

晨曦之光
2012/03/09
161
0
overload与override的区别

重写(Override)也称覆盖,它是父类与子类之间多态性的一种表现,而重载(Overload)是一个类中多态性的一种表现。 Override的规则 参数列表必须完全与被重写方法的相同; 访问权限不能比父类中...

奔跑吧李博
2018/12/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

采坑指南——k8s域名解析coredns问题排查过程

正文 前几天,在ucloud上搭建的k8s集群(搭建教程后续会发出)。今天发现域名解析不了。 组件版本:k8s 1.15.0,coredns:1.3.1 过程是这样的: 首先用以下yaml文件创建了一个nginx服务 apiV...

码农实战
13分钟前
1
0
【2019年8月版本】OCP 071认证考试最新版本的考试原题-第6题

choose three Which three statements are true about indexes and their administration in an Orade database? A) An INVISIBLE index is not maintained when Data Manipulation Language......

oschina_5359
16分钟前
1
0
阿里巴巴开源 Dragonwell JDK 最新版本 8.1.1-GA 发布

导读:新版本主要有三大变化:同步了 OpenJDK 上游社区 jdk8u222-ga 的最新更新;带来了正式的 feature:G1ElasticHeap;发布了用户期待的 Windows 实验版本 Experimental Windows version。...

阿里巴巴云原生
21分钟前
1
0
教你玩转Linux—磁盘管理

Linux磁盘管理好坏直接关系到整个系统的性能问题,Linux磁盘管理常用三个命令为df、du和fdisk。 df df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少...

xiangyunyan
24分钟前
3
0
js 让textarea的高度自适应父元素的高度

textarea按照普通元素设置height是没有作用的,可以这么来设置, 下面给上一段项目代码 JS代码: $.fn.extend({ txtaAutoHeight: function () { return this.each(function () {...

文文1
24分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部