重载与重写(overload and override)

在java编程中经常会遇到重载和重写,刚接触java的时候对这对概念比较懵比,也不能理解其中的区别,后来在逐渐的学习中更加深刻的理解了其中的原理。哎,说来还是基础知识学的不扎实,这些都是大学期间偷懒欠下的帐。

(一)简单理解

1.重载是在一个类中有多个名称一样的方法,需要根据参数来辨识运行时使用哪个方法。在java中同一个类的同名方法的重载仅依赖(1)参数类型、(2)参数个数、(3)参数顺序三者决定。与返回类型,函数修饰符都无关。

2.重写是多个类继承于同一父类,并同时实现了父类的方法,这时我们在利用父类上转型引用子类并调用接口时,jvm会帮我们执行子类实现的方法逻辑。举个栗子如下:

class Animal{public void move(){System.out.println("动物可以移动");}
}class Dog extends Animal{public void move(){System.out.println("狗可以跑和走");}
}public class TestDog{public static void main(String args[]){Animal a = new Animal(); // Animal 对象Animal b = new Dog(); // Dog 对象a.move();// 执行 Animal 类的方法b.move();//执行 Dog 类的方法}
}

(二)深入理解

java代码在经过javac编译后成为class文件,然后会通过类加载器加载进入内存。加载类文件的过程是由虚拟机外部用户自定义的类装载器实现的,我们常用的就是tomcat,tomcat会将class类文件装载进内存,然后由虚拟机进行验证、准备、解析、初始化等操作。class文件中包含逻辑代码生成的字节码及很多常量池引用组成的元数据。我们在进行方法调用时,实际上目标方法在class文件中就是一个对常量池的符号引用。们需要将这个符号引用转为直接引用,这个过程是jvm在解析过程中实现的。我们的重载和重写就是从解析开始的,接下来我们仔细介绍类的解析及方法的分派过程。

(1)方法调用的解析过程
我们代码中对外部类方法的调用,一开始都是简单的符号引用,虚拟机在类加载阶段会自动帮我们进行对符号引用的解析。这个过程可能在类加载期进行,也可能在运行时进行,主要是为了实现java的动态分派,这个之后说。类加载阶段的解析只能针对类的静态方法、私有方法和final方法进行,因为这些方法在运行期都是不会发生变化的,其他类型的方法可能被子类继承并重写,我们无法在类加载时就确定其直接引用。

(2)方法的分派
方法的分派包含静态分派和动态分派,重载出现在静态分派的过程中,而重写出现在动态分派的过程中。
1.当我们的方法调用在解析过程中找到对应的类后,发现对应的类中有很多同名的方法,这时会根据方法调用时使用的参数类型(称为静态类型)来判定使用哪个函数,然后将依赖类进行加载和初始化,并将符号引用转为这个类方法的内存地址,这个过程就叫做静态分派。
2.当程序运行后,在方法调用的解析过程中发现代码声明的类和运行时引用类不同时,会根据实际引用类的地址去寻找实际引用类的方法列表中寻找是否有相应方法,这个过程叫做动态分派,例如有个Son类继承了父类Father类,并实现了父类的run方法,然后我们执行 Father sonRun = new Son(); sonRun.run();这个过程便是动态分派的过程,动态分派只能在运行期,不能根据静态类型(Father类)确定方法的内存地址,只能在在操作数栈中找到实际类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷P4114 Qtree1(树链剖分+线段树)

传送门 LCT秒天秒地用什么树剖 这题可以算是树剖的比较裸的题目了 把每一条边的权值下放到他两边的点中深度较深的那个 然后直接用树剖线段树带进去乱搞就可以了 1 //minamoto2 #include<bits/stdc.h>3 using namespace std;4 template<class T>inline bool cmax(T…

什么是CDN ,CDN的作用

转自&#xff1a;https://baike.baidu.com/item/CDN/420951?fraladdin 简介 CDN是构建在网络之上的内容分发网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发、调度等功能模块&#xff0c;使用户就近获取所需内容&#xff0c;降低网…

docker 中不能用vim编辑文件

2019独角兽企业重金招聘Python工程师标准>>> docker 中不能用vim编辑文件 2017年08月28日 16:54:29 阅读数&#xff1a;2061 更新来源 apt-get update 1安装vim apt-get install -y vim 转载于:https://my.oschina.net/u/3367404/blog/1923901

使用final修饰局部变量???

在编程中我们偶尔会看到如下的代码&#xff1a; public void foo(final int arg){final int localData 0;// ...}以及与之相似的代码 public void foo(int arg){int localData 0;// ...}这两段代码的主要区别就是&#xff1a;局部变量是否使用了final关键字修饰。有同学可能会…

视频编解码概述

视频编解码概述 1. 常用的基本知识 基本概念 编解码 编解码器&#xff08;codec&#xff09;指的是一个能够对一个信号或者一个数据流进行变换的设备或者程序。这里指的变换既包括将信号或者数据流进行编码&#xff08;通常是为了传输、存储或者加密&#xff09;或者提取得到…

洛谷 2759 奇怪的函数

【题解】 取个对数然后二分即可。对于一个数x&#xff0c;x^x的位数就是(int)(lg(x)*x1). 1 #include<cstdio>2 #include<cstring>3 #include<algorithm>4 #include<cmath>5 #define LL long long6 #define rg register7 #define N 2000108 using name…

区块链技术怎么构架落地应用?

自从区块链技术火爆起来之后&#xff0c;越来越多的金融机构和金融科技公司宣布探索区块链在金融上的运用&#xff0c;国内区块链技术服务商跟随金融机构的脚步&#xff0c;一方面是基于以太坊智能合约作为底层架构&#xff0c;通过提供中间层工具及协议和应用层的身份验证、证…

JVM中GC Root对象有哪些?

众所周知&#xff0c;我们目前最常用的虚拟机hotspot使用可达性分析来进行垃圾回收&#xff0c;而可达性分析需要依赖GC Root。下面我就来介绍下可以作为GC Root的对象。 &#xff08;一&#xff09;虚拟机栈中引用的对象 虚拟机栈中的引用的对象可以作为GC Root。我们程序在虚…

IPv6 解说 ,与IPv4的同异

见&#xff1a;https://baike.baidu.com/item/IPv6/172297 IPv6 IPv6是Internet Protocol Version 6的缩写&#xff0c;其中Internet Protocol译为“互联网协议”。IPv6是IETF&#xff08;互联网工程任务组&#xff0c;Internet Engineering Task Force&#xff09;设计的用于替…

USACO Training Section 5.1 Fencing the Cows 圈奶牛(凸包)

夫约翰想要建造一个围栏用来围住他的奶牛&#xff0c;可是他资金匮乏。他建造的围栏必须包括他的奶牛喜欢吃草的所有地点。对于给出的这些地点的坐标&#xff0c;计算最短的能够围住这些点的围栏的长度。 输入 输入数据的第一行包括一个整数 N。N&#xff08;0 < N < 10,…

Linux各发行版本简介

Linux的发行版本可以大体分为两类&#xff0c;一类是商业公司维护的发行版本&#xff0c;一类是社区组织维护的发行版本&#xff0c;前者以著名的Redhat&#xff08;RHEL&#xff09;为代表&#xff0c;后者以Debian为代表。 1、Redhat&#xff0c;应该称为Redhat系列&#xff…

个推应用统计产品(个数)Android集成实践

2019独角兽企业重金招聘Python工程师标准>>> 前段时间&#xff0c;我们公司的产品又双叒叕给我们提了新需求&#xff0c;要求我们把APP相关的数据统计分析一下&#xff0c;这些指标包括但不限于应用每日的新增、活跃、留存率等等&#xff0c;最好每天都能提供数据报…

JVM中安全点safePoint有哪些?

安全点是jvm选来进行GC的线程中断点。线程在执行到安全点后询问GC标志位&#xff0c;若标志位标识将要进行GC&#xff0c;则程序主动中断挂起线程等待GC。安全点的选定基本上是根据"是否具有让程序长时间执行的特征"为标准进行选定的。目前会产生安全点的主要有&…

深入理解 PHP7 中全新的 zval 容器和引用计数机制

深入理解 PHP7 中全新的 zval 容器和引用计数机制 最近在查阅 PHP7 垃圾回收的资料的时候&#xff0c;网上的一些代码示例在本地环境下运行时出现了不同的结果&#xff0c;使我一度非常迷惑。 仔细一想不难发现问题所在&#xff1a;这些文章大多是 PHP5.x 时代的&#xff0c;而…

分布式系统的架构思路

见&#xff1a;http://www.cnblogs.com/chulung/p/5653135.html 一、前言 在计算机领域&#xff0c;当单机性能达到瓶颈时&#xff0c;有两种方式可以解决性能问题&#xff0c;一是堆硬件&#xff0c;进一步提升配置&#xff0c;二是分布式&#xff0c;水平扩展。当然&#xff…

狂赌智能手机 中国互联网巨头深陷零利润困局

编者按&#xff1a;智能手机正在中国普及&#xff0c;互联网企业趋之若鹜。然而&#xff0c;在苹果、三星共享智能手机市场99%利润的大背景下&#xff0c;中国互联网企业要从所剩无几的利润空间里分一杯羹&#xff0c;注定备受煎熬&#xff0c;前路迷茫。 互联网巨头纷纷进入智…

占用较多堆外内存的区域

&#xff08;1&#xff09;Director Memory 主要在nio中会使用&#xff0c;在内存不足时会抛出OOM或者OOM:Direct buffer memory。 &#xff08;2&#xff09;线程堆栈 为每个线程分配的栈空间&#xff0c;用于保存局部变量&#xff0c;执行程序代码。内存不足时可能抛出StackO…

Oracle SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解

在Oracle中select into from不可以使用&#xff0c;用create table select代替该功能&#xff01;&#xff01;&#xff01;在Sql Server中可以正常使用。1.INSERT INTO SELECT语句语句形式为&#xff1a;Insert into Table2(field1,field2,...) select value1,value2,... from…

帆软地址栏传参,实例

自动查询&#xff1a; http://help.finereport.com/finereport9.0/doc-view-409.html参数的种类与区别&#xff1a; http://help.finereport.com/doc-view-156基本参数传递&#xff08;视频&#xff09;&#xff1a; http://bbs.fanruan.com/lesson-14.html超级链接-传递多个值…

RMI 说明

见&#xff1a;https://baike.baidu.com/item/RMI/1786244?fraladdin RMI远程方法调用 相关概述 RMI是Java的一组拥护开发分布式应用程序的API。RMI使用Java语言接口定义了远程对象&#xff0c;它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。简单地说&…