当前位置: 首页 > news >正文

【JavaSE-7】方法的使用

1、方法的概念和使用

1.1、什么是方法

方法(method)是程序中最小的执行单元,类似于 C语言中的函数,方法存在的意义:

  1. 是能够模块化的组织代码(当代码规模比较复杂的时候).
  2. 做到代码被重复使用, 一份代码可以在多个位置使用.
  3. 让代码更好理解更简单.
  4. 直接调用现有方法开发, 不必重复造轮子

注意

  • 方法必须先创建才可以使用,该过程称为方法定义
  • 方法创建后并不是直接可以运行的,需要手动使用后,才执行,该过程称为方法调用

1.2、方法的定义

方法定义语法格式:

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

类比main函数:public static void main(String[] args),其中void是返回值类型;main是方法名称;String[] args是参数类型和形参。

例子

判断闰年

1、能被4整除且不能被100整除的是闰年

2、能被400整除的是闰年

//判断闰年方法
public static  boolean isLeapYear(int year){if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){System.out.println(year+"是闰年");return true;}else{System.out.println(year+"不是闰年");return false;}
}

【注意事项】

  1. 修饰符:现阶段直接使用public static 固定搭配
  2. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void
  3. 方法名字:采用小驼峰命名(首字母小写,后续单词首字母大写)
  4. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
  5. 方法体:方法内部要执行的语句
  6. 在java当中,方法必须写在类当中
  7. 在java当中,方法不能嵌套定义
  8. 在java当中,没有方法声明一说,方法只有先定义,才能调用。
  9. 方法的返回值类型是void时,可以省略return;但是也可以写,后面不加数据即可。

1.3、方法调用的执行过程

方法的调用方式:

方法名(参数1,参数2,...);

调用过程:

  1. 调用方法方法名(参数1,参数2,...);
  2. 传递参数,注意参数的数量与类型必须与方法定义中的设置相匹配,否则程序将报错 。
  3. 找到方法地址
  4. 执行被调方法的方法体
  5. 被调方法结束返回
  6. 回到主调方法继续往下执行。

例子:

public class Test01 {//判断闰年方法public static boolean isLeapYear(int year){if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){System.out.println(year+"是闰年");return true;}else{System.out.println(year+"不是闰年");return false;}}public static void main(String[] args) {Scanner scan = new Scanner(System.in);System.out.println("请输入年份:");int year = scan.nextInt();//方法的调用boolean ret = isLeapYear(year);}
}

在其他函数中去调用方法时的参数称为实际参数(实参)即上述main函数中的boolean ret = isLeapYear(year);这句代码中year,在方法定义中的参数称为形式参数(形参)即上述isLeapYear方法中的public static boolean isLeapYear(int year)这句代码的year
【注意事项】

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

例子:

计算 1! + 2! + 3! + 4! + 5!

//求阶乘
public static int fac(int n){if(n == 1 || n == 0){return 1;}else {return n * fac(n - 1);}
}
public static void main(String[] args) {//计算 1! + 2! + 3! + 4! + 5!int sum = 0;for (int i = 1; i <= 5 ; i++) {sum += fac(i);}System.out.println(sum);
}

1.4、实参和形参的关系

  1. 形参:方法定义中的参数
    1. 等同于规定了变量定义的格式。
  2. 实参:方法调用中的参数
    1. 等同于使用变量或常量。

形参只是拿到了实参的值,形参的名字可以随意取,对方法没有影响;形参和实参的名字也可以相同。

方法放在main前或者后都可以,与 C语言不同(自顶向下编译)。在 java 中,实参的值永远都是赋值到形参中,形参和实参本质是两个实体。

例子1:

//交换两个数值
public static void swap(int x, int y){int tmp =x;x = y;y = tmp;
}public static void main(String[] args) {int a = 10,b = 20;System.out.println("交换前:"+ a +" "+b);swap(a,b);System.out.println("交换后:"+ a +" "+b);
}

【运行结果】

交换前:10 20
交换后:10 20

分析
实参abmain方法中的两个变量,其分配的内存空间在main方法的栈(一块特殊的内存空间)中,而形参xyswap方法中的两个变量,xy的内存空间在swap方法运行时的栈中,因此:实参ab 与 形参xy是两个没有任何关联性的变量,在swap方法调用时,只是将实参ab中的值拷贝了一份传递给了形参xy,因此对形参xy操作不会对实参ab产生任何影响。
对于基本数据类型来说,形参相当于实参的拷贝,即传值调用

【解决办法】

引用数据类型参数(如数组)因为引用数据类型在内存中存储的是地址值,指向在堆内存中申请的一片内存。

例子2:

public class TestMethod {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;}
}// 运行结果
arr[0] = 20 arr[1] = 10

2、方法重载

2.1、为什么需要方法重载

首先,如果我们定义一个函数add()实现两个整数的相加,但后面如果想实现两个浮点数的相加时,会因为参数的数据类型的不同导致报错。

例子1:

只有我们重新写一个方法,定义形参的数据类型是double的方法才能实现,但是这种形式的缺点就是需要命名不同的方法名,并且容易记忆混乱,那么可以直接使用同一个方法名吗?由此引出方法重载

2.2、方法重载概念

在日常交流中,一个词语如果有多重含义,比如:喜欢,情侣之间说喜欢与子女对父母说喜欢,这个词语的含义是不同的,这个时候我们可以认为该词语含义被重载,具体代表什么意思就需要结合具体的场景。

java 中,如果多个方法的方法名相同,参数列表不同,与返回值无关,则称这几种方法被重载了。

其中参数列表不同包括:个数不同,类型不同,顺序不同。

例子:

之后调用该方法时通过 IDEA 会有提示,根据需要传入的实参类型,选择相应的方法。

注意事项

  • 方法名必须相同。
  • 参数列表必须不同(参数个数/参数类型/参数的次序
  • 多个方法必须定义在同一个类中。
  • 与返回值类型是否相同无关
  • 如果仅仅因为返回值类型不同,是不能构成重载的。
  • 编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法。

2.3、方法签名(了解)

在同一个作用域中不能定义两个相同名称的标识符,但是在类中可以定义方法名相同的方法

是因为有方法签名的存在。

方法签名即是:经过编译器编译修改之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字。每一个方法都有签名。

将编写的代码经过编译后,会生成.class文件,在该文件所在的目录下打开命令行窗口,输入javap -v 字节码文件名即可

例子:

public class TestMethod {public static int add(int x, int y){return x + y;}public static double add(double x, double y){return x + y;}public static void main(String[] args) {add(1,2);add(1.5, 2.5);}
}

生成的字节码文件:

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

3、递归

3.1、递归的概念

一个方法在执行过程中调用自身,就称为“递归”。递归相当于数学的“数学归纳法”,有一个起始条件,然后有一个递推公式。

递归条件:将原问题划分成其子问题,子问题。

3.2、递归练习

按顺序打印一个数字的每一位(例如 123打印出 1 2 3 )

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

【分析】

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

//递归求 1 + 2 + 3 + ... + 10
public static int fac(int n){if(n == 1){return 1;}else{return n+fac(n-1);}
}

写一个递归方法,输入一个非负整数,返回组成它的数字之和.

例如,输入 1729, 则应该返回1+7+2+9,它的和是19

public static int sum(int n){while(n > 9){return n % 10 + sum(n/10);}return n % 10;
}

求斐波那契数列第 n 项

第一项从 1 开始:1 1 2 3 5 8…

public static int fib(int n){if(n == 1 || n == 2){return 1;}else{return fib(n-1) + fib(n-2);}
}

非递归:

if(n == 1){return 1;
}
if(n == 2){return 1;
}
int n1 = 1;
int n2 = 1;
int n3 = 0;
while(n > 2){n3 = n1 + n2;n1 = n2;n2 = n3;n--;
}
return n3;

第 1 项从 0 开始 :0 1 1 2 3 5 8

public static int fib(int n){if(n == 1){return 0;}if(n == 2){return 1;}return fib(n-1)+fib(n-2);
}

非递归:

if(n == 1){return 0;
}
if(n == 2){return 1;
}
int n1 = 0;
int n2 = 1;
int n3 = 0;
while(n > 2){n3 = n1 + n2;n1 = n2;n2 = n3;n--;
}
return n3;

递归求解汉诺塔问题

有3根柱子,A,B,C;A柱上放N个盘子,上面小,下面大

问题:

把A柱上所有盘子挪到C柱上(可以借助B柱)

过程中:所有柱子上的盘子,也要下面大,上面小,且一次只能移动一个盘子。

// 定义一个方法用于解决汉诺塔问题
public static void hanoi(int n, char source, char auxiliary, char target){// 如果只有一个圆盘,直接将其从源柱移动到目标柱if (n == 1) {System.out.println("Move disk 1 from "+source+" to "+target);return;}// 先将 n - 1 个圆盘从源柱借助目标柱移动到辅助柱hanoi(n - 1, source, target, auxiliary);// 再将第 n 个圆盘从源柱移动到目标柱System.out.println("Move disk "+ n +" from "+source+" to "+target);// 最后将 n - 1 个圆盘从辅助柱借助源柱移动到目标柱hanoi(n - 1, auxiliary, source, target);
}

分析:

  1. n-1个盘子从源柱子借助目标柱子移动到辅助柱子。
  2. 把第n个盘子从源柱子移动到目标柱子。
  3. n-1个盘子从辅助柱子借助源柱子移动到目标柱子。

时间复杂度:O(2<sup>n</sup>)


如n=4时,

将上面 3 个盘子从源柱 A 借助目标柱 C 移动到辅助柱 B

将第 4 个盘子从源柱 A 移动到目标柱 C

将辅助柱 B 上的 3 个盘子借助源柱 A 移动到目标柱 C

相关文章:

【JavaSE-7】方法的使用

1、方法的概念和使用 1.1、什么是方法 方法&#xff08;method&#xff09;是程序中最小的执行单元&#xff0c;类似于 C语言中的函数&#xff0c;方法存在的意义&#xff1a; 是能够模块化的组织代码(当代码规模比较复杂的时候).做到代码被重复使用, 一份代码可以在多个位置…...

Modbus TCP转Profibus DP协议转换网关赋能玻璃生产企业设备协同运作

一、案例背景 在玻璃生产行业&#xff0c;自动化控制对提升生产效率与保障产品质量起着决定性作用。一家玻璃生产企业为实现生产过程的精细化管控&#xff0c;引入了先进的自动化控制系统。其中&#xff0c;上位机电脑配备了WINCC组态软件&#xff0c;作为Modbus TCP主站&#…...

Java 大视界 -- Java 大数据在智能政务公共服务资源优化配置中的应用(118)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

C++学习之路,从0到精通的征途:入门基础

目录 一.C的第一个程序 二.命名空间 1.namespace的价值 2.命名空间的定义 3.命名空间使用 三.C的输入与输出 1.<iostream> 2.流 3.std(standard) 四.缺省参数 1.缺省参数的定义 2.全缺省/半缺省 3.声明与定义 ​五.函数重载 1.参数个数不同 2.参数类型不…...

ADC采集模块与MCU内置ADC性能对比

2.5V基准电压源&#xff1a; 1. 精度更高&#xff0c;误差更小 ADR03B 具有 0.1% 或更小的初始精度&#xff0c;而 电阻分压方式的误差主要来自电阻的容差&#xff08;通常 1% 或 0.5%&#xff09;。长期稳定性更好&#xff0c;分压电阻容易受到温度、老化的影响&#xff0c;长…...

Gartner发布2025年网络安全六大预测

文章目录 前言趋势1&#xff1a;生成式AI推动数据安全计划趋势2&#xff1a;管理机器身份趋势3&#xff1a;战术型AI趋势4&#xff1a;优化网络安全技术趋势5&#xff1a;扩大安全行为与文化计划的价值趋势6&#xff1a;应对网络安全倦怠 前言 Gartner发布2025年网络安全六大预…...

C#批量压缩并上载CSV数据文件到Box企业云盘

C# .NET 8实现Windows下批量压缩csv文件为zip文件&#xff0c;然后异步上传到box企业云服务网盘路径&#xff0c;实现异常处理和写入运行状态日志&#xff0c;参数来自ini配置文件。 C# .NET 8代码示例&#xff0c;包含INI配置读取、CSV文件压缩、Box上传、异步处理和日志记录…...

C++常见概念

第一个 C 程序 #include<iostream>using namespace std;int main() {cout << "helloworld" << endl;return 0; }命名空间 #include<stdio.h>int rand 10;int main() {printf("%d", rand);return 0; }#include<stdio.h> #…...

结构型模式---享元模式

概念 享元模式是一种结构型设计模式&#xff0c;他摒弃了在每个对象中保存所有数据的方式&#xff0c;通过共享多个对象所共有的相同状态&#xff0c;让你能在有限的内存容量中载入更多对象。享元模式将原始类中的数据分为内在状态数据和外在状态数据。 内在状态&#xff1a;就…...

2025年渗透测试面试题总结- 深某服-漏洞研究员实习(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 深信服-漏洞研究员实习 1. 在XX实习时做了什么 2. 渗透测试的思路简单描述 3. 护网中承担什么角色 4…...

(13)Anaconda 安装配置详解

1. Anaconda 简介 Anaconda 是一个用于科学计算和数据分析的 Python 发行版,它集成了 Python 解释器、大量常用的科学计算库以及强大的包管理工具。 2. Anaconda 主要特点 丰富的库集合:包含了超过 1500 个用于科学计算、数据分析、机器学习等领域的常用 Python 库,例如 N…...

MWC 2025 | 移远通信大模型解决方案加速落地,引领服务机器人创新变革

随着人工智能、大模型等技术的蓬勃发展&#xff0c;生成式AI应用全面爆发。在此背景下&#xff0c;服务机器人作为大模型技术在端侧落地的关键场景&#xff0c;迎来了前所未有的发展机遇。 作为与用户直接交互的智能设备&#xff0c;服务机器人需要应对复杂场景下的感知、决策和…...

[内网安全] Windows 域认证 — Kerberos 协议认证

&#x1f31f;想系统化学习内网渗透&#xff1f;看看这个&#xff1a;[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01&#xff1a;Kerberos 协议简介 Kerberos 是一种网络认证协议&#xff0c;其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过…...

[Computer Vision]实验七:图像检索

目录 一、实验内容 二、实验过程 2.1 准备数据集 2.2 SIFT特征提取 2.3 学习“视觉词典”&#xff08;vision vocabulary&#xff09; 2.4 建立图像索引并保存到数据库中 2.5 用一幅图像查询 三、实验小结 一、实验内容 实现基于颜色直方图、bag of word等方法的以图搜…...

C++之thread_local变量

C之thread_local变量_c threadlocal-CSDN博客 thread_local简介 thread_local 是 C11 为线程安全引进的变量声明符。表示对象的生命周期属于线程存储期。 线程局部存储(Thread Local Storage&#xff0c;TLS)是一种存储期(storage duration)&#xff0c;对象的存储是在…...

【国产Linux | 银河麒麟】麒麟化龙——KylinOS下载到安装一条龙服务,起飞!

&#x1f5fa;️博客地图 &#x1f4cd;一、下载地址 &#x1f4cd;二、 系统安装 本文基于Windows操作系统vmware虚拟机安装 一、下载地址 官网&#xff1a;产品试用申请国产操作系统、麒麟操作系统——麒麟软件官方网站 下载自己需要的版本&#xff0c;完成后&#xff0c…...

(接“使用js去复制网页内容的方法”)js中的execCommand怎么复制富文本内容解析

document.execCommand(copy) 是传统的剪贴板操作方法&#xff0c;但它主要用于复制纯文本内容。如果你想复制富文本内容&#xff08;包括 HTML 标签和样式&#xff09;&#xff0c;需要结合一些技巧来实现。以下是具体方法&#xff1a; 方法&#xff1a;通过创建隐藏的富文本元…...

npm ERR! code 128 npm ERR! An unknown git error occurred

【问题描述】 【问题解决】 管理员运行cmd&#xff08;右键window --> 选择终端管理员&#xff09; 执行命令 git config --global url.“https://”.insteadOf ssh://git cd 到项目目录 重新执行npm install 个人原因&#xff0c;这里执行npm install --registryhttps:…...

解决Leetcode第3470题全排列IV

3470.全排列IV 难度&#xff1a;困难 问题描述&#xff1a; 给你两个整数n和k&#xff0c;一个交替排列是前n个正整数的排列&#xff0c;且任意相邻两个元素不都为奇数或都为偶数。 返回第k个交替排列&#xff0c;并按字典序排序。如果有效的交替排列少于k个&#xff0c;则…...

MyBatis 配置文件核心

MyBatis 配置文件核心标签解析 以下是针对你的笔记中的三个核心标签的详细解析&#xff0c;帮助你全面理解它们的用途和配置逻辑。 1. properties 标签&#xff1a;动态加载外部配置 功能 将环境相关的配置&#xff08;如数据库连接、密钥等&#xff09;与 MyBatis 核心配置…...

bert模型笔记

1.各预训练模型说明 BERT模型在英文数据集上提供了两种大小的模型&#xff0c;Base和Large。Uncased是意味着输入的词都会转变成小写&#xff0c;cased是意味着输入的词会保存其大写&#xff08;在命名实体识别等项目上需要&#xff09;。Multilingual是支持多语言的&#xff0…...

微信小程序接入deepseek

先上效果 话不多说&#xff0c;直接上代码&#xff08;本人用的hbuilder Xuniapp&#xff09; <template><view class"container"><!-- 聊天内容区域 --><scroll-view class"chat-list" scroll-y :scroll-top"scrollTop":…...

推荐算法和推荐系统入门第一趴

以下是推荐系统技术总结的架构梳理和建议表达思路&#xff1a; 从原理到生产环境&#xff1a;推荐系统核心技术与实战代码解析 一、推荐算法的演进图谱 传统算法三剑客 ![推荐系统算法分类示意图] &#xff08;使用Mermaid绘制算法分类关系图&#xff0c;清晰展示技术演进&am…...

unity pico开发 四 物体交互 抓取 交互层级

文章目录 手部设置物体交互物体抓取添加抓取抓取三种类型抓取点偏移抓取事件抓取时不让物体吸附到手部 射线抓取交互层级 手部设置 为手部&#xff08;LeftHandController&#xff09;添加XRDirInteractor脚本 并添加一个球形碰撞盒&#xff0c;勾选isTrigger,调整大小为0.1 …...

基于深度学习的青花瓷图像检索系统开发与实现

目录 1.研究背景与目的 1.1课题背景 1.2研究目的 二、调研资料情况 2.1图像分割研究现状 2.2图像检索调研 2.2.1选择深度学习进行检索的原因及优势 2.2.2基于深度学习的图像检索技术的发展 2.2.3基于深度学习的图像检索的研究重点 2.3基于深度学习的图像检索方法调研 …...

uniapp 系统学习,从入门到实战(八)—— Vuex 的使用

全篇大概 4500 字(含代码)&#xff0c;建议阅读时间 30min &#x1f4da; 目录 Vuex核心概念解析在 UniApp 中集成Vuex状态管理与数据共享实践总结 一、Vuex 核心概念解析 1.1 什么是状态管理 在跨多组件的大型应用中&#xff0c;不同页面/组件需要共享和修改相同数据时&am…...

Vue Hooks 深度解析:从原理到实践

Vue Hooks 深度解析&#xff1a;从原理到实践 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff01;点我试试&#xff01;&#xff01; 文章目录 Vue Hooks 深度解析&#xff1a;从原理到实践一、背景…...

django中序列化器serializer 的高级使用和需要注意的点

在 Django REST framework(DRF)中,序列化器(Serializer)是一个强大的工具,用于将复杂的数据类型(如 Django 模型实例)转换为 Python 原生数据类型,以便将其渲染为 JSON、XML 等格式,同时也能将接收到的外部数据反序列化为 Django 模型实例。以下将介绍序列化器的高级…...

靶场(二)---靶场心得小白分享

开始&#xff1a; 看一下本地IP 21有未授权访问的话&#xff0c;就从21先看起 PORT STATE SERVICE VERSION 20/tcp closed ftp-data 21/tcp open ftp vsftpd 2.0.8 or later | ftp-anon: Anonymous FTP login allowed (FTP code 230) |_Cant get dire…...

PHP Error处理指南

PHP Error处理指南 引言 在PHP开发过程中,错误处理是一个至关重要的环节。正确的错误处理不仅能够提高代码的健壮性,还能提升用户体验。本文将详细介绍PHP中常见的错误类型、错误处理机制以及最佳实践,帮助开发者更好地应对和处理PHP错误。 PHP错误类型 在PHP中,错误主…...