从零学Java(29)之方法重载

Posted 编程界明世隐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零学Java(29)之方法重载相关的知识,希望对你有一定的参考价值。

作者简介

作者名:编程界明世隐
简介:CSDN博客专家,从事软件开发多年,精通Java、javascript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注,期待与您一起学习、成长、起飞!

导航

✪ 从零学Java系列目录索引
◄上一篇【28】数组的定义与使用
►下一篇【30】递归

引言

♀ 小AD:明哥,最近好久没看你写文章了。
♂ 明世隐:那是因为我还没上王者。
♀ 小AD:我看到了呀,不过你最近好像天天玩打野,为什么不打辅助了?
♂ 明世隐:因为我想成为野王。
♀ 小AD:野人王?
♂ 明世隐:疯了哈,皮痒是不是?
♀ 小AD:那你为什么转打野了?
♂ 明世隐:因为我玩辅助老是巨大优势被人翻盘,某些人不作为,经常白给,我受不了了?
♀ 小AD:难道这就是你最近不带我上分的原因,莫非是说我?
♂ 明世隐:把莫非两个字去掉,谢谢!
♀ 小AD:😳😳😳
♂ 明世隐:我最近想玩玩打野,主要是熟悉下打野怎么抓人的,懂抓人的套路,这样就可以更好的保护AD了呀。
♀ 小AD:看来明哥还是要我的,吓死我了。
♂ 明世隐:请注意你的言辞,明哥我是有家室的人,别调侃我,你想我死吗?
♀ 小AD:啥,你想死我了?
♂ 明世隐:挖槽,你😱,才多久没见,你就皮起来了,被关傻了?
♀ 小AD:这不都怪明哥不带上分吗?能不憋疯了吗。
♂ 明世隐:是星星太少了吧,🙄🙄
♀ 小AD:还是明哥懂我,那😄
♂ 明世隐:行行行,怕了你了,老规矩。
♀ 小AD:那今天学习点啥呢?
♂ 明世隐:方法重载
♀ 小AD:重载是什么东西
♂ 明世隐:go。。。

概念介绍

重载就是具有相同方法名,返回类型可以不同,参数个数、顺序、类型不同的方法。
Java 允许同一个类中定义多个同名方法,只要它们的形参列表不同即可。如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,这种情况被称为方法重载(overload)。

♀ 小AD:明哥,其实我没太看懂,或者说我有点懵!
♂ 明世隐:谁看都有点懵,因为我们学习的过程肯定不能光看理论呀。
♀ 小AD:哥我懂,实践出真知,实践是检验真理的唯一标准!
♂ 明世隐:哎哟,没看出来,你还是个文化人呢!
♀ 小AD:谢谢哥。
♂ 明世隐:咱们先来看看没有重载的一个实例!

无重载的一个实例代码

  1. 代码中有3个类似的方法

方法1,两个int类型相加并返回

//定义方法,两个int类型相加
public static int sumInt(int a, int b) 
   return a + b;

方法2,两double类型相加并返回

//定义方法,两个double类型相加
public static double sumDouble(double a, double b) 
    return a + b;

方法3,两个Long类型相加并返回

//定义方法,两个Long类型相加
public static Long sumLong(long a, long b) 
    return a + b;

  1. main方法,分别调用这几个方法,并将返回结果打印
public static void main(String[] args) 
    int res1 = sumInt(1, 2);
    double res2 = sumDouble(1.0, 2.0);
    Long res3 = sumLong(1L, 2L);
    System.out.println(res1);
    System.out.println(res2);
    System.out.println(res3);

  1. 完整的代码如下:
public class NoOverload 
    public static void main(String[] args) 
        int res1 = sumInt(1, 2);
        double res2 = sumDouble(1.0, 2.0);
        Long res3 = sumLong(1L, 2L);
        System.out.println(res1);
        System.out.println(res2);
        System.out.println(res3);
    

    //定义方法,两个int类型相加
    public static int sumInt(int a, int b) 
        return a + b;
    

    //定义方法,两个double类型相加
    public static double sumDouble(double a, double b) 
        return a + b;
    

    //定义方法,两个Long类型相加
    public static Long sumLong(long a, long b) 
        return a + b;
    

  1. 运行结果如下:

3
3.0
3

♀ 小AD:明哥,你这个代码很简单啊,我一看就懂。
♂ 明世隐:就懂了?
♀ 小AD:那必须的呀,之前跟明哥学了那么多,这个不就小意思吗,定义了几个差不多的方法,然后main方法调用呗。没什么难的。
♂ 明世隐:嗯,确实没什么难的,证明你之前还是用了心的。
♀ 小AD:那是当然。
♂ 明世隐:但其实代码是有些问题的。
♀ 小AD:什么问题,我咋不觉得有什么问题。
♂ 明世隐:也不能说有什么问题吧,就是说有可以优化的地方。
♀ 小AD:这个我倒是很想知道。

♂ 明世隐:你看这个3个方法是不是很类似呢?
♀ 小AD:对啊,写法差不多,都是两个相加
♂ 明世隐:如果这个类的方法有很多,是不是对应程序员来说很麻烦,我的一个个的是记住这些方法是干什么用的,或者说进到方法里面去看,这个方法干嘛用的,然后才知道我们要去调用哪个方法,是不是?
♀ 小AD:是呀
♂ 明世隐:举个例子,有3把钥匙,分别是3个房间的房门钥匙,它们都长得差不多,那得一个个去试呢?
♀ 小AD:对,要一个个的试,那如果我第一个就试中了呢?
♂ 明世隐:不要说这种特例,那如果有几十把钥匙呢?你再试试
♀ 小AD:😂😂,明哥你真坏!
♂ 明世隐:注意言辞哈,这种话很危险。
♀ 小AD:那明哥是不是有什么可以让我们不用记忆这些的写法呢?
♂ 明世隐:有,那就是方法重载,重载后就记住一个方法名就行。
♀ 小AD:那以后我就随便用啦,全个它写成重载,哈哈哈!
♂ 明世隐:那不能的,这个是有适用情况的,比如上面这种,它们是类似的方法,这个是前提,不能滥用的。
♀ 小AD:哦,我还以为可以随便重载,哈哈,会出乱子的呀。
♂ 明世隐:那肯定的,合适的才是最好的,下面看看重载是怎么写的。

重载的例子

package java0.overload;

public class Overload 
    public static void main(String[] args) 
        int res1 = sum(1, 2);
        double res2 = sum(1.0, 2.0);
        Long res3 = sum(1L, 2L);
        System.out.println(res1);
        System.out.println(res2);
        System.out.println(res3);
    

    //定义方法,两个int类型相加
    public static int sum(int a, int b) 
        return a + b;
    

    //定义方法,两个double类型相加
    public static double sum(double a, double b) 
        return a + b;
    

    //定义方法,两个Long类型相加
    public static Long sum(long a, long b) 
        return a + b;
    


运行结果:

3
3.0
3

♀ 小AD:明哥,我看你就改了个方法名
♂ 明世隐:对啊,是不是很简单。
♀ 小AD:方法名还可以重复的吗?我一直以为一个类中不能有相同的方法名。
♂ 明世隐:所以说这就是方法重载呀,java允许方法名重复。
♀ 小AD:那看起调用的时候,很方便呀,只要调用统一的方法sum就行了。
♂ 明世隐:这就是重载方便的地方,你也不需要去记住方法名,统一调用即可。
♀ 小AD:那是不是可以理解成我有一把万能钥匙,多少个房间都能开,不需要一个个的试了,那我不是发财了?
♂ 明世隐:你想什么呢你,活腻了?
♀ 小AD:我说的发财不是那个发财,意思是很爽的样子,你老了你不懂。
♂ 明世隐:听你放屁!重载有几种方式,我们来学习一下。

重载的几种方式

实例1

参数的个数不同的重载。

public class OverLoading 

	public void print()
		System.out.println("没有参数的方法print");
	
	public void print(String a)
		System.out.println("一个参数的方法print");
	
	public void print(String a,String b)
		System.out.println("2个参数的方法print");
	
	public void print(String...strs)
		System.out.println("n个参数的方法print");
	
	public static void main(String[] args) 
		OverLoading ol = new OverLoading();
		ol.print();
		ol.print("a");
		ol.print("a","b");
		ol.print("a","b","c");
	



运行:

没有参数的方法print
一个参数的方法print
2个参数的方法print
n个参数的方法print

实例2

参数的类型不同的重载

public class OverLoading2 

	public void print(String a)
		System.out.println("参数是String 类型方法");
	
	public void print(int a)
		System.out.println("参数是int 类型方法");
	
	public void print(double a)
		System.out.println("参数是double 类型方法");
	
	public static void main(String[] args) 
		OverLoading2 ol = new OverLoading2();
		ol.print("a");
		ol.print(1);
		ol.print(3.14);
	


运行:

参数是String 类型方法
参数是int 类型方法
参数是double 类型方法

实例3

参数的类型和个数混合重载。

public class OverLoading2 

	public void print(String a)
		System.out.println("参数是String 类型方法");
	
	public void print(int a)
		System.out.println("参数是int 类型方法");
	
	public void print(int a,int b)
		System.out.println("2个参数是int 类型方法");
	
	public void print(double a)
		System.out.println("参数是double 类型方法");
	
	public static void main(String[] args) 
		OverLoading2 ol = new OverLoading2();
		ol.print("a");
		ol.print(1);
		ol.print(1,2);
		ol.print(3.14);
	

运行:

参数是String 类型方法
参数是int 类型方法
2个参数是int 类型方法
参数是double 类型方法

实例4

想通过不同返回值来重载,会得到编译错误,是不被允许的。

实例5

main方法能被重载吗?答案是可以的,但是只有

public static void main(String[] args)

会被虚拟机识别为入口方法,其他的只是作为普通方法来使用。

public class OverLoading4 

	public static void main(String[] args) 
		System.out.println("main String[]");
	

	public static void main(String a) 
		System.out.println("main String");
	


运行结果:

main String[]

可以看到只有public static void main(String[] args)被执行了,当然我们按照普通方法来调用是没有问题的。

public class OverLoading4 

	public static void main(String[] args) 
		System.out.println("main String[]");
		//调用普通方法main(String)
		main("a");
	

	public static void main(String a) 
		System.out.println("main String");
	

运行结果:

main String[]
main String

给小AD举例

♀ 小AD:明哥,这么详细吗,我感觉今天学的很爽啊。
♂ 明世隐:真的爽吗?
♀ 小AD:爽
♂ 明世隐:待会让你更爽。
♀ 小AD:感觉被嫂子听到你要完蛋了。
♂ 明世隐:我不怕,给你看看我的例子你就知道我怕不怕了。
♀ 小AD:那看看咯!

public class OverloadDemo 
    public static void main(String[] args) 
        killAD(1);
        killAD(1.0);
        killAD(1L);
    

    //击杀小鲁班的方法1 
    public static void killAD(int type) 
        System.out.print("小鲁班之死方式" + type);
        System.out.println(":凯开大,正面2闪到鲁班脸上一刀劈死!");
    

    //击杀小鲁班的方法2
    public static void killAD(double type) 
        System.out.print("小鲁班之死方式" + type);
        System.out.println(":凯后面包抄,开大,2技能到鲁班脸上一刀劈死!");
    

    //击杀小鲁班的方法3
    public static void killAD(Long type) 
        System.out.print("小鲁班之死方式" + type);
        System.out.println(":凯在草丛,直接2技能到鲁班脸上一刀劈死!");
    

运行结果:

小鲁班之死方式1:凯开大,正面2闪到鲁班脸上一刀劈死!
小鲁班之死方式1.0:凯后面包抄,开大,2技能到鲁班脸上一刀劈死!
小鲁班之死方式1.0:凯后面包抄,开大,2技能到鲁班脸上一刀劈死!

♂ 明世隐:例子怎么样?看懂了吗。
♀ 小AD:就小鲁班的一百种死法呗,就差拿皮鞭抽我了。
♂ 明世隐:不不不,我就写了3种😂😂
♀ 小AD:我觉得你可以写100种的,只要你想。
♂ 明世隐:只要我想?我怕你会哭!
♀ 小AD:😠😠😠
♂ 明世隐:能看明白不?重载理解了吗?
♀ 小AD:都这么深刻了,不理解那我怕不是傻子了吗。
♂ 明世隐:行,那上工吧。
♀ 小AD:终于来了,go!

小结

这节学习了“ 方法重载 ”,希望能对大家有所帮助,请各位小伙伴帮忙 【点赞】+【收藏】+ 【评论区打卡】, 如果有兴趣跟小明哥一起学习Java的,【关注一波】不迷路哦。

评论区打卡一波让我知道你,明哥会持续关注你的学习进度哦!

导航

✪ 从零学Java系列目录索引
◄上一篇【28】数组的定义与使用
►下一篇【30】递归

热门专栏推荐

【1】Java小游戏(俄罗斯方块、飞机大战、植物大战僵尸等)
【2】JavaWeb项目实战(图书管理、在线考试、宿舍管理等)
【3】JavaScript精彩实例(飞机大战、贪吃蛇、验证码等)
【4】Java小白入门200例
【5】从零学Java、趣学Java
【6】Idea从零到精通

以上是关于从零学Java(29)之方法重载的主要内容,如果未能解决你的问题,请参考以下文章

从零学Java(30)之递归

从零学Java(28)之数组的定义与使用

从零学Java(31)之构造方法

从零学Java(31)之构造方法

从零学Java(31)之构造方法

从零学Java(30)之递归