Java中方法的使用详解

1.引言

假设有一个美女博主,每次发的照片都特别漂亮
在这里插入图片描述

然后该博主的评论区每次都会有很多粉丝的评论:
哇!宝宝好漂亮,求上衣链接!!!
老婆亲亲!这个口红是什么色号呀?
宝宝迷死我啦!听说宝宝超级聪明,让我来考你一个问题:你的微信号多少……
每次博主都会非常热情的回复粉丝们的评论,但是由于粉丝数量很多,而且很多粉丝问的问题都一样,于是,博主逐渐失去耐心
在这里插入图片描述

但是博主还是很疼粉丝的,冷静下来之后,博主想到了一个方法:
她专门发了一个视频,里面主要介绍了每次出镜穿的衣服,以及自己经常用的化妆品的购买平台和店铺信息。
这么一来,她就不用再花费那么大功夫去依次回复每个粉丝的消息了。
从这个过程中我们可以看到:

  1. 博主将粉丝普遍的问题整理成了一个视频,减少了很多重复性回复,然后就有更多的时间来处理自己的事情了。
  2. 喜欢博主衣服的粉丝,直接去看那个视频,就可以知道去哪里买那件衣服了。
  3. 由于博主的粉丝很多,她不一定每条评论都会及时回复,那粉丝可能就会一直评论,但是这样一来,粉丝就可以自行去看那个视频,也省去了很多重复性的事情。

在编程中也是一样,某段代码的功能可能会频繁使用到,如果在每个位置都重新实现一遍:
1.会使程序变得繁琐
2.开发效率低下,做了大量重复性的工作
3.不利于维护,需要改动时,所有遇到该段代码的位置都需要修改
4.不利于复用
因此,在编程中,我们也可以将频繁使用的代码封装成 " 方法 " ,需要用时直接拿来使用即可,避免写很多相同的代码。

2.方法的概念及使用

2.1 什么是方法(method)

方法就是一个代码片段,类似于C语言的函数。

方法存在的意义:
1.能够模块化的组织代码(当代码规模比较负责的时候)
2.做到一份代码可以在多个位置使用
3.让代码更好理解

比如,现在要开发一款日历,在日历中经常要判断一个年份是否为闰年,则有如下代码:

//判断闰年的代码
int year = 1900;
if ((year % 4 == 0 || year % 100 != 0) || year % 400 == 0){System.out.println("是闰年");
}else {System.out.println("不是闰年");
}

那方法该如何定义?

1.2 方法的定义

方法语法格式

//方法定义
修饰符 返回值类型 方法名称(参数类型 形参...){方法体代码;return 返回值
}

1.实现一个判断年份是否为闰年的方法:

public class Method{public static boolean isLeapYear(int year){if ((year % 4 == 0 || year % 100 != 0) || year % 400 == 0){return true;}else {return false;}}
}

2.实现一个两个整数相加的方法:

public class Method{public static int add(int a, int b){return a + b;}
}

注意事项:

  • 返回值类型:如果方法有返回值,返回值类型必须要和最后返回的那个值的类型一致;如果没有返回值,必须写成void.
  • 方法名字:用小写.
  • 参数列表:如果方法中没有参数,括号中什么都不写,如果有参数,需要写上参数类型,多个参数之间用逗号隔开.
  • 方法体:方法内部要执行的语句
  • 在Java中,方法必须写在类当中;方法不能嵌套定义;没有方法声明一说

1.3 方法调用的执行过程

方法调用过程
调用方法–>传递参数–>找到方法地址–>执行被调方法的方法体–>被调方法结束返回–>回到主调方法继续往下执行
注意事项

  • 定义方法的时候,不会执行方法的代码,只有调用的时候才会执行
  • 一个方法可以被调很多次

1.4实参和形参的关系

形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值

  1. 在Java中,实参的值会拷贝到形参中,形参和实参本质是两个实体。
public static int add(int a, int b){return a + b;
}
add(2,3);//2和3是实参,在调用时传给形参a和b

交换两个整型变量:

public class Test2 {public static void swap(int x, int y){int tmp = x;x = y;y = tmp;System.out.println("x = " + x + " y = " + y);}//输出 x = 20 y = 10public static void main(String[] args) {int a = 10;int b = 20;swap(a,b);System.out.println("a = " + a + " b = " + b);}//输出 a = 10 b = 20
}

可以看到,在swap函数交换之后,形参x 和 y的值发生了变化,但是main方法中的a 和 b还是交换之前的值,并没有交换成功。
原因分析:
实参a 和 b是main方法中的两个变量,它们存放在main方法的栈中,而形参x 和 y是swap方法中的两个变量,x 和 y存放在swap方法运行时的栈中,因此,实参a 和 b与形参x 和 y是两个没有任何关联的变量。
在swap方法调用时,只是将实参a 和 b中的值拷贝了一份传递给了形参x 和 y,因此对形参x 和 y操作不会对实参a 和 b产生任何影响。
注意 :对于基础类型来说,形参相当于实参的拷贝,即传值调用。
解决办法:传引用类型参数(例如数组来解决这个问题)

public class Test2 {public static void swap(int[] array){int tmp = array[0];array[0] = array[1];array[1] = tmp;}public static void main(String[] args) {int[] array = {10,20};swap(array);System.out.println("array[0] = " + array[0] + " array[1] = " + array[1]);}//输出array[0] = 20 array[1] = 10
}

2. 方法重载

2.1 为什么方法需要重载

请看下面的两个方法:

public class MethodTest {//返回值是int,两个形参的类型也是intpublic static int add(int x, int y){return  x + y;}public static void main(String[] args) {//两个整型相加int a1 = 10;int b1 = 20;int ret1 = add(a1,b1);System.out.println(ret1);//两个double类型相加double a2 = 10.0;double b2 = 20.0;double ret2 = add(a2,b2);System.out.println(ret2);}
}

这个代码会编译出错,提示信息如下:
在这里插入图片描述
由于参数类型不匹配,所以double类型的相加不能使用现有的add方法,有一种比较简单粗暴的方法,就是再写一个方法:

public class MethodTest {//返回值是int,两个形参的类型也是intpublic static int add(int x, int y){return  x + y;}//返回值是double,两个形参的类型也是doublepublic static double addDouble(double x, double y){return x + y;}public static void main(String[] args) {//两个整型相加int a1 = 10;int b1 = 20;int ret1 = add(a1,b1);System.out.println(ret1);//两个double类型相加double a2 = 10.0;double b2 = 20.0;double ret2 = addDouble(a2,b2);System.out.println(ret2);}
}

虽然上述代码可以解决我们的问题,但麻烦的是这样一来,就需要提供很多不同的方法名,而且方法名多了我们脑壳的昏了,本质都是加法,还要为了适应不同的数据类型搞出那么多花里胡哨的的名字。所以一气之下,我们可以冷静下来慢慢写……
在这里插入图片描述

开玩笑的,或许我们可以将这些名字都统一为add!

2.2 方法重载概念

在Java中,可以有多个方法的名字相同,而参数列表不同的情况,我们将这种情况称为重载.

public class MethodTest {//返回值是int,两个形参的类型是intpublic static int add(int x, int y){return  x + y;}//返回值是double,两个形参的类型是doublepublic static double add(double x, double y){return x + y;}//返回值是double,三个形参的类型是doublepublic static double add(double x, double y,double z){return x + y + z;}public static void main(String[] args) {add(1,2); //调用add(int x, int y)add(1.5,2.5); //调用add(double x, double y)add(1.5,2.5,3.5); //调用add(double x, double y,double z)}
}

重载的规则:

  1. 方法名必须相同
  2. 参数列表必须不同(参数的个数不同,参数的类型不同,类型的次序必须不同)
  3. 与返回值类型是否相同无关
    如果两个方法仅仅只是因为返回值类型不同,是不能构成重载的:
public class MethodTest {//返回值是int,两个形参的类型是intpublic static int add(int x, int y){return  x + y;}//返回值是double,两个形参的类型是intpublic static double add(int x, int y){return x + y;}public static void main(String[] args) {add(1,2);}
}

上述的代码会出现编译错误,错误提示如下:
在这里插入图片描述
这是由于编译器在编译代码时,会对实参类型进行推演,根据推演的方法来决定调用哪个方法。

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

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

相关文章

【go】内存分配模型

内存是怎么分配给对象的? 内存分配优化的地方是? 讲讲golang内存分配模型? ans: 1.按照对象的大小分配:先算出对象的大小如果是tiny对象,就从tiny block中获取地址和偏移量,将对象打包到mcache;如果是16B以…

Python 在Excel中应用和取消多种不同类型的数据筛选

目录 安装Python Excel处理库 Python 在 Excel 中应用文本筛选 Python 在 Excel 中应用数字筛选 Python 在 Excel 中应用字体颜色、单元格颜色或图标集筛选 Python 在 Excel 中应用日期筛选 Python 在 Excel 中应用动态日期筛选 Python 在 Excel 中筛选空单元格或非空单…

【ArcGIS Pro第一期】界面简介

ArcGIS Pro简介 ArcGIS Pro界面简介1.1 打开工程1.2 使用功能区上的工具 参考 ArcGIS Pro 是一种基于功能区的应用程序。 ArcGIS Pro 窗口顶部的功能区有许多命令可供选择,而根据需要打开的各个窗格(可停靠窗口)中则提供了更为高级或专用的功…

快速排序(QuickSort)-归并排序(MergeSort)[java编写]

1. 快速排序 1.1 基本概述 快速排序采用分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot 将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用…

参会邀请 | 第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)

第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)将于2024年9月13日-15日在中国张家口召开。 MVIPIT 2024聚焦机器视觉、图像处理与影像技术,旨在为专家、学者和研究人员提供一个国际平台,分享研究成果,讨论…

算法训练营——day3长度最小子数组

1 长度最小子数组-力扣209(中等) 1.1 题目: 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返…

基于orangePi的智能家居系统

目录 一.接线图 1.orangePi接线 2.继电器接线 二.语音模块的配置 1.pin脚的配置 2.命令词自定义信息 三.测试 1.通过gpio指令测试烟雾检测器是否正确连接 2.编写脚本测试其他模组接线是否正常 四.人脸识别方案 1.首先开通人脸搜索识别服务 2. 点击产品控制台,向人…

2024年四川省安全员B证证考试题库及四川省安全员B证试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2024年四川省安全员B证证考试题库及四川省安全员B证试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试大…

ARM----时钟

时钟频率可以是由晶振提供的,我们需要高频率,但是外部接高的晶振会不稳定,所有使用PLL(锁相环)来放大频率。接下来就让我们学习用外部晶振提供的频率来配置时钟频率。 一.时钟源的选择 在这里我们选择外部晶振作为时钟…

数据库面试题学习

B树和B树 B树 排好序的 节点内部有多个元素 B树 排好序的 节点内多个元素 叶子节点有指针(双向指针) 非叶子节点冗余了一份在叶子节点 mysql定义B树 InnoDB B树是B树的升级版~ InnoDB b树是怎么产生的 mysql 页 目录 16KB 自增id uuid 一页最多可以存储…

【精选】文件摆渡系统:跨网文件传输的安全与效率之选

文件摆渡系统可以解决哪些问题? 文件摆渡系统(File Shuttle System)主要是应用于不同网络、网段、区域之间的文件数据传输流转场景, 用于解决以下几类问题: 文件传输问题: 大文件传输:系统可…

Windows bat脚本学习九(srec_cat)

一、简介 srec_cat是一个在嵌入式开发中,使用非常频繁的软件,这里做个常用功能的介绍。 二、常用参数 文件类型 在使用srec_cat指令时,在输入文件和输出文件时,要指明文件的类型,如: input.hex -intel …

2024国赛数学建模C题完整论文:农作物的种植策略

农作物种植策略优化的数学建模研究(完整论文,持续更新,大家持续关注,更新见文末名片 ) 摘要 在本文中,建立了基于整数规划、动态规划、马尔科夫决策过程、不确定性建模、多目标优化、相关性分析、蒙特卡洛…

网络层 VII(IP多播、移动IP)【★★★★★★】

一、IP 多播 1. 多播的概念 多播是让源主机一次发送的单个分组可以抵达用一个组地址标识的若干目的主机,即一对多的通信。在互联网上进行的多播,称为 IP 多播(multicast , 以前曾译为组播)。 与单播相比,在一对多的…

Linux_kernel移植uboot07

一、移植 根据硬件平台的差异,将代码进行少量的修改,修改过后的代码在目标平台上运行起来 移植还需要考虑硬件环境,驱动只需要考虑内核的环境 二、移植内容 1、移植Uboot uboot属于bootloader的一种,还有其他的bootloader&#x…

【超简单】1分钟解决ppt全文字体一键设置

省流 ppt的全部字体需要在“幻灯片母版”里面,“自定义字体”去设置好标题与正文的字体之后才算全部设置完毕 “视图”---“幻灯片母版” 找到“字体”---“自定义字体” 设置好中文和西文的字体,都可以按照自己的选择来,保存即可 吐槽 之…

通信工程学习:什么是FEC前向纠错

FEC:前向纠错 FEC(Forward Error Correction,前向纠错)是一种增加数据通信可信度的技术,广泛应用于计算机网络、无线通信、卫星通信等多种数据传输场景中。其基本原理和特点可以归纳如下: 一、FEC前向纠错…

固态硬盘装系统有必要分区吗?

前言 现在的新电脑有哪一台是不使用固态硬盘的呢?这个好像很少很少了…… 有个朋友买了一台新的笔记本电脑,开机之后,电脑只有一个分区(系统C盘500GB)。这时候她想要给笔记本分区…… 这个真的有必要分区吗&#xf…

golang关于slice map函数传参的小问题

问题 函数传参了一个slice,在函数内触发了对长度的修改(添加或删除),但是未影响函数外的实参由此产生了另一个问题,我们用map在函数内修改会不会有影响不到实参的情况? 结论 map作为函数参数时是引用传递…