Java-重载和重写区别剖析
重载(Overload)和重写(Override)是任何一门面向对象的语言都会具有的两个特性,自然,Java语言中也具有此两种特性。但是,对于Java新手,或者没有面向对象语言经验的开发者而言,这会是两个容易混淆和迷糊的特性。本文将由浅入深,以示例代码的方式详解此两种特性的区别。
定义
重载是指一个类中具有两个或者两个以上,具有相同方法名和不同参数的方法。
重写是指两个具有相同方法名和相同参数的方法(方法签名),其中一个方法在父类中,另一个却存在于子类中。重写的机制使得对于父类中已经提供的方法,子类可以提供实现了特定逻辑的同名同参方法来屏蔽它。
重载 VS 重写
关于重载与重写,我们需要知道的重点有:
- 对于两个 重写 的方法而言,JVM会在 运行时 根据对象的实际Class类型,而不是引用该对象的变量的Class类型,来决定实际调用哪个重写的方法。同时,对于多个 重载 的方法而言,Java编译器会在 编译时 根据引用该对象的变量的Class类型,来决定调用哪个重载的方法。
- 面向对象语言的三大特性之一的 多态 就是依赖于重写机制。
- 重写方法在运行时做判断;重载方法在编译时做判断。
重写
首先,我们看一个关于重写的例子。
class Dog {
public void bark() {
System.out.println(“www.tiantianbianma.com”);
}
}
class Hound extends Dog {
public void sniff() {
System.out.println(“好好学习”);
}
public void bark() {
System.out.println(“天天编码”);
}
}
public class OverrideTest {
public static void main(String[] args) {
Dog dog = new Hound();
dog.bark();
}
}
建议读者仔细思考得出答案后,再实际上机验证答案。正确的答案是:天天编码 。
上述代码中,这个 dog 变量被声明为 Dog 类型。在代码编译时,Java编译器检查 Dog 类型是否具有 bark() 方法。因为 Dog 类是具有 bark() 方法的,所以代码能正确编译。在代码运行时,一个 Hound 类型的对象被创建,并将其引用赋值给了 dog 变量,JVM知道 dog 变量是引用到了一个 Hound 类型的对象,所以真正调用的是 Hound 类的 bark() 方法。这也就是 多态 机制的原理。
重载
首先,我们还是看一个关于重载的代码示例:
class Dog {
public void bark() {
System.out.println(“www.tiantianbianma.com”);
}
public void bark(int num) {
for (int i = 0; i < num; i++) {
System.out.println(“天天编码”);
}
}
}
在这个示例代码中,通过使用不同的调用参数,Dog 类的两个 bark 方法都可以被调用。在编译时,编译器就可以根据参数的类型或者个数等信息区分出它们,从而决定实际该调用哪个方法。
参考资料:http://www.tiantianbianma.com/java-overload-override.html/
Java-重载和重写区别剖析的更多相关文章
- JAVA基础之——三大特征、接口和抽象类区别、重载和重写区别、==和equals区别、JAVA自动装箱和拆箱
1 java三大特征 1)封装:即class,把一类实体定义成类,该类有变量和方法. 2)继承:从已有的父类中派生出子类,子类实现父类的抽象方法. 3)多态:通过父类对象可以引用不同的子类,从而实现不 ...
- java 重载、重写、重构的区别
1.重载 构造函数是一种特殊的函数,使用构造函数的目的是用来在对象实例化时初始化对象的成员变量.由于构造函数名字必须与类名一致,我们想用不同的方式实例化对象时,必须允许不同的构造方法同时存在,这就用到 ...
- java 重载、重写、构造函数详解
方法重写 1.重写只能出现在继承关系之中.当一个类继承它的父类方法时,都有机会重写该父类的方法.一个特例是父类的方法被标识为final.重写的主要优点是能够定义某个子类型特有的行为. class An ...
- Java——重载和重写
前言 在程序设计中经常会遇到对对方法的重载或者重写,下面将介绍重载和重写. 重载(Overloade) 重载出现的原因 任何程序设计语言都具备的一项重要特性就是对名字的运用.当创建一个对象时,就给对象 ...
- 深入理解Java重载与重写
我们都知道Java有三大宝,分别是:多态.封装.继承.其中多态主要体现就是重写与重载(有些人认为重载根本不属于多态)两种方式,那么今天就结合研读过JVM之后自己的理解来聊聊重载与重写的VM内部是怎么实 ...
- 一句话学Java——Java重载和重写
概念:重载是指两个不同的函数有相同的名称,可以是在本类之中的函数之间的重载,也可以是子类和父类的函数之间的函数重载. 重写:只能是子类重写父类的函数.这是多态的基础. 重写的规则: 参数:重写 ...
- java重载和重写的区别
一.重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现 ...
- 漫谈java重载与重写
重载(Overloading):为了让方法名相同而形参不同的构造方法同时存在,让类以统一的方式处理不同类型数据的一种手段 重写(Overriding):导出类对继承自基类的方法做出一定的修改,又称方法 ...
- java 重载与重写 【转】
首先我们来讲讲:重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态 ...
随机推荐
- Html介绍,认识html标签
什么是网页?网页就是我们我们提前写好的代码样式经过浏览器的渲染展示出来的样式效果.其实我们常说的上网就是浏览各式各样的网页,这些网页都是由html标签组成,下面就是一个简单的网页,效果图如下: 简单看 ...
- PPT、Word、Excel模板免费下载
本篇文章可能只有寥寥数字,但他的作用可能很大,可能帮助到很多朋友.本人喜欢搜集一些资源,也爱免费分享,因为好东西我藏不住,总感觉分享出来更快乐. 网址:https://www.bangongziyua ...
- SP10707 COT2 - Count on a tree II [树上莫队学习笔记]
树上莫队就是把莫队搬到树上-利用欧拉序乱搞.. 子树自然是普通莫队轻松解决了 链上的话 只能用树上莫队了吧.. 考虑多种情况 [X=LCA(X,Y)] [Y=LCA(X,Y)] else void d ...
- 吴裕雄--天生自然 PYTHON数据分析:所有美国股票和etf的历史日价格和成交量分析
# This Python 3 environment comes with many helpful analytics libraries installed # It is defined by ...
- windows系统安装Java(详细版)
1.下载JDK 官网下载: www.oracle.com/technetwork… 百度云下载: pan.baidu.com/s/1LGf3Podz…提取码:s6mg (官网下载步骤) 进入官网 ht ...
- 对vulnhub靶机lampiao的getshell到脏牛提权获取flag
前言: vulnhub里面的一个靶场,涉及到drupal7 cms远程代码执行漏洞(CVE-2018-7600)和脏牛提权. 靶机下载地址:https://mega.nz/#!aG4AAaDB!CBL ...
- 从首个IMO季军谈起 作者 : 付云皓
刚刚过去的IMO,中国史无前例地获得了第三名,也是自1997年来近20年首次跌出前二.感谢微信等社交软件,相信现在这个新闻已经以火箭的速度传播了. 作为一个与数学竞赛及IMO打了多年交道的人,我一直有 ...
- git pull报错you do not have permission to pull from the repository
you do not have permission to pull from the repository解决方法 使用git进行项目的版本管理,换了台电脑,配置了账号和邮箱后,pull一个项目 ...
- Android 基础知识 -- Intent
Intent (意图) Android通信的桥梁,可以通过Intent启动Activity , Service , 发送指定广播到Receiver <1> 启动Activity : sta ...
- string类型的应用场景 —— Redis实战经验
string类型是实战中应用最多的数据类型,Redis的一些特性决定了string类型的应用场景. 1. Redis的数据是共享的 如果将用户信息存储在web服务的本地缓存,则每个web服务都会缓存一 ...