JavaSE——方法详解

1. 方法的概念

方法就是一个代码片段 . 类似于 C 语言中的 " 函数 "
方法存在的意义 :
1. 是能够模块化的组织代码(当代码规模比较复杂的时候).
2. 做到代码被重复使用, 一份代码可以在多个位置使用.
3. 让代码更好理解更简单.
4. 直接调用现有方法开发, 不必重复造扳手.
 

2. 方法的定义

// 方法定义
修饰符 返回值类型 方法名称([参数类型 形参 ...]){
方法体代码;
[return 返回值];
}
注意事项
1. 修饰符:现阶段直接使用public static 固定搭配
2. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成 void
3. 方法名字:采用小驼峰命名
4. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
5. 方法体:方法内部要执行的语句
6. 在java当中,方法必须写在类当中
7. 在java当中,方法不能嵌套定义
8. java 当中,没有方法声明一说

3.  方法调用的执行过程

调用过程:

调用方法 --- > 传递参数 --- > 找到方法地址 --- > 执行被调方法的方法体 --- > 被调方法结束返回 --- > 回到主调方法继续往下执行
注意事项:
定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行.
一个方法可以被多次调用.

代码示例:

 public static void main(String[] args) {int a = 10;int b = 20;System.out.println("第一次调用方法之前");int ret = add(a, b);System.out.println("第一次调用方法之后");System.out.println("ret = " + ret);System.out.println("第二次调用方法之前");ret = add(30, 50);System.out.println("第二次调用方法之后");System.out.println("ret = " + ret);}public static int add(int x, int y) {System.out.println("调用方法中 x = " + x + " y = " + y);return x + y;}

运行结果如下:

使用方法, 避免使用二重循环, 让代码更简单清晰 。

4. 实参与形参

在Java中,形参是在方法定义中声明的变量,用于接收调用该方法时传递进来的参数值。而实参则是在调用方法时传递给该方法的值或变量。简单来说,形参是方法定义时的参数,而实参是方法调用时的参数。

例如:

public void printString(String str) {System.out.println(str);
}

在上述方法定义中, str 就是一个形参。当我们调用该方法时,需要传递一个字符串作为实参,例如:

printString("Hello, World!");

在上述代码中,"Hello, World!"就是一个实参,它将被赋值给str形参。

注意
1. 在Java中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体
2. 形参的名字可以随意取,对方法都没有任何影响
代码示例:交换两个整型变量
public static void main(String[] args) {int a = 10;int b = 20;swap(a, b);System.out.println("main: a = " + a + " b = " + b);}public static void swap(int x, int y) {int tmp = x;x = y;y = tmp;System.out.println("swap: x = " + x + " y = " + y);}

运行结果如下:

可以看到,在 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 static void main(String[] args) {int[] arr = {10, 20};swap(arr);System.out.println("arr[0] = " + arr[0] + " arr[1] = " + arr[1]);
}public static void swap(int[] arr) {int tmp = arr[0];arr[0] = arr[1];arr[1] = tmp;}

运行结果如下:

5. 方法重载

5.1 概念

在自然语言中,一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合具体的场景。
Java 中方法也是可以重载的。
Java 中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了
代码示例
public static void main(String[] args) {add(1, 2);               // 调用add(int, int)add(1.5, 2.5);           // 调用add(double, double)add(1.5, 2.5, 3.5);   // 调用add(double, double, double)
}public static int add(int x, int y) {System.out.println("调用add(int x,int y)函数");return x + y;}public static double add(double x, double y) {System.out.println("调用add(double x,double y)函数");return x + y;}public static double add(double x, double y, double z) {System.out.println("调用add(double x,double y,double z)函数");return x + y + z;}

运行结果如下:

注意: 

1. 方法名必须相同
2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
3. 与返回值类型是否相同无关
4. 两个方法如果仅仅只是因为返回值类型不同,是不能构成重载的
5. 编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法

5.2 方法签名

方法签名是指一个方法的名称、参数个数、参数类型和顺序。它用于描述一个方法的特征,使得在同一个类中可以存在多个同名但参数不同的方法,从而实现重载。方法签名的格式通常为:方法全路径名+参数列表+返回值类型,构成方法完整的名字。其中,参数类型指的是方法参数的数据类型,参数名称指的是方法参数的名称。 

查看方法签名的方法:

代码经过编译之后,然后使用JDK自带的javap反汇编工具查看,具体操作:

1. 先对工程进行编译生成 .class 字节码文件
2. 在控制台中进入到要查看的 .class 所在的目录
3. 输入: javap -v 字节码文件名字即可
例如:

注意:

 方法签名中的一些特殊符号说明:

特殊字符                                       数据类型
Vvoid
Zboolean
Bbyte
Cchar
Sshort
Iint
Jlong
Ffloat
Ddouble
[
数组 ( [ 开头,配合其他的特殊字符,表述对应数据类型的数组,几个 [ 表述几维数组 )
L
引用类型,以 L 开头,以 ; 结尾,中间是引用类型的全类名

6. 递归

6.1 递归的概念

一个方法在执行过程中调用自身, 就称为 " 递归".
递归相当于数学上的 "数学归纳法", 有一个起始条件, 然后有一个递推公式.
例如, 我们求 N!
起始条件(终止条件): N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件.
递归公式: 求 N! , 直接不好求, 可以把问题转换成 N! => N * (N-1)!
递归的必要条件
1. 将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同
2. 递归出口

6.2 递归执行过程分析

      递归的程序的执行过程不太容易理解 , 要想理解清楚递归 , 必须先理解清楚 " 方法的执行过程 ", 尤其是 " 方法执行结束之后, 回到调用位置继续往下执行 ".
代码示例
用递归计算 N 的阶乘
 public static void main(String[] args) {int n = 5;int ret = factor(n);System.out.println("ret = " + ret);}public static int factor(int n) {System.out.println("函数开始, n = " + n);if (n == 1) {System.out.println("函数结束, n = 1 ret = 1");return 1;}int ret = n * factor(n - 1);System.out.println("函数结束, n = " + n + " ret = " + ret);return ret;}

运行结果如下:

运行过程:
程序按照序号中标识的 (1) -> (8) 的顺序执行.
注意
如果像上图递归 终止条件缺少或者有问题的时候,就会造成”栈溢出错误”

6.3 递归练习

1.  按顺序打印一个数字的每一位 ( 例如 1234 打印出 1 2 3 4)
public static void main(String[] args) {int num = 1234;print(num);
}
public static void print(int num) {if (num > 9) {print(num / 10);}System.out.print(num % 10 + " ");
}

运行结果如下:

2. 递归求 1 + 2 + 3 + ... + 10

public static void main(String[] args) {int num = 10;System.out.println(sum(num));
}
public static int sum(int num) {if (num == 1) {return 1;}return num + sum(num - 1);
}

运行结果如下:

3.  输入一个非负整数,返回组成它的数字之和. 例如,输入 1729, 则应该返回1+7+2+9,它的和是19

public static void main(String[] args) {int num = 1729;System.out.println(sum(num));
}
public static int sum(int num) {if (num < 10) {return num;}return num % 10 + sum(num / 10);
}

运行结果如下:

本文是作者学习后的总结,如果有什么不恰当的地方,欢迎大佬指正!!!

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

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

相关文章

揭秘文件加密利器:24年度最值得信赖的5大加密软件评测

数据安全与隐私保护已成为我们每个人都必须面对的重要问题。 文件加密软件作为保障数据安全的关键工具&#xff0c;其重要性不言而喻。 在众多的加密软件中&#xff0c;哪些软件能够在保障数据安全的同时&#xff0c;又具备良好的易用性和稳定性呢&#xff1f; 本文将为您揭秘…

2024第16届成都教育连锁加盟展6月1日举办 免费参观

2024第16届成都教育连锁加盟展6月1日举办 免费参观 邀请函 主办单位&#xff1a; 中国西部教体融合博览会组委会 承办单位&#xff1a;重庆港华展览有限公司 博览会主题&#xff1a;责任教育科技兴邦 幼教、普教、高教、校外教育、K12学科辅导、婴幼儿教育、兴趣辅导、学…

分布式与一致性协议之ZAB协议(七)

ZAB协议 ZAB协议:如何处理读写请求 你应该有这样的体会&#xff0c;如果你想了解一个网络服务&#xff0c;执行的第一个功能肯定是写操作&#xff0c;然后才会执行读操作。比如&#xff0c;你要了解ZooKeeper&#xff0c;那么肯定会在zkClient.sh命令行中执行写操作(比如crea…

【C++】---继承

【C】---继承 一、继承的概念及定义1、继承的概念2、定义语法格式3、继承基类成员访问方式的变化 二、基类 和 派生类 的对象之间的赋值转换1、赋值规则2、切片&#xff08;1&#xff09;子类对象 赋值 给 父类对象&#xff08;2&#xff09;子类对象 赋值 给 父类指针&#xf…

java多线程编码应用1——java多线程CompletableFuture使用技巧

在实际项目开发过程中&#xff0c;大部分程序的执行顺序都是按照代码编写的先后顺序&#xff0c;依次从上往下挨个执行的&#xff0c;但是对于统计或者批量操作数据时&#xff0c;是否有更好的方案呢&#xff1f;这时候就可以考虑使用多线程编程&#xff0c;异步并行执行多个任…

【管理咨询宝藏95】SRM采购平台建设内部培训方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏95】SRM采购平台建设内部培训方案 【格式】PDF版本 【关键词】SRM采购、制造型企业转型、数字化转型 【核心观点】 - 重点是建设一个适应战略采…

数据挖掘流程是怎样的?数据挖掘平台基本功能有哪些?

数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的数据中提取隐含在其中的、人们事先不知道的、但又是潜在有用的信息和知识的过程。 数据挖掘的流程是&#xff1a; 清晰地定义出业务问题&#xff0c;确定数据挖掘的目的。 数据准备: 数据准备包括&am…

机器学习 | 时间序列预测中的AR模型及应用

自回归模型&#xff0c;通常缩写为AR模型&#xff0c;是时间序列分析和预测中的一个基本概念。它们在金融、经济、气候科学等各个领域都有广泛的应用。在本文中&#xff0c;我们将探索自回归模型&#xff0c;它们如何工作&#xff0c;它们的类型和实际例子。 自回归模型 自回…

2024 GESP6级 编程第一题 游戏

题目描述 你有四个正整数 &#xff0c;并准备用它们玩一个简单的小游戏。 在一轮游戏操作中&#xff0c;你可以选择将 减去 &#xff0c;或是将 减去 。游戏将会进行多轮操作&#xff0c;直到当 时游戏结束。 你想知道游戏结束时有多少种不同的游戏操作序列。两种游戏操作…

虚拟机jvm下

jvm原理与实践 java程序的跨平台特性 jvm基本结构 JVM类加载流程和内存结构总览 类加载 加载阶段 类加载 验证阶段 类加载 准备阶段 类加载 解析阶段 类加载 初始化阶段 程序计数器 虚拟机栈&本地方法栈 栈帧操作 堆 方法区 永久代 元空间 垃圾回收 可触及性

python与java用途区别有哪些

区别&#xff1a; 1.Python比Java简单&#xff0c;学习成本低&#xff0c;开发效率高。 2.Java运行效率高于Python&#xff0c;尤其是纯Python开发的程序&#xff0c;效率极低。 3.Java相关资料多&#xff0c;尤其是中文资料。 4.Java版本比较稳定&#xff0c;Python2和3不…

笔记2:cifar10数据集获取及pytorch批量处理

&#xff08;1&#xff09;cifar10数据集预处理 CIFAR-10是一个广泛使用的图像数据集&#xff0c;它由10个类别的共60000张32x32彩色图像组成&#xff0c;每个类别有6000张图像。 CIFAR-10官网 以下为CIFAR-10数据集data_batch_*表示训练集数据&#xff0c;test_batch表示测试…