【JavaSE】方法的使用初学者易懂

news2024/11/13 11:31:54


前言

 大家好,我是程序猿爱打拳。今天讲解的是Java中方法的使用。Java中的方法类似于C语言里面的函数其中都有实参与形参。但Java中的方法又比C语言中的函数更为强大,为何呢?请看下文。

目录

1.为什么要有方法?

2.方法的概念及使用

2.1什么是方法?

2.2方法定义

2.3方法的调用

2.4实参和形参

2.5没有返回值的方法

3.方法重(chong)载

3.1方法重载是什么?

3.2方法重载的使用

3.3方法签名

4.递归

4.1递归的概念

4.2递归执行过程


1.为什么要有方法?

当我们执行同一种类型的操作时,每执行一次我们就得编写一次代码。这样会使我们变得非常烦躁而且不利于开发。因此我们把这同一种类型的操作编写为一个方法,当我们需要这个操作的时候就调用这个方法以免每次都得编写同一种代码。

上图中,右边就是一个方法。当老师被问及宿舍地址时,老师可以使用该公告,非常的方便。 当我们编写程序的时候反复的去编写同一种类型的代码时是很烦躁的,因此我们需要一串专门的代码来实现复用效果,这串代码就是我们认为的方法!与上图的公告是一样的意思。


2.方法的概念及使用

2.1什么是方法?

Java中的方法类似于C语言的"函数",但也有些不同处,不同处是Java中方法更好用,下文会讲到。

方法的几个特点:

  1. 可重复利用,一份代码可以在多个位置中使用
  2. 实现模块化程序
  3. 简单易懂

2.2方法定义

在C语言中我们有main函数,在Java中我们有main方法。那么方法的语法格式我就拿main方法来介绍:

上图就是main方法的语法格式其他方法格式也是相同的,下面我们在main方法里实现一个数的阶乘:

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个数:");
        int num = sc.nextInt();
        int sum = 1;
        for (int i = 1; i <= num ; i++) {
            sum *= i;
        }
        System.out.println(num+"的阶乘为:"+sum);
    }
}

运行效果:


2.3方法的调用

方法是如何调用呢,一般我们是在主函数里面调用方法。比如给定两个数,求其最大数使用名为Max的方法来实现:

public class Test {
    public static int Max(int x,int y) {
        return x>y?x:y;
    }
    public static void main(String[] args) {
        int ret = Max(5,2);
        System.out.println(ret);
    }
}

以上程序中的Max就是一个方法,这个方法的类型参数以及方法体都是我来编写。我可以从main方法中调用Max方法最后返回一个最大值。这就是方法的调用,跟C语言很相似,C语言中有实参形参方法中也是有实参和形参的。


2.4实参和形参

形参是实参的一份临时拷贝,形参通过实参来得到具体的数据从而进行操作。我们来编写一个add的方法来理解。

public class Test {
    public static int add(int x,int y) {
        return x+y;
    }
    public static void main(String[] args) {
        int ret = add(2,3);
        System.out.println(ret);
    }
}

输出:

以上代码中,main方法中add()里面的2和3就是实参,add方法()里面的就是形参。形参必须与实参类型一致。方法的返回类型也必须与接收返回的类型一致。如下图所示:

学习过C语言中函数的伙伴就不难理解,实参与形参的关系。在C语言中我们知道了形参是实参中的一份临时拷贝。Java中也是一样的,如交换两个整数:

(1)C语言实现

#include<stdio.h>

void Swap(int x, int y)
{
	int tmp = x;
	x = y;
	y = tmp;
	printf("Swap函数中:\n");
	printf("x=%d\n", x);
	printf("y=%d\n", y);
}
int main()
{
	int a = 10;
	int b = 20;
	Swap(a, b);
	printf("main函数中:\n");
	printf("x=%d\n", a);
	printf("y=%d\n", b);
	return 0;
}

 输出效果:

(2)Java实现

public class Test {
    public static void Swap(int x,int y) {
        int tmp = x;
        x = y;
        y = tmp;
        System.out.println("Swap方法中:");
        System.out.println("x="+x);
        System.out.println("y="+y);
    }
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        Swap(a,b);
        System.out.println("main方法中:");
        System.out.println("a="+a);
        System.out.println("b="+b);
    }
}

显示效果:

 以上两个代码展示了C和Java中函数与方法相同之处。


2.5没有返回值的方法

在上面的2.2方法的定义中,我们知道了方法在定义的时候要给定返回类型。我们想返回整型就写int,想返回双精度浮点型就写double。想没有返回值就写void,如定义一个方法求两数之和并且无返回值:

public class Test {
    public static void print(int x,int y) {
        int sum = x+y;
        System.out.println(sum);
    }
    public static void main(String[] args) {
        int a= 10;
        int b= 20;
        print(a,b);
    }
}

输出:

以上print方法的返回值为void,表示无返回值。这点跟C语言中函数的返回值类型是一样的。


3.方法重(chong)载

在日常生活中“好人”的定义是不同的,你在马路上扶一位老爷爷过吗,老爷爷说你是个好人。当舔狗时女生说你是个好人。这就是好人不同的定义,方法也一样,可以有不同的定义。


3.1方法重载是什么?

当我们使用同一种操作时,有时候因为类型的不同。而要重新编写代码,这给我们带来了极大的不变。因此Java中提供了一种叫方法重载的功能。

方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。调用时,会根据不同的参数表选择对应的方法。

方法重载的特点:

  1. 同一个类,同一个方法名
  2. 不同:参数列表不同。(类型,个数,顺序不同)

3.2方法重载的使用

public class Test {
    public static int Sum(int x,int y) {
        return x+y;
    }
    public static double Sum(double x,double y) {
        return x+y;
    }
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        double c = 3.1;
        double d = 4.2;
        int ret1 = Sum(a,b);
        double ret2 = Sum(c,d);
        System.out.println(ret1);
        System.out.println(ret2);
    }
}

输出:

以上程序我们可以看到,实现两个整数的加法用到的是Sum方法,实现两个浮点型的加法也是用的Sum方法,这就是方法的重载。那么重载唯一需要注意的是:除了方法名可以一致外,其余所有的类型都得与返回类型、形参、实参一致。


 

3.3方法签名

在同一个作用域中不能定义两个相同名称的标识符。比如:方法中不能定义两个名字一样的变量,那为什么类中就可以定义方法名相同的方法呢?那是因为有了方法的签名。
方法签名即:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字。

public class Test {
    public static int Sum(int x,int y) {
        return x+y;
    }
    public static double Sum(double x,double y) {
        return x+y;
    }
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        double c = 3.1;
        double d = 4.2;
        int ret1 = Sum(a,b);
        double ret2 = Sum(c,d);
        System.out.println(ret1);
        System.out.println(ret2);
    }
}

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

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

 以上图片中的Test.Sum:(II)I对应就是Sum(int int),Test.Sum:(DD)D对应的就是Sum(double double)。证明了3.1中提到的方法的重载是Java的一个功能。常见的签名符号为:

特殊字符数据类型
Vvoid
Zboolean
Bbyte
Cchar
Sshort
I

int

Jlong
Ffloat
Ddouble
[数组
L引用类型

4.递归

在我们生活中会听到这样一则故事:从前有座山山里有座庙......。然后你会讲给你的朋友,你的朋友会讲给他的朋友就这样递归下去。


4.1递归的概念

一个方法在执行过程中调用自己,就称为递归。比如我们要求N!,我们会依次从N*到1,因此我可以把1设置为终止条件,只要*到1程序就结束。当然递归的时候,我们最好是找到一个公式。就那N!来说。我可以这样设置N*(N-1)。并且终止条件设置为N==1。

递归的必然条件:

  1. 将原问题划分为一个个子问题,子问题必须要与原问题的解法相同
  2. 必须要有终止条件

如求5的阶乘:

public class Test {
    public static int diGui(int n) {
        if(n==1) {
            return 1;
        }
        return n * diGui(n-1);
    }
    public static void main(String[] args) {
        int ret = diGui(5);
        System.out.println(ret);
    }
}

输出:

 


4.2递归执行过程

递归的程序执行过程不太容易理解,我们必须通过一个流程图或者调用编译器底层栈帧来理解,方法是如何一步步调用自己并且结束调用自己的。

如求5的阶乘:

public class Test {
    public static int diGui(int n) {
        System.out.println("递归开始,n="+n);
        if(n==1) {
            System.out.println("递归结束,n=1 ret=1");
            return 1;
        }
        int ret = n * diGui(n-1);
        System.out.println("递归结束,n="+n+",ret="+ret);
        return ret;
    }
    public static void main(String[] args) {
        int ret = diGui(5);
        System.out.println("ret="+ret);
    }
}

输出:

 执行流程图:


以上就是本篇博文的全部内容了,感谢您的阅读!

 Never Give Up

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos 虚拟机安装

文章目录Centos 虚拟机安装一、模版虚拟机环境准备安装VMvare&#xff0c;安装CentosCentos 虚拟机安装 一、模版虚拟机环境准备 安装VMvare&#xff0c;安装Centos 创建虚拟机&#xff0c;然后选择自定义安装 然后是默认的&#xff0c;点一下步 这一步选择稍后安装操作系…

Java下浅谈String.valueOf()

今日遇到遇见无语的事情&#xff0c;mybatis查询数据库结果 List<Map<String, String>> 需要转换为字符串&#xff0c;但是在debug时&#xff0c;在idea小窗口单独执行代码&#xff0c;是可以正常编译的&#xff0c;离开idea小窗口执行就报错&#xff1a; 类型转换…

Anaconda安装Pytorch(win系统)

前面有一篇博客专门讲了安装CPU版本的Pytorch&#xff0c;因为当时没有GPU&#xff0c;现在有了3090&#xff0c;专门记录一下安装GPU版的过程。一、添加清华源可参考官方anaconda | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror创建虚拟环境若没有…

一文解决Vue所有报错【持续更】

前言 Vue是一个流行的前端框架&#xff0c;许多web开发人员使用Vue来构建他们的应用程序。然而&#xff0c;正如任何其他框架一样&#xff0c;Vue也可能会发生错误。在这篇技术文章中&#xff0c;我们将探讨Vue常见的报错以及如何解决它们。 常见错误 1. Vue Template Error …

【目标检测】61、Dynamic Head Unifying Object Detection Heads with Attentions

文章目录一、背景二、方法2.1 scale-aware attention2.2 spatial-aware attention2.3 task-aware attention2.4 总体过程2.5 和现有的检测器适配2.6 和其他注意力机制的关联三、效果四、代码论文链接&#xff1a; https://arxiv.org/pdf/2106.08322.pdf代码链接&#xff1a;htt…

一文带你了解阿里的开源Java诊断工具 :Arthas

Arthas 是阿里开源的 Java 诊断工具&#xff0c;相比 JDK 内置的诊断工具&#xff0c;要更人性化&#xff0c;并且功能强大&#xff0c;可以实现许多问题的一键定位&#xff0c;是我用到的最方便的诊断工具。 下载和安装见官网 https://arthas.aliyun.com/doc/profiler.html 下…

Gem5模拟器,如何在linux系统中查看内存、CPU、硬盘、进程、网络等信息(十二)

虽然说&#xff0c;这个记录的是与Linux相关的操作&#xff0c;每次查每次忘&#xff0c;必须写一个来归总一下&#xff0c;以免我漫山遍野找命令。但是不想新开一一个主题&#xff0c;再加上确实是在运行模拟器时会关注这方面的信息&#xff0c;就把这一节搁这儿啦。 常见的查…

MedCalc v20.217 医学ROC曲线统计分析参考软件

MedCalc是一款医学 ROC 曲线统计软件,用于ROC曲线分析的参考软件,医学工作者设计的医学计算器,功能齐全。它可以帮助医生快速作出普通的医学计算,从而对症下药。提供超过76种常用的规则和方法,包括:病人数据、单位参数、费用计算等等。甚至可以将图形另存为BMP,PNG,GIF…

ATL中__if_exists的替代方案

__if_exists 和 __if_not_exists 是什么? __if_exists 和 __if_not_exists 是微软 ATL (Active Template Library&#xff0c;活动模板库) 中的关键字&#xff0c;可以用来在编译期间测试一个标识符是否存在。如果该标识符存在&#xff0c;则其关联的语句将会被执行。 __if_e…

2023年3月软考中级(系统集成项目管理工程师)报名走起!!!

系统集成项目管理工程师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职…

【Vue】Vue常见的6种指令

Vue的6种指令-前言指令&#xff08;Directives&#xff09;是vue 为开发者提供的模板语法&#xff0c;用于辅助开发者渲染页面的基本结构。vue 中的指令按照不同的用途可以分为如下6 大类① 内容渲染指令 ② 属性绑定指令 ③ 事件绑定指令 ④ 双向绑定指令 ⑤ 条件渲染指令 ⑥ …

Fortinet设备审计

作为网络安全领域的领导者&#xff0c;Fortinet提供了多种网络安全解决方案&#xff0c;包括下一代防火墙&#xff0c;即FortiGate。通过EventLog Analyzer的FortiGate预定义报表以及其他Fortinet应用程序的详尽列表&#xff0c;充分发挥Fortinet设备的最大作用。FortiGate您的…

粒子群算法

粒子群算法1 粒子群算法介绍2 基本思想3 算法流程4 代码实现1 粒子群算法介绍 粒子群优化算法(PSO&#xff1a;Particle swarm optimization) 是一种进化计算技术&#xff08;evolutionary computation&#xff09;。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想是通过…

我建议,专家不要再建议了

作者| Mr.K 编辑| Emma来源| 技术领导力(ID&#xff1a;jishulingdaoli)关于买房&#xff0c;专家建议&#xff1a;不建议掏空六个钱包凑首付。&#xff08;网友&#xff1a;丈母娘等不到我自己挣够&#xff09;关于农村剩男多&#xff0c;城市剩女多&#xff0c;专家建议&am…

Adobe illustrator学习笔记

Adobe illustrator学习笔记 生命有限&#xff0c;设计无限 学习Adobe illustrator主要是用来制作SVG图片去制作字体图标&#xff0c;因此笔记内容大多会围绕SVG展开。 2023-3-5 1、Adobe illustrator简介 主要用于制作矢量图和插图 2、颜色模式介绍 显示颜色&#xff1a;RGB…

EXCEL里的各种奇怪计算问题:数字后面自动多了 0.0001, 数字后面位数变成000,以及一些取整,数学函数

1 公式计算后的数&#xff0c;用只粘贴数值后&#xff0c;后面自动多了 0.0001&#xff0c;导致不再是整数的问题 问题入戏 见第1个8400&#xff0c;计算时就出现了问题&#xff0c;按正常&#xff0c;这里8400应该是整数&#xff0c;而不应该带小数&#xff0c;但是确实就计…

我不写单元测试,被批了

我是3y&#xff0c;一年CRUD经验用十年的markdown程序员&#x1f468;&#x1f3fb;‍&#x1f4bb;常年被誉为职业八股文选手最近在看单元测试的东西&#xff0c;想跟大家聊聊我的感受。单元测试这块说实在的&#xff0c;我并不太熟悉&#xff0c;我几乎不写单元测试&#xff…

项目中维护一个随时更新的ui库的解决方案之一(uniapp+uview-plus)

1. 环境准备 需要准备两个仓库&#xff0c;第一个仓库用来存uniapp项目的相关代码&#xff0c;第二个用来存放uview-plus UI库的代码&#xff08;第二个仓库的仓库名称为uview-plus&#xff09; 2. 项目结构 我们uniapp目录结构大致如下 我们维护的ui组件应该是uni_modules下…

详解JAVA类加载器

目录 1.概述 2.双亲委派 3.ServiceClassLoader 4.URLClassLoader 5.加载冲突 1.概述 概念&#xff1a; 类加载器&#xff08;Class Loader&#xff09;是Java虚拟机&#xff08;JVM&#xff09;的一个重要组件&#xff0c;负责加载Java类到内存中并使其可以被JVM执行。类…

抢先看!界面控件DevExtreme 2023产品路线图曝光

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序&#xff0c;该套件附带功能齐…