【JAVA入门】Day04 - 方法
【JAVA入门】Day04 - 方法
文章目录
- 【JAVA入门】Day04 - 方法
- 一、方法的格式
- 1.1 无参无返回值的方法定义和调用
- 1.2 带参数的方法定义和调用
- 1.3 形参和实参
- 1.4 带返回值的方法定义和调用
- 1.5 方法的注意事项
- 二、方法的重载
- 三、方法的使用
- 四、方法的内存原理
- 4.1 方法调用的基本内存原理
- 4.2 方法传递基本数据类型的内存原理
方法(methond)是程序中最小的执行单元。在编写程序时,我们将重复的代码、具有独立功能的代码抽取到方法中,从而节省大量的代码量,提高代码的复用性、可维护性。
一、方法的格式
把一些代码打包在一起,这个过程叫做方法定义。
方法定义后不是直接运行的,需要手动调用才能执行,这个过程称为方法调用。
1.1 无参无返回值的方法定义和调用
定义格式:
public static void 方法名(){方法体(打包代码);
}
调用格式:
方法名();
1.2 带参数的方法定义和调用
定义格式:
public static void 方法名(参数1, 参数2, ...){方法体(打包代码);
}
调用格式:
方法名(参数1, 参数2, ...);
注意:在传递参数时,参数的数据类型也要和定义时的数据类型一一对应。
1.3 形参和实参
形参就是形式参数,即方法定义中的参数。
实参就是实际参数,即方法调用中的参数。
public static void main(String[] args) {getSum(10, 20);}public static void getSum(int num1, int num2) {System.out.println(num1 + num2);}
以上方的代码为例,10 20 是实参,num1 num2 是形参,它们的数据类型需要一一对应。
【例1】求出⚪的面积。
需求:定义一个方法,求圆的面积,将结果打印于方法。
public static void main(String[] args) {getArea(1.5);}public static void getArea(double r) {double pi = 3.1415926;double area = pi*r*r;System.out.println(area);}
1.4 带返回值的方法定义和调用
带返回值的方法在执行完毕后,可以将最终运行结果返回。为了在调用处拿到方法产生的结果,就需要定义带有返回值的方法。
定义格式:
public static 返回值类型 方法名(参数1, 参数2, ...){方法体(打包代码);return 返回值;
}
注意:有返回值的函数需要指定返回值类型(类型不为 void),并且函数体内一定要有 return 语句,用于返回值的返回。
例:
public static int getSum(int a, int b) {int c = a + b;return c;
}
调用格式:
- 直接调用:
方法名(实参);
直接调用的方法是不接收返回值,而是单纯执行这个方法。
- 赋值调用:
变量类型 变量名 = 方法名(实参);
赋值调用是用一个变量接收返回值并存储下来留作备用。
- 输出调用:
System.out.println(方法名(实参));
输出调用是将方法的运行结果直接放到打印语句中,这样可以直接打印在控制台。
【例2】定义方法,比较两个长方形的面积。
public static void main(String[] args) {double rec1,rec2;rec1 = getArea(1,2);rec2 = getArea(3,4);if(rec1 > rec2) {System.out.println("rec1面积大");}else if(rec1 == rec2) {System.out.println("两个面积一样大");}else {System.out.println("rec2面积大");}}public static int getArea(double w, double h) {double area = w*h;return area;}
以上就是一个方法体完整的定义和调用格式。
1.5 方法的注意事项
- 方法不调用就不会执行
- 方法与方法之间是平级关系,不能互相嵌套定义,但可以嵌套调用。
- 方法的编写顺序与运行顺序无关。
- 如果一个方法的返回值类型写的是 void,则表示该方法没有返回值,其 return 语句可以省略不写,如果要写,直接写作:
return;
- return 语句下面编写的代码,永远执行不到,属于无效代码。
二、方法的重载
在同一个类中,定义了多个同名的方法,这些同名的方法具有同种的功能。
每个方法具有不同的参数类型或参数个数,这些同名的方法,构成了一种重载的关系。
因此,在同一个类中,方法名相同,参数不同的方法(与返回值无关),叫做重载方法。其中,参数不同可能包括:个数不同、类型不同、顺序不同。
【例1】求和。
public class MethodDemo {public static int sum(int a, int b) {return a + b;}public static int sum(int a, int b, int c) {return a + b + c;}
}
以上两个方法在同一个类里,且方法名相同,参数不同,所以构成重载。
【例2】返回值无关。
public class MethodDemo {public static void fn(int a) {//方法体}public static int fn(int a) {//方法体}
以上两个方法纵使返回值不同,但是它们名字相同,参数也相同,所以不构成重载。
public class MethodDemo {public static float fn(int a) {//方法体}public static int fn(int a, int b) {//方法体}
以上两个方法返回值不同,那无所谓,只因为它们名字相同,参数也相同,所以构成重载。
【例3】不在同一个类里的两个同名函数,也不构成重载。
public class MethodDemo1 {public static float fn(int a) {//方法体}
}
public class MethodDemo2 {public static float fn(int a) {//方法体}
}
以上看似两个完全一样的方法,因为在不同的类中,所以也不构成重载。
【例4】参数顺序。
public class MethodDemo {public static void fn(int a, double b) {//方法体}public static void fn(double a, int b) {//方法体}
形参个数一样,方法名字一样,但是类型排列的顺序不同,这个时候也构成重载。
三、方法的使用
【练习1】数组遍历。
需求:设计一个方法用于数组遍历,要求遍历结果打印在一行。
public class Test {public static void main(String[] args) {//1.定义数组int[] arr = {11, 22, 33, 44, 55};//2.调用遍历方法printArr(arr);}//定义方法用于数组的遍历public static void printArr(int[] arr) {System.out.print("[");for(int i = 0; i < arr.length - 1; i++) {System.out.print(arr[i] + ", ");}System.out.println(arr[arr.length - 1] + "]");}
}
【练习2】求数组最大值。
需求:设计一个方法,求数组的最大值,并将最大值返回。
public class Test {public static void main(String[] args) {//1.定义数组int[] arr = {11, 22, 33, 44, 55};//2.调用方法求最大值int max = getMax(arr);//3.打印System.out.println(max);}//定义方法用于数组求最大值public static int getMax(int[] arr) {int max = arr[0];for(int i = 1; i < arr.length; i++) {if(arr[i] > max) {max = arr[i];}}return max;}
}
【练习3】定义一个方法,判断数组中的某一个数是否存在,将结果返回给调用处。
import java.util.Scanner;public class Test {public static void main(String[] args) {int[] arr = {1, 5, 8, 12, 56, 89, 34, 67};//生成一个输入对象Scanner sc = new Scanner(System.in);//输入numint num = sc.nextInt();boolean flag = contains(arr, num);System.out.println(result);}//定义一个方法,判断数组中某一个数是否存在public static boolean contains(int[] arr, int num) {for(int i = 0; i < arr.length; i++) {if(arr[i] == num) {return true;}}return false; //循环完毕后仍找不到,所以返回false}
}
【练习4】定义一个方法copyOfRange(int[] arr, int from, int to),将数组 arr 中从索引 from(包含 from)开始,到索引 to 结束(不包含 to)的元素复制到新数组中,将新数组返回。
public class Test {public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};int[] newArr = copyOfRange(arr);System.out.println(newArr);}public static int[] copyOfRange(int[] arr, int from, int to) {//定义新数组,不知道存几个,所以定义动态数组int[] newArr = new int[to - from];//用循环把数组元素挨个存储到新数组中for(int i = from, j = 0; i < to; i++, j++) {newArr[j] = arr[i];}//把新数组返回return newArr;}
}
四、方法的内存原理
4.1 方法调用的基本内存原理
【例1】单个方法
public class MethodDemo {public static void main(String[] args) {int number = 100;sout("number的值为:" + number);}
}
上述代码中,MethodDemo 中仅有一个 main 方法,且没用到 new 关键字,因此不涉及堆内存,仅仅使用到了栈。
在调用 main 方法时,方法会进入栈底,然后执行方法中的语句。方法中定义的变量和其值是实实在在存储于栈里的。
执行完毕后,main 方法会出栈,而里面存储的 int number 变量也会随之消失。
【例2】嵌套方法调用。
public class MethodDemo {public static void main(String[] args) {eat();}public static void eat() {study();System.out.println("吃饭");sleep();}public static void sleep() {System.out.println("睡觉");}public static void study() {System.out.println("学习");}
}
现在有三个方法和一个 main 方法。首先会调用 main 方法,main 方法先进栈,然后在 main 方法里调用了 eat 方法,因此 eat 方法第二个进栈;在 eat 方法中,调用了 study 方法, 因此 study 方法第三个进栈,如下:
当“学习”打印完以后,study 方法执行完毕,就会出栈:
然后打印“吃饭”,调 sleep 方法,sleep 方法也会进栈。
当“睡觉”被打印,sleep 方法也执行完毕,出栈。
此时发现,eat 方法也执行完毕,因此它也出栈。
eat 方法执行完后,main 方法也执行完毕,因此出栈,栈空。
4.2 方法传递基本数据类型的内存原理
Java 中的数据类型分为基本数据类型和引用数据类型。
基本数据类型包括:整数、浮点数、布尔、字符。除此之外的所有数据类型都是引用数据类型。它们最本质的区别是:
基本数据类型在内存中,变量存储的是真实的数据。
而引用数据类型,其存储的是一段地址值,使用了其他空间中的数据,以数组为例:
因此,在传递形参时,如果传递的是数组,它是引用类型,通过修改这个数组,可以直接影响到其指向的地址值所在的堆内存空间。
相关文章:

【JAVA入门】Day04 - 方法
【JAVA入门】Day04 - 方法 文章目录 【JAVA入门】Day04 - 方法一、方法的格式1.1 无参无返回值的方法定义和调用1.2 带参数的方法定义和调用1.3 形参和实参1.4 带返回值的方法定义和调用1.5 方法的注意事项 二、方法的重载三、方法的使用四、方法的内存原理4.1 方法调用的基本内…...

前端报错 SyntaxError: Unexpected number in JSON at position xxxx at JSON.parse
问题描述 控制台提示 SyntaxError: Unexpected number in JSON at position xxxx at JSON.parse 问题原因 原因:JSON 数据格式错误,是否符合 JSON 格式。 解决方法 应为json格式数据 什么是json格式数据 JSON(JavaScript Object …...

Mybatis进阶详细用法
目录 条件构造器 案例 自定义SQL 案例 Service接口 案例 综合案例 条件构造器 案例 Testvoid testQueryMapper() {// 创建 QueryWrapper 实例QueryWrapper<User> queryWrapper new QueryWrapper<>();queryWrapper.select("id," "username,&…...

Android 系统省电软件分析
1、硬件耗电 主要有: 1、屏幕 2、CPU 3、WLAN 4、感应器 5、GPS(目前我们没有) 电量其实是目前手持设备最宝贵的资源之一,大多数设备都需要不断的充电来维持继续使用。不幸的是,对于开发者来说,电量优化是他们最后才会考虑的的事情…...

了解什么是Docker
了解什么是Docker Docker 是一个开源的应用容器引擎,它允许开发者打包应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类…...

ChatGPT开源的whisper音频生成字幕
1、前言 好了,那接下来看一下whisper开源库的介绍 有五种模型大小,其中四种仅支持英语,提供速度和准确性的权衡。上面便是可用模型的名称、大致的内存需求和相对速度。如果是英文版的语音,直接想转换为英文。 本来我是想直接在我的…...

融知财经:期货和现货的区别是什么?哪个风险大?
期货和现货在交易对象等方面存在明显的区别。期货交易是一种衍生金融工具,主要用于价格发现、风险管理和投机,而现货交易则是商品和服务的实际买卖。在选择进行期货交易还是现货交易时,投资者需要根据自己的需求和市场情况来决定。 期货和现货…...

Android Studio开发之路(十)app中使用aar以及报错记录
书接上文:Android Studio开发之路(九)创建android library以及生成aar文件 五、app中使用aar文件的方法 先复制一下上面生成的aar文件。然后在你要添加到的app左上角选择“project”模式,然后找到libs文件夹,点击右键…...

sql-行转列3(转置)
行转列的常规做法是,group bysum(if())【或count(if())】 例题: 腾讯QQ 假设tableA如表5, tableB如表6, 表5 qq号(字段名:qq)游戏(字段名:game)10000a10000b10000c20000c20000d…...

MATLAB | 最新版MATLAB绘图速查表来啦!!
之前看大佬Pjer做的MATLAB速查表 http://home.ustc.edu.cn/~pjer1316/matlabplot/ 感觉非常的实用,最近几次MATLAB更新围绕画图方面也有很多新东西,于是就有了自己做一张最新版的速查表的想法,这张表长这样: 这张表的配色基本上…...

web安全之登录框渗透骚姿势,新思路
不管漏洞挖掘还是挖SRC,登录框都是重点关注对象,什么漏洞都有可能出现, 本篇文章做个总结,后面发现新思路后会继续更新 万能密码 or 弱口令 SQL注入 水平越权 垂直越权 逻辑漏洞 短信轰炸 邮箱轰炸 信息泄露 验证码DOS XSS万能密…...

无人机+自组网:空地点对点无人机通信解决方案
随着智能化技术的迅速发展, 无人化设备在战场上发挥的作用日益突显。在近期发生的多次局部战争中, 无人设备代替人类承担了多项危险且复杂的攻击任务, 达到 “兵不血刃” 的效果. 2020 年 1 月 3 日, 美军利用无人机执行了刺杀伊朗 “圣城旅” 指挥官苏莱曼尼行动. 纳戈尔诺 - …...

android TV app适配遥控器思路,recycleview选中放大
背景: 1、当遥控器遥控盒子,app内是有一套机制,响应遥控器的操作; 2、要实现遥控器选中的效果,必须要设置setOnFocusChangeListener方法,另外一个就是设置view的setOnClickListener方法;设置完之后&#…...

python篇-cmd 执行pip命令失败,但执行pyhon命令正常
当你在CMD中可以正常执行python命令,但执行pip命令失败时,这通常意味着pip没有被正确地添加到系统的环境变量中。这里有一些步骤来解决这个问题: 检查环境变量: 打开系统的环境变量设置(右击“此电脑”>“属性”>…...

Redis系列-3 Redis缓存问题
1.缓存的作用 数据库(如Mysql)的持久化特点带来了较低的性能,高并发的场景下,连接池很快被耗尽而出现宕机或DOS,无法继续对外提供服务。相对于数据库的硬盘IO,缓存中间件基于内存进行读写,从而具备较大的吞吐量和高并…...

【数据结构】堆(Heap)
文章目录 一、堆的概念及结构二、堆的实现1.向上调整算法2.向下调整算法3.堆的创建4.堆的插入5.堆的删除6.堆的其他操作 三、堆的应用1.堆排序2.Top-K问题 一、堆的概念及结构 堆(Heap)是一种特殊的非线性结构。堆中的元素是按完全二叉树的顺序存储方式存储在数组 中。满足任意…...

vue cli 自定义项目架子,vue自定义项目架子,超详细
脚手架Vue CLI基本介绍: Vue CLI 是Vue官方提供的一个全局命令工具 可以帮助我们快速创建一个开发Vue项目的标准化基础架子【集成了webpack配置】 脚手架优点: 开箱即用,零配置内置babel等工具标准化的webpack配置 脚手架 VueCLI相关命令…...

flink cdc,读取datetime类型
:flink cdc,读取datetime类型,全都变成了时间戳 Flink CDC读取MySQL的datetime类型时会转换为时间戳的问题,可以通过在Flink CDC任务中添加相应的转换器来解决。具体来说,可以在MySQL数据源的debezium.source.converter配置项中指…...

Kotlin 编译器和工具链:深入解析与实践案例
Kotlin 编译器和工具链是构建 Kotlin 项目的核心组件,它们负责将 Kotlin 代码转换为可在 JVM 或 JavaScript 环境中运行的代码。本文将详细介绍 Kotlin 编译器和工具链的工作原理、使用方法,以及在实际开发中的应用案例。 1. 引言 Kotlin 作为一种现代…...

kettle
文章目录 读取共享数据库连接报错 读取共享数据库连接报错 读取共享数据库连接报错 解决方法:修改共享文件中的中文字符,文件位置一般是默认的:C:\Users\Administrator.kettle。将shared.xml文件中的中文字符改成英文后问题就解决了。...

Maven 自动化构建
优质博文:IT-BLOG-CN 一、Maven:是一款服务于 Java平台的自动化构建工具 【1】Maven可以将一个项目按模块划分成不同的工程,利于分工协作; 【2】Maven可以将 jar包保存在自己的中央“仓库”中进行统一管理,有需要使用的工程引用这…...

Unicode字符集和UTF编码
文章目录 前言一、字符集和编码方式二、unicode字符集utf32编码utf8编码utf8编码函数示例utf8解码函数示例 utf16编码utf16编码解码函数示例 总结 前言 本文详细介绍 u n i c o d e unicode unicode 字符集和其相关的三种编码方式: u t f 8 utf8 utf8,…...

echarts默认图例(横线+圈圈)
修改echarts 图例样式 项目里折线图需要去掉圆点, 但是图例样式需要是默认样式(横线和圈圈) 原始代码:(只展示series 和legend配置 ) series: [{name: chartObj.names[ind_one],yAxisIndex: yIndex,type: ele_one,barMaxWidth: 15,tooltip: {show: true},data: chartObj.yAx…...

Shell脚本的基础和变量
1.shell脚本基础 1.1 shell的作用 Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执 行的…...

VRRP协议-负载分担配置【分别在路由器与交换机上配置】
VRRP在路由器与交换机上的不同配置 一、使用路由器实现负载分担二、使用交换机实现负载分担一、使用路由器实现负载分担 使用R1与R2两台设备分别进行VRRP备份组 VRRP备份组1,虚拟pc1的网关地址10.1.1.254 VRRP备份组2,虚拟pc2的网关地址10.1.1.253 ①备份组1的vrid=1,vrip=…...

商务分析方法与工具(十):Python的趣味快捷-公司财务数据最炫酷可视化
Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…...

思源笔记如何结合群晖WebDav实现云同步数据
文章目录 1. 开启群晖WebDav 服务2. 本地局域网IP同步测试3. 群晖安装Cpolar4. 配置远程同步地址5. 笔记远程同步测试6. 固定公网地址7. 配置固定远程同步地址 在数字化时代,信息的同步与共享变得尤为重要。无论是个人用户还是企业团队,都渴望能够实现跨…...

Electron Forge | 跨平台实战详解(中)
简介 上篇 介绍了 Electron 和 Electron Builder 的基本用法,本篇将介绍更常用也更方便的打包工具,Electron Forge 。 Electron Forge 是一个为 Electron 应用的开发、打包和分发而设计的全功能工具集。它整合了多个底层 Electron 工具到一个统一的命令…...

stable diffusion教程
Stable Diffusion 是一种流行的图像生成模型,它可以根据文本提示生成高质量的图片。如果你想了解如何使用 Stable Diffusion,这里有一些基本的步骤和资源,可以帮助你开始使用: ### 1. 安装 Stable Diffusion 首先,你需…...

音频文件分析-- whisper(python 文档解析提取)
使用whisper转文本,这里使用的是large-v3版本 pip install githttps://github.com/openai/whisper.git import whisper import os from tqdm import tqdmmodel whisper.load_model("large-v3")path "rag_data" for fi in tqdm(os.listdir(pa…...