【JavaSE】--方法的使用

news2024/11/19 15:24:33

文章目录

  • 1. 方法概念及使用
    • 1.1 什么是方法
    • 1.2 方法定义
    • 1.3 方法调用的执行过程
    • 1.4 实参和形参的关系(重要)
    • 1.5 没有返回值的方法
  • 2. 方法重载
    • 2.1 方法重载概念
    • 2.2 方法签名
  • 3. 递归
    • 3.1 递归的概念
    • 3.2 递归执行过程分析
    • 3.3 递归练习

1. 方法概念及使用


1.1 什么是方法

方法就是一个代码片段. 类似于 C 语言中的 “函数”。方法存在的意义(不要背, 重在体会):

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

1.2 方法定义

方法语法格式:在这里插入图片描述

注意事项:

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

1.3 方法调用的执行过程

【方法调用过程】
调用方法—>传递参数—>找到方法地址—>执行被调方法的方法体—>被调方法结束返回—>回到主调方法继续往下执行.

【注意事项】

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

1.4 实参和形参的关系(重要)

代码示例:

public static boolean func(int year){
        year = 100;
    }
public static void main(String[] args) {
    int year = 2008;
    func(year);
    System.out.println(year);
}

所有方法在调用的时候,要在栈上开辟内存,叫做栈帧。程序开始调用main方法,会在栈上开辟一块内存,来作为main()方法的栈帧. 在调用 func() 方法时,也会在栈上开辟一块内存来作为 func() 的栈帧。

此时在main方法中的year的值是2008,在 func() 方法调用的时候,我们将main()方法中year中的值给到了 func() 中的year, 此时 func() 方法中的值也是2008。

但是我们在 func() 中修改year的值,不会影响main方法中year的值,我们在 func() 中修改的只是形参的值,当 func() 这个方法执行完就会将这个方法的栈帧销毁掉。此时程序回到main方法打印year的值,此时打印出来的还是2008.

这个例子说明了形参值的改变不会影响实参的值。

Java当中是拿不到栈上的地址的。

在Java中,实参的值永远都是拷贝到实参中的(传值调用),形参和实参本质上是两个实体。

解决方法: 传引用类型参数(例如数组).

1.5 没有返回值的方法

方法的返回值是可选的. 有些时候可以没有,没有时返回值类型必须写成void.

2. 方法重载


2.1 方法重载概念

在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。

public class TestMethod {
    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) {
        return x + y;
    }
    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;
    }
}

注意:

  1. 方法名必须相同
  2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序三者必须有一个不同)
  3. 与返回值类型是否相同无关.
// 注意:两个方法如果仅仅只是因为返回值类型不同,是不能构成重载的
public class TestMethod {
     public static void main(String[] args) {
         int a = 10;
         int b = 20;
         int ret = add(a, b);
         System.out.println("ret = " + ret);
     }
     public static int add(int x, int y) {
         return x + y;
     }
     public static double add(int x, int y) {
         return x + y;
     }
 }
// 编译出错
// Test.java:13: 错误: 已在类 Test中定义了方法 add(int,int)
// public static double add(int x, int y) {
//        ^
//     1 个错误

  1. 编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法.

判断是否构成重载,我们只看前两条是否满足。

2.2 方法签名

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

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);
       }
   }

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

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

3. 递归


3.1 递归的概念

一个方法在执行过程中调用自身, 就称为 “递归”.

解决递归问题:

  1. 推出一个递推公式(难)。
  2. 找到当前问题的递归“结束条件”(起始条件)。
    注意: 考虑怎么“递” 考虑怎么“归”------要有"递" 有 “归”.

3.2 递归执行过程分析

递归求 N 的阶乘

在这里插入图片描述
关于 “调用栈”
方法调用的时候, 会有一个 “栈” 这样的内存空间描述当前的调用关系. 称为调用栈.
每一次的方法调用就称为一个 “栈帧”, 每个栈帧中包含了这次调用的参数是哪些, 返回到哪里继续执行等信息.

3.3 递归练习

代码示例1 按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)

public static void print(int num) {
    if (num > 9) {
        print(num / 10);
    }
    System.out.println(num % 10);
}

代码示例2 递归求 1 + 2 + 3 + … + 10

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 int sum(int num) {
    if (num < 10) {
        return num;
    }
    return num % 10 + sum(num / 10);
}

代码示例4 求斐波那契数列的第 N 项

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

当我们求 fib(40) 的时候发现, 程序执行速度极慢. 原因是进行了大量的重复运算.
可以使用循环的方式来求斐波那契数列问题, 避免出现冗余运算。

public static int fib(int n) {
    int last2 = 1;
    int last1 = 1;
    int cur = 0;
    for (int i = 3; i <= n; i++) {
        cur = last1 + last2;
        last2 = last1;
        last1 = cur;
    }
    return cur;
}

此时程序的执行效率大大提高了.

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

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

相关文章

解码3D数字人及AIGC产品,如何赋能医美行业全场景业务增长

9月13日&#xff0c;第六届“医美小小聚”暨医美信息与服务创新发展大会在热烈的氛围中拉开帷幕。此次盛会汇聚了医美行业的顶尖精英与前瞻者&#xff0c;他们围绕“聚焦营销&#xff0c;合规增长&#xff0c;融合共创”的主题&#xff0c;深入剖析了行业的新趋势、新机遇与新挑…

SpringBoot开发——整合SSL证书启用HTTPS协议

文章目录 1、https协议2、SpringBoot项目启用HTTPS协议过程2.1 创建SpringBoot项目2.2 准备SSL证书2.3SpringBoot设置2.4启动项目 1、https协议 网站使用的协议包括&#xff1a;http协议和https协议。http协议就是网址以http://开头的&#xff0c;https协议就是网址以https://…

http连接github远程仓库密码问题解决办法

目录 一、问题&#xff1a;使用http连接失败 二、解决办法&#xff1a;使用个人访问令牌。 1、生成访问令牌&#xff1a; 步骤 1: 登录 GitHub 步骤 2: 进入设置页面 步骤 3: 生成新的访问令牌 步骤 4: 配置访问令牌 步骤 5: 复制令牌 2. 使用访问令牌 一、问题&#…

从卷积的物理意义出发的第二种卷积计算方法

禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;电子信息前沿技术丛书&#xff09;》P78 第一&#xff0c;从物理意义理解卷积&#xff0c;为什么要卷&#xff0c;为什么要积。全名卷积和&#xff0c;先卷&#xff0c;再积&#xff0c;后和。 第二&#xff0c;这种方式计算节…

类加载机制和双亲委派

打印一个类加载器的示例。 import java.net.URL; import sun.misc.Launcher;public class TestJDKClassLoader {public static void main(String[] args) {System.out.println(String.class.getClassLoader());System.out.println(com.sun.crypto.provider.DESKeyFactory.clas…

Mysql 搭建主从复制

Docker Mysql 镜像启动命令(主库) docker run --name mysql-master -ti -d --privileged"true" -p 3306:3306 alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/mysql_optimized:20240221-8.0.32-2.3.0 mysql_keentune.sh 修改临时密码 如果您…

OpenCV 4.10 windows 上编译并上传conan

目录 一. 上传opencv 预编译包 二. 自己手动写一个测试包并上传 三. 自己写一个app, 引用包 一. 上传opencv 预编译包 1. 下载Opencv, 并用cmake 打开 打开工程之后&#xff0c;编译&#xff0c;install&#xff0c; 目录如下 2. 准备conan 包 把Debug 和 Release 分开放 3…

CTFHub技能树-密码口令-弱口令

目录 前提知识 BrupSuite爆破的四种模式详解 解题过程 通常认为容易被别人&#xff08;他们有可能对你很了解&#xff09;猜测到或被破解工具破解的口令均为弱口令。 前提知识 BrupSuite爆破的四种模式详解 四种模式分别为&#xff1a;Sniper、Battering ram、Pitchfork、…

Visual Studio 2022从外部引入dll导致的问题

这里以我学MapGIS二次开发的一个小demo为例 一、如何引入dll 1、在解决方案资源管理器中&#xff0c;有个引用的选项 2、然后右键点击添加引用 点击之后会出现如下&#xff1a; 3、点击浏览选项&#xff0c;选择想要引入dll的路径&#xff0c;这里我选择下载MapGIS 10的路径 …

[LitCTF 2024]SAS - Serializing Authentication

题目提示反序列化 源码 <?phpclass User {public $username;public $password;function __construct($username, $password) {$this->username $username;$this->password $password;}function isValid() { return $this->username admin && $this-&g…

《JavaEE进阶》----17.<Mybatis基本操作【注解XML】>

本篇博客详细讲解了&#xff1a;编写SQL语句 1.使用注释 2.使用XML 3.多表查询 前言&#xff1a; Mybatis规范中方法名不能重复&#xff0c;即便参数不同。因为每一个方法名都是有一个唯一的ID标识的。因此不能重复。 我们会将数据库相关的接口放在Mapper包下面。 对&#xff0…

Latex输入数学期望E及花体符号方法

一、数学期望 E \mathbb{E} E 使用Latex写论文时&#xff0c;我们希望输入如下图所示的数学期望&#xff1a; 方法如下&#xff1a; 首先需要导入\usepackage{amssymb}包&#xff0c;然后正文使用描述为\mathbb{E} 二、花体 B \mathcal{B} B 此外&#xff0c;当我们希望…

外贸获客:主动开发有用吗?

今天主要和大家聊聊&#xff0c;做外贸几个常用的获客渠道。 开发客户的渠道大体上分两种&#xff1a;1、主动开发&#xff1b;2、被动询盘 我们一一进行解析。1、社交媒体开发 即利用社交媒体&#xff0c;如Youtube、LinkedIn、Instagram、TikTok、Facebook等平台进行客户开发…

30道软件测试基础面试题!(含答案)

1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前 3 年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&a…

JS Reflect 对象 — 深度解析

JS Reflect 对象 — 深度解析 在JavaScript的广阔天地里&#xff0c;Reflect对象如同一面明镜&#xff0c;映射出底层语言操作的精髓。作为前端开发者&#xff0c;掌握Reflect对象及其相关API&#xff0c;无疑能够提升我们的编程技艺&#xff0c;让代码更加简洁、高效。接下来&…

AV1 Bitstream Decoding Process Specification--[1]:术语和定义

原文地址&#xff1a;https://aomediacodec.github.io/av1-spec/av1-spec.pdf没有梯子的下载地址&#xff1a;AV1 Bitstream & Decoding Process Specification摘要&#xff1a;这份文档定义了开放媒体联盟&#xff08;Alliance for Open Media&#xff09;AV1视频编解码器…

浅谈C++入门(1)

​ &#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;C入门 目录 前言 一、C的第一个程序 二、 命名空间 2.1 namespace的价值 2.2 namesapce的定义&#xff08;这里一些东西以记住加理解为主&#xff09; 2.…

国产服务器CPU发展分析

CPU行业概览&#xff1a;信创带动服务器CPU国产化 目前CPU行业由两大生态体系主导&#xff1a;一是基于X86指令系统和Windows操作系统的Wintel体系&#xff0c;主要用于服务器与电脑等&#xff1b;二是基于ARM指令系统和Android操作系统的AA体系&#xff0c;主要用于移动设备…

数据结构加餐:三路划分、自省排序、文件归并排序

数据结构加餐1 1.快排之三路划分2.快排之自省排序3.文件归并排序3.1外排序3.2归并排序的实现3.2.1归并排序思想3.2.2文件归并排序代码实现 1.快排之三路划分 在之前完成的快排仍然存在这一些问题&#xff0c;当重复数据较多时&#xff0c;快速排序选择的基值也会较不恰当&#…

SaaS化多租户实现的两种方法

SaaS化多租户实现的两种方法 SaaS系统的定义 SaaS&#xff0c;全称为Software-as-a-Service&#xff08;软件即服务&#xff09;&#xff0c;是一种基于云计算的软件交付模式。而SaaS系统&#xff0c;即是通过这种模式提供给用户的软件系统。即多租户系统&#xff0c;每个租户…