13-Java方法

news2024/9/28 9:26:18

目录

1.方法的基本用法

1.1.什么是方法

1.2.方法定义语法

1.3.方法调用的执行过程

1.4.实参和形参的关系

1.5.方法的返回值

2.方法重载

2.1.方法重载定义

2.2.代码示例

3.方法递归

3.1.方法递归定义

3.2.方法递归使用条件

3.3.递归与非递归优劣比较

3.4.递归执行过程分析


1.方法的基本用法

1.1.什么是方法

方法就是一个代码片段。类似于C语言中的函数。分为主方法和自己定义的方法。

方法存在的意义:

  • 能够模块化地组织代码(当代码规模比较复杂时)。
  • 实现代码复用。直接调用现有写好的方法,不必重复造轮子。
  • 让代码更好理解,更简单。

1.2.方法定义语法

//方法定义
public static 方法返回值 方法名称([参数类型 形参 ...]){
     方法体代码;
     [return [返回值];]  //没有返回值直接return;表示方法直接退出
}

//方法调用
返回值变量 = 方法名称(实参...);

注:
1).public 和 static 两个关键字在此处具有特定含义。(后面文章有详细介绍)。

2).方法定义时,参数可有可无。若有要指定其类型。

3).方法定义时,返回值可有可无。若无返回值,则返回值类型应写成 void。

4).方法定义时的参数称为 "形参",方法调用时的参数称为 "实参"。

5).方法的定义必须在类之中,方法定义写在方法调用位置的上方或者下方均可。

6).Java 中没有 "函数声明" 的概念。定义一个方法,要有方法体实现{ }。(特殊方法除外,抽象方法等)

1.3.方法调用的执行过程

  • 定义方法时,不会执行方法的代码。只有调用方法时才会执行。
  • 当方法被调用时,会将实参赋值给形参。
  • 参数传递完毕后,就会执行到方法体代码。
  • 当方法执行完毕之后(遇到 return 语句),回到方法调用位置继续往下执行。
  • 一个方法可以被多次调用。

(对方法的注释采用文档注释)

1.4.实参和形参的关系

形参:方法定义时的参数;实参:方法调用时的参数。

代码示例:交换两个整型变量

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

原因分析:

int a = 10;
int b = 20;

int x = a;
int y = b;

int tmp = x;
x = y;
y = tmp;

Java中的参数传递只有值传递!对于基本类型来说,形参相当于实参的拷贝。即传值调用。对 x 和 y 的修改,不影响 a 和 b。即形参交换了,实参并没有交换。

解决办法:传引用类型参数(例如数组),它还是值传递,只不过这里的值是“地址”。

class Test {
    public static void main(String[] args) {
        int[] arr = {10, 20};
        swap(arr);
        System.out.println("a = " + arr[0] + " b = " + arr[1]);
    }
    public static void swap(int[] arr) {
        int tmp = arr[0];
        arr[0] = arr[1];
        arr[1] = tmp;
    }
}
// 运行结果
a = 20 b = 10

1.5.方法的返回值

方法的返回值是可有可无的。根据当前方法的作用来判断是否有返回值。

有返回值:return 返回值;

无返回值(方法返回值定义为void):不写return语句;也可写只写return语句,直接退出方法。

2.方法重载

2.1.方法重载定义

在同一个类中,定义了一组(若干个)方法,其方法的名称相同,方法的参数不同(参数个数或参数类型),与方法返回值类型和修饰符无关。

2.2.代码示例

class Test {
   public static void main(String[] args) {
       int a = 10;
       int b = 20;
       int ret = add(a, b);
       System.out.println("ret = " + ret);

       double a2 = 10.5;
       double b2 = 20.5;
       double ret2 = add(a2, b2);
       System.out.println("ret2 = " + ret2);

       double a3 = 10.5;
       double b3 = 10.5;
       double c3 = 20.5;
       double ret3 = add(a3, b3, c3);
       System.out.println("ret3 = " + ret3);
  }

  public static int add(int x, int y) {
       return x + y;
  }

  public static double add(int x, int y) {
       return x + y;
  }//编译会报错
  //参数类型为int,返回值类型为double,int->double是小类型->大类型,可自动转换类型。
  //与上面的方法只是返回值不同,当两个方法名相同, 参数相同, 但返回值不同时, 不构成重载。

  public static double add(double x, double y) {
       return x + y;
  }

  public static double add(double x, double y, double z) {
       return x + y + z;
  }
}

println()就是一个最常用的重载方法。

3.方法递归

3.1.方法递归定义

一个方法在执行过程中调用自身,称为递归。一定要注意方法的语义(方法写出来的作用)。

  • 递:拆解问题
  • 归:碰到终止条件时,陆续给返回值

3.2.方法递归使用条件

  • 一个大问题可以拆分为多个子问题
  • 拆分后的子问题和原问题,除了数据规模不一样,解决思路完全相同
  • 必须存在递归终止条件

3.3.递归与非递归优劣比较

递归:程序执行速度慢,原因是进行了大量的重复计算,但代码好想,好写;

非递归(迭代,循环):程序执行效率更高。

3.4.递归执行过程分析

要想理解清楚递归执行过程,必须先理解清楚 "方法的执行过程",尤其是 "方法执行结束之后,回到调用位置继续往下执行。

代码示例: 递归求 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;
}

// 执行结果
函数开始, n = 5
函数开始, n = 4
函数开始, n = 3
函数开始, n = 2
函数开始, n = 1
函数结束, n = 1 ret = 1
函数结束, n = 2 ret = 2
函数结束, n = 3 ret = 6
函数结束, n = 4 ret = 24
函数结束, n = 5 ret = 120
ret = 120

程序按照序号中标识的 (1) -> (8) 的顺序执行。(1)-(4)递;(5)-(8)归。

方法调用的时候,会有一个"栈" 这样的内存空间描述当前的调用关系。称为调用栈。

每一次的方法调用就称为一个"栈帧",每个栈帧中包含了这次调用的参数是哪些,返回到哪里继续执行等信息。



 


 

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

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

相关文章

磷脂PEG衍生物Biotin-PEG-DSPE,生物素PEG磷脂,CAS:385437-57-0

英文名称:Biotin-PEG-DSPE、DSPE-PEG-Biotin 中文名称:生物素-聚乙二醇-磷脂 Item no:X-GF-0068-10k Classification:Biotin PEG DSPE PEG CAS:385437-57-0 MV:可定制,2000、1000、3400、1…

241. 楼兰图腾——树状数组

在完成了分配任务之后,西部 314 来到了楼兰古城的西部。 相传很久以前这片土地上(比楼兰古城还早)生活着两个部落,一个部落崇拜尖刀(V),一个部落崇拜铁锹(∧),他们分别用 V 和 ∧ 的形状来代表各自部落的图腾。 西部 314 在楼兰…

xv6 makefile详解

文章目录makefile语法格式生成qemu可执行文件生成kernel可执行文件生成kernel下的OBJSkernel.ldbuild OBJS_KCSANbuild initcode生成一个fs.img文件系统mkfs用户程序的编译配置工具makefile语法格式 makefile就是一个深搜的过程,最上面的语句是顶级目标&#xff0c…

python-函数、文件、异常、模块

目录 函数 返回值 函数传参 位置参数 关键字传参 缺省参数 不定长参数 匿名函数 文件操作 open 函数 异常 模块 导入模块 函数 返回值 return语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None #定义函数 def a…

Ubuntu系统装机流程(显卡驱动、cuda、cudnn、搜狗输入法、anaconda、pycharm)

整体流程一、安装Ubuntu18.04系统二、安装显卡驱动三、安装Cuda四、安装Cudnn五、安装搜狗输入法六、安装Anaconda七、安装Pycharm社区版一、安装Ubuntu18.04系统 (1)实现用软碟通做好一个装有Ubuntu18.04的系统盘。 (2)打开电脑…

Jenkins自动发布到Docker部署服务器把Jar包打包成镜像并启动容器

《jenkins自动化发布到服务器并自动运行》 第1种方法:使用外部Jar包完成自动化部署(简单方便),正式环境更新jar包时,备份一下旧的的jar包即可。 修改jenkins项目配置 Pre Steps 构建前清除旧的jar包,然后…

计算机网络原理第2章 物理层

目录 2.1 物理层的基本概念 2.2.1 数据通信系统的模型 2.2.2 有关信号的几个基本概念 1.通信 2.调制 3.编码 2.2.3 信道的极限容量 1.信道能够通过的频率范围(奈氏准则) 2. 信噪比(香农公式) 3.奈氏准则与香农公式的比…

Linux操作系统CentOS7安装mysql5.7.x

一、下载mysql5.7.x安装包 🌈 MySQL官方下载:https://dev.mysql.com/downloads/mysql/5.7.html 注意,需要在Windows上解压之后,会有两个压缩包,将其中一个上传 二、将mysql5.7.x安装包上传到Linux服务器 使用 Xftp 上传…

NeurIPS 2022 Spotlight | SNAKE:首个同时进行隐式重建和三维特征点提取的方法

原文链接:https://www.techbeat.net/article-info?id4361 作者:钟程亮 3D特征点检测在物体识别、场景重建等任务中有着重要作用。然而由于点云数据采样的稀疏性,从中检测出3D特征点是一项很有挑战性的任务。虽然原始点云的获取方式有很多种&…

Kafka基础_1

Kafka系列 注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase …

一文讲懂泛型

Java高级Java高级语言特性一. 泛型1. 1 为什么我们需要泛型1. 2 泛型类和泛型接口的定义1. 3 泛型方法1. 4 限定类型变量1. 5 泛型中的约束和局限性1. 6 泛型中的继承规则1. 7 通配符类型1.7.1 问题抛出,为啥需要通配符?1.7.2 ? extends X1.7…

RocketMq的基本概念

🎶 文章简介:RocketMq的基本概念 💡 创作目的:关于RocketMq的基本概念的大致介绍 ☀️ 今日天气:阳光明媚。 📝 每日一言:冬有冬的来意,雪有雪的秘密。 文章目录🐶 1、Ro…

MySQL~DQL查询数据

4、DQL查询数据(最重点) 4.1、DQL (Data Query LANGUAGE:数据查询语言) 所有的查询操作都用它 Select简单的查询,复杂的查询它都能做~数据库中最核心的语言,最重要的语句使用频率最高 SELEC…

Kafka 集群部署与测试

安装Kafka(需要JDK和Zookeeper): 下载Kafka安装包,并解压至node01节点中的/opt/apps目录下。修改配置文件。在server.properties配置文件中指定broker编号、Kafka运行日志存放的路径、指定Zookeeper地址和本地IP。添加环境变量。在/etc/prof…

[ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2018-19475

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

【IDEA】# 快速生成logger、通过Maven的profile配置实现环境的快速切换、常用基础设置

1. 快速生成logger 打开 Settings,找到 Editor 目录下的 Live Templates 选中 Java,点击右侧的加号,创建一个新的模板 在创建模板的相关位置,填上对应的值 Abbreviation:触发的关键字(此处我使用的是 l…

Postman进阶篇(十二)-在脚本中使用pm对象访问接口响应数据(pm.response.*)

在之前的文章中介绍过postman中的两个脚本——pre-request script或test script,在这两个脚本中都有使用到pm对象。(pre-request script详细介绍、Test script详细介绍)pm对象是在postman的脚本中非常重要,也是十分常用的方法。本…

SpringCloud学习笔记 - Nacos配置中心搭建 - Nacos Config

Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。 Spring Cloud Alibaba Nac…

Volo - Rust gRPC 框架入门

一、参考资料 Volo-GitHub Volo-Overview 二、开发环境搭建 1、安装脚手架 # 安装 volo-cli cargo install volo-cli # 验证安装 volo help 2、编写 IDL # 文件 volo_demo.protosyntax "proto3"; package volo.demo;message Item {int64 id 1;string title …

React学习26(react-redux优化 工作使用)

项目结构 优化说明 1&#xff09;容器组件和UI组件混合成一个文件 2&#xff09;无需自己给容器传递store&#xff0c;在index.js入口文件给包裹一个Provider <Provider store {store}><App/> </Provider> 3&#xff09;使用了react-redux后也不用自己在…