java 可以重载等于号码_Java面试之Java基础4——重载与重写的区别

目录

重载与重写的概念

重载与重写的区别

重载与重写的总结

构造器是否能被重写override

为什么函数不能根据返回类型来区分重载

重载与重写的概念

重载:同样一个方法可以根据输入参数列表的不同,做出不同的处理。普通方法和构造器方法都能够重载。

方法重载:

/**

* 重载方法

*/

public class Print {

public void print(String str) {

System.out.println(str);

}

public void print(Integer i) {

System.out.println(i);

}

public void print(Float f) {

System.out.println(f);

}

public void print(Boolean b) {

System.out.println(b);

}

}

构造器重载

/**

* 重载构造器

*/

public class Print {

Print(String str){

System.out.println(str);

}

Print(Integer i){

System.out.println(i);

}

Print(Float f){

System.out.println(f);

}

public void print(Boolean b) {

System.out.println(b);

}

}

重写:重写是要在子类继承父类的同名方法时,当输入参数列表一样时,要做出不同于父类的逻辑功能,就是覆盖重写父类方法。注意:重写的方法上有一个@Override,表示该方法被重写了。

/**

* 方法重写

*/

class Father {

public void print(){

System.out.println("Father");

}

public void print(String str){

System.out.println("Father -> "+str);

}

}

class Son extends Father {

// 重写print()方法

@Override

public void print() {

System.out.println("Son");

}

// 重写print(String str)方法

@Override

public void print(String str) {

System.out.println("Son -> "+str);

}

}

重载与重写的区别

重载的注意事项:发生在同一个类中,方法名必须相同。

方法重载与下列因素相关:

1. 参数个数不同

2. 参数类型不同

3. 参数的多类型顺序不同

方法重载与下列因素无关:

1. 与参数的名称无关

2. 与方法的返回值类型无关

下面是错误示例:

9dcd13af4b75d67933f2ba63472cf445.png

上面这句话严格来说是错误的,因为参数个数相同,但可以是类型不同

517d13f8f2e8b504351d528b0516b5c2.png

下面是参数个数相同,参数类型相同,但是顺序不同。

02c82d08d279c78f58954f1a8059d4d7.png

参数名称即使不同,但参数类型、参数列表、参数个数相同,也会报错

bba04bba6a61a57f6a85bfa77973af70.png

即使返回类型不同,但方法名相同,参数类型、参数列表、参数个数相同,也会报错

1ba94b15039601fabe22926cf1d7c5bf.png

重写注意事项:发生在运行期,是两个及以上的类,是子类对父类允许访问的方法进行重新编写。方法名、参数列表、参数顺序必须相同,子类方法返回值类型比父类方法返回值类型更小或相等。

抛出异常范围小于等于父类,访问修饰符范围大于等于父类。

如果父类方法访问修饰符为private/final/static,则子类不能重写该方法,但是被static修饰的方法能够被再次声明。

构造方法无法被重写

重写的方法上有一个@Override表示该方法被重写了。

下面是关于重写特点的代码解释。

1、抛出异常范围小于等于父类

子类抛出异常范围等于父类抛出异常范围,不会报错。

43a826910d6f67664a8b8be50b267f41.png

子类抛出异常范围小于父类抛出异常范围,不会报错。

e324343b40572698694887000060d011.png

子类抛出异常范围大于父类抛出异常范围,会报错。

f38179688ee0d4e1806ae0d80fb67ee5.png

2、访问修饰符范围大于等于父类

访问修饰符的范围:public > protected > private

子类访问修饰符的范围大于父类访问修饰符的范围,不会报错

a0d1ea033be3d93f59ad9d2df5d168bb.png

子类访问修饰符的范围等于父类访问修饰符的范围,不会报错

bb24009d98b46c456d7ce33f5726344f.png

子类访问修饰符的范围小于父类访问修饰符的范围,会报错

567ee204e48d1f1d6e954c66e783f463.png

3、如果父类方法访问修饰符为private/final/static,则子类不能重写该方法,但是被static修饰的方法能够被再次声明。

使用private修饰的无法重写

d3b49fbf353c5b7fbaffa286736cf142.png

使用final修饰的无法重写

a93d756a8080ae8447ac966e037e2a59.png

使用static修饰的不能重写,但能被再次声明

ad70d0bb4051171b636dd9b7ef0f8bb4.png

下面的代码也不能称之为重写:当向上转型时,调用的还是父类的方法。

class Father {

static void print() {

System.out.println("Father");

}

}

class Son extends Father {

static void print() {

System.out.println("Son");

}

}

public class Demo {

public static void main(String[] args) {

Son.print();

Father son=new Son();

son.print();

}

}

/*

* 打印结果:

* Son

* Father

*/

在Java中,如果父类含有一个静态方法,且在子类中也含有一个返回类型,方法名、参数列表等都与之相同的的静态方法,在子类中只是对父类的该同名方法进行隐藏,并不是重写。父类与子类含有的其实是两个没有关系的方法,两者的行为不具有多态性。

在上面的例子中,print方法与类发生了关联,但它不在乎什么类型的类正在创建它,而仅在乎引用的类型。在Father son = new Son()中,son是类Son在内存中的一个Father类型的引用,如果一个static修饰的方法被调用了,JVM不会检查什么类型正在指向它,只会调用与Father类相关联的方法的实例。

4、⼦类⽅法返回值类型应⽐⽗类⽅法返回值类型更⼩或相等

如果⽅法的返回类型是void和基本数据类型,则返回值重写时不可修改。但是如果⽅法的返回值是引⽤类型,重写时是可以返回该引⽤类型的⼦类的。

class Father {

public String print() {

return "Father";

}

}

class Son extends Father {

@Override

public String print() {

return "Son";

}

public Father father(){

return new Father();

}

}

class SonSon extends Son {

@Override

public String print() {

return "SonSon";

}

@Override

public Father father() {

return new Son();

}

}

重载与重写的总结

重载重写概念发生在一个类中。一个方法根据输入参数列表的不同,做出不同的逻辑处理。普通方法和构造器都能够重载发生在子类和父类中。子类方法继承父类的同名方法,重新写方法的处理逻辑。普通方法能够重写,构造器不能够重写。

特征普通方法重载方法名相同;构造器重载与类名相同。重写的方法上有一个@Override注解,表示该方法被重写了。

相关因素方法重载与参数个数、参数类型、多类型参数的顺序的不同相关。(即方法的参数列表要不一样)方法重写与参数个数、参数类型、多类型参数的顺序的相同相关。(即方法的参数列表要一样)

不相关因素方法重载与参数的名称、方法的返回值类型无关。(即重载方法的参数名称、返回值类型是否一样不重要)方法重写的参数名称可以改变,但返回值类型要小于等于父类方法的返回值类型。

其他可以抛出不同的异常,可以有不同修饰符。子类抛出的异常范围要小于等于父类,访问修饰符的范围要大与等于父类。如果父类方法被private/final/static修饰,那么子类不能重写该方法。

构造器是否能被重写override

构造器Constructor 不能被 override(重写),但是可以 overload(重载),所以你可以看到⼀个类中有多个构造函数的情况。

88367d6717a2d8dd62fc07ffb1f24641.png

构造器可以重载

96935c54368835ad8543bbfaf2b67213.png

为什么函数不能根据返回类型来区分重载

为什么不能根据返回类型来区分重载?因为调用时不能指定类型信息,编译器不知道你要调用哪个函数。

2597cfd53886646ef5543461afa907df.png

当执行add(1, 2)这个方法时,不需要保存返回值,那么该调用哪个方法呢?这很好不区分吧。

如果需要返回值,比如说float sum = add(1, 2);还好区分些,至少可以根据前面的float推断出要调用哪个方法。但如果不需要返回值,那么几乎难以区分。

如果方法的返回值不加以利用,那么返回值将毫无用处,自然无法作为区别的标准。

更多的适合方法的返回值是函数运行后的一个结果,是方法的调用者和被调用者通信的关键,并不能作为某个方法的唯一标识。

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

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

相关文章

二维数组、多维数组

二维数组: 定义二维数组 int[,] myArray new int[几个一维数组,数组中的个数]; 数组可以具有多个维度。例如,下列声明创建一个四行两列的二维数组(可以理解为4个1维数组,数组中包含2个元素): int[,] myArray new int[4,2]; int[…

一张大图片有多个小图片

这个页面也是我看到别人的写的,感觉不错,就自己留下了为了以后自己可以容易找到,也希望可以方便到别人。 写这个页面 需要注意的是: 1.写每一个小图片的位置时候,要用id,这样等级就高了,不然不起作用。 2.因…

Android Studio混淆

这一篇说一下Android Studio的代码混淆: 第一步:要想使混淆生效,要修改项目(App)下的build.gradle一处内容:minifyEnabled 的值 设置为true,当前项目就可以使用混淆了。 apply plugin: com.and…

Java 8:测试Lambda水

Java 8大约有一年的时间了,它具有我非常期待的语言功能: Lambda Expression 。 令人遗憾的是,另一个重要功能Java平台模块已延迟到Java9。但是,将lambda表达式(或闭包)添加到该语言中将使Java编程变得更好。…

基于阀值的工作流引擎设计

最近在做工作流处理流程部分的工作,顺便研究了一下工作流引擎的一些设计理念和原理。由于以前接触过人工智能神经网络的一些东西,发现工作流引擎和神经网络还是颇有一些相似之处,都是满足一定的条件下向下一个节点传递。在神经网络的神经元中…

Git之安装管理

1.Git安装部署 Git是分布式的版本控制系统,我们只要有了一个原始Git版本仓库,就可以让其他主机克隆走这个原始版本仓库,从而使得一个Git版本仓库可以被同时分布到不同的主机之上,并且每台主机的版本库都是一样的,没有主…

Java执行程序服务类型

ExecutorService功能是Java 5附带的。它扩展了Executor接口,并提供了线程池功能来执行异步简短任务。 使用Java 6提供的ExecutorService接口有五种异步执行任务的方法。 ExecutorService execService Executors.newCachedThreadPool(); 这…

MySQL的主动优化和被动优化_MySQL“被动”性能优化汇总!

年少不知优化苦,遇坑方知优化难。 ——村口王大爷本文内容导图如下:我之前有很多文章都在讲性能优化的问题,比如下面这些:当然,本篇也是关于性能优化的,那性能优化就应该一把梭子吗?还是要符合一…

python2

一、管理库的安装 安装pip 提示报错:安装pip提示No module named setuptools Windows环境下Python默认是没有安装setuptools这个模块的,这也是一个第三方模块。下载地址为http://pypi.python.org/pypi/setuptools。下载后直接运行ez_setup.py 参考地址&…

【图】最短路径——Floyed算法和Dijkstra算法

最短路径问题(floyed.cpp dijkstra.cpp) 题目描述平面上有n个点(n<100)&#xff0c;每个点的坐标均在-10000&#xff5e;10000之间。其中的一些点之间有连线。若有连线&#xff0c;则表示可从一个点到达另一个点&#xff0c;即两点间有通路&#xff0c;通路的距离为两点间的…

Java并发– CyclicBarrier示例

Java中的CyclicBarrier是JDK 5中java.util.Concurrent包中引入的同步器&#xff0c;以及其他并发实用程序&#xff08;如Counting Semaphore &#xff0c; BlockingQueue &#xff0c; ConcurrentHashMap等&#xff09;。CyclicBarrier与CountDownLatch类似&#xff0c;我们在上…

JasperReports JSF插件用例–简单列表报告

这是JasperReports JSF插件系列的第一篇“用例文章” &#xff0c;我将专注于一个简单的需求&#xff0c;并且我将进一步深入。 起点是我们已经为图书商店完成的项目设置&#xff0c;我将向其中添加一个列表&#xff0c;其中包含在数据库中注册的其他图书&#xff0c;该列表也将…

ER图流程图

ER图&#xff1a;ER图分为实体、属性、关系三个核心部分。实体是长方形体现&#xff0c;而属性则是椭圆形&#xff0c;关系为菱形。 图书馆管理系统流程图&#xff08;图片源于网上&#xff09;&#xff1a;对于程序员来说&#xff0c;我们要知道&#xff1a;整个系统中&#x…

php源码仿三一重工,织梦仿三一重工业大学气企业网站php源码

★模板引荐★源码称呼&#xff1a;仿三一重工业大学气企业网站php源码仿三一重工业大学气企业网站php源码&#xff0c;尝试完备无错&#xff0c;兼容合流欣赏器。模板包括安置证明&#xff0c;并包括尝试数据。本模板鉴于DEDECms 5.7 GBK安排&#xff0c;须要 UTF-8版本的请本人…

php树莓派魔镜,用树莓派和显示器制作一面“魔镜”

所需要的材料一台显示器一块和显示器大小相同的双面镜一些2*4米的细木条树莓派机器必要组件(电源、HDMI线、usb无线网卡、键盘)木工工具(锯子、磨砂机、螺丝刀)螺丝、液态钉子选一个合适的显示器镜子的大小完全由显示器的类型和大小决定&#xff0c;所以我希望得到一个尽量大的…

【数字图像处理】[3]--直方图规范化

【数字图像处理】[3]--直方图规范化直方图规范化出现的原因是因为直方图均衡只能产生出固定的图像&#xff0c;不满足于需求&#xff0c;有时我们需要让直方图变成特定的直方图&#xff0c;于是有了直方图规范化原理&#xff1a;可能只看公式没什么感觉&#xff0c;我们来举一个…

JavaFX 2.0布局窗格– GridPane

毫无疑问&#xff0c; GridPane是JavaFX 2.0中功能最强大&#xff0c;最灵活的布局窗格。 它在由行和列组成的灵活网格中布置其子项&#xff0c;与Swing的GridBagLayout或HTML的表格模型非常相似。 这种方法使该窗格非常适合于任何形式的表单&#xff08;例如网站上的联系表单&…

java ui自动化测试脚本,如何用Airtest编写UI自动化脚本(示例代码)

前言游戏并不像app一样直接把渲染树节点暴露出来&#xff0c;这就造成游戏UI自动化在元素定位上的不方便性&#xff0c;不过依赖airtest的图片识别&#xff0c;我们可以直接跳过元素检查&#xff0c;以图片对比的形式进行自动化&#xff0c;虽然效率可能会低一些&#xff0c;但…

django实现瀑布流、组合搜索、阶梯评论、验证码

django实现图片瀑布流布局 我们在一些图片网站上经常会看到&#xff0c;满屏都是图片&#xff0c;而且图片都大小不一&#xff0c;却可以按空间排列。默认一个div是占用一行&#xff0c;当想把div里的图片并排显示的时候&#xff0c;只能使用float属性&#xff0c;但是&#xf…

带有docx4j的Java Word(.docx)文档

几个月前&#xff0c;我需要创建一个包含许多表和段落的动态Word文档。 过去&#xff0c;我曾使用POI来实现此目的&#xff0c;但是我发现它很难使用&#xff0c;并且在创建更复杂的文档时对我来说效果不佳。 因此&#xff0c;对于这个项目&#xff0c;经过一番搜索&#xff0c…