【JAVASE】带你了解的方法魅力

这篇具有很好参考价值的文章主要介绍了【JAVASE】带你了解的方法魅力。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【JAVASE】带你了解的方法魅力,JAVASE,java,开发语言

✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉

🍎个人主页:橘橙黄又青-CSDN博客

目标:

1. 掌握方法的定义以及使用
2. 掌握方法传参
3. 掌握方法重载
4. 掌握递归

 废话不多说,我们直接开始

🍎1.方法概念

1.1什么是方法(method)

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

 1.2 方法定义

方法语法格式:

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

 比如说:

实现一个函数,检测一个年份是否为闰年
public class Method{
    // 方法定义
    public static boolean isLeapYear(int year){
        if((0 == year % 4 && 0 != year % 100) || 0 == year % 400){
            return true;
        }else{
            return false;
        }
    }
}
注意事项
1. 修饰符:现阶段直接使用 public static 固定搭配
2. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void
3. 方法名字:采用小驼峰命名
4. 参数列表:如果方法没有参数, () 中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
5. 方法体:方法内部要执行的语句
6. 在java当中,方法必须写在类当中
7. java 当中,方法不能嵌套定义
8. java 当中,没有方法声明一说

1.3 方法调用的执行过程

方法调用过程
调用方法 --- > 传递参数 --- > 找到方法地址 --- > 执行被调方法的方法体 --- > 被调方法结束返回 --- > 回到主调方法继续往下 执行。
【JAVASE】带你了解的方法魅力,JAVASE,java,开发语言

注意事项

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

 比如说:

计算 1! + 2! + 3! + 4! + 5!
代码:
public class TestMethod {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 1; i <= 5; i++) {
            sum += fac(i);
        }
        System.out.println("sum = " + sum);
    }
    public static int fac(int n) {
        System.out.println("计算 n 的阶乘中n! = " + n);
        int result = 1;
        for (int i = 1; i <= n; i++) {
            result *= i;
        }
        return result;
    }
}

输出结果:

计算 n 的阶乘中 n ! = 1
计算 n 的阶乘中 n ! = 2
计算 n 的阶乘中 n ! = 3
计算 n 的阶乘中 n ! = 4
计算 n 的阶乘中 n ! = 5
sum = 153
使用方法 , 避免使用二重循环 , 让代码更简单清晰 .

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

Java中方法的形参就相当于sum函数中的自变量n,用来接收sum函数在调用时传递的值的。形参的名字可以随意取,对方法都没有任何影响,形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值

比如说:

public static int getSum(int N){ // N是形参
    return (1+N)*N / 2;
}
getSum(10); // 10是实参,在方法调用时,形参N用来保存10
getSum(100); // 100是实参,在方法调用时,形参N用来保存100
再比如:
public static int add(int a, int b){
return a + b;
}
add(2, 3); // 2和3是实参,在调用时传给形参a和b

【JAVASE】带你了解的方法魅力,JAVASE,java,开发语言

注意: Java 中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体
代码示例 : 交换两个整型变量
public class TestMethod {
    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 = 20 y = 10
main : a = 10 b = 20
可以看到,在 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 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

1.5 没有返回值的方法

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

代码示例

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

🍎2. 方法重载

2.1 为什么需要方法重载

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);
        double a2 = 10.5;
        double b2 = 20.5;
        double ret2 = add(a2, b2);
        System.out.println("ret2 = " + ret2);
    }
    public static int add(int x, int y) {
        return x + y;
    }
}
// 编译出错
Test . java : 13 : 错误 : 不兼容的类型 : double 转换到 int 可能会有损失
double ret2 = add ( a2 , b2 );
                ^

由于参数类型不匹配, 所以不能直接使用现有的 add 方法. 

一种比较简单粗暴的解决方法如下:  

public class TestMethod {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int ret = addInt(a, b);
        System.out.println("ret = " + ret);
        double a2 = 10.5;
        double b2 = 20.5;
        double ret2 = addDouble(a2, b2);
        System.out.println("ret2 = " + ret2);
    }
    public static int addInt(int x, int y) {
        return x + y;
    }
    public static double addDouble(double x, double y) {
        return x + y;
    }
}
上述代码确实可以解决问题,但不友好的地方是:需要提供许多不同的方法名,而取名字本来就是让人头疼的事情。那能否将所有的名字都给成 add 呢?
答案是可以的。

2.2 方法重载概念

 在自然语言中,经常会出现一词多义的现象,比如:好人”

【JAVASE】带你了解的方法魅力,JAVASE,java,开发语言【JAVASE】带你了解的方法魅力,JAVASE,java,开发语言

在自然语言中,一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合具体的场景。在Java 中方法也是可以重载的。

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

分析:

【JAVASE】带你了解的方法魅力,JAVASE,java,开发语言

注意:

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

 2.3 方法签名

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

【JAVASE】带你了解的方法魅力,JAVASE,java,开发语言 也就是说:由于参数列表不同,编译器会把他们定义成不同的方法。

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

特殊字符
数据类型
V
void
Z
boolean
B
byte
C
char
S
short
I
int
J
long
F
float
D
double
[
数组 ( [ 开头,配合其他的特殊字符,表述对应数据类型的数组,几个 [ 表述几维数组 )
L
引用类型,以 L 开头,以 ; 结尾,中间是引用类型的全类名

🍎3. 递归

 【JAVASE】带你了解的方法魅力,JAVASE,java,开发语言

自身中又包含了自己 ,该种思想在数学和编程中非常有用,因为有些时候,我们 遇到的问题直接并不好解决,但是发现将原问题拆分成其子问题之后,子问题与原问题有相同的解法,等子问题解
决之后,原问题就迎刃而解了

递归的必要条件:  

1. 将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同
2. 递归出口

比如说:

递归求 N 的阶乘文章来源地址https://www.toymoban.com/news/detail-844431.html

public static void main(String[] args) {
    int n = 5;
    int ret = factor(n);
    System.out.println("ret = " + ret);
}
public static int factor(int n) {
    if (n == 1) {
        return 1;
    }
    return n * factor(n - 1); // factor 调用函数自身
}
// 执行结果
ret = 120
关于 "调用栈"
方法调用的时候, 会有一个 "栈" 这样的内存空间描述当前的调用关系. 称为调用栈.
每一次的方法调用就称为一个 "栈帧", 每个栈帧中包含了这次调用的参数是哪些, 返回到哪里继续执行等信息. 后面我们借助 IDEA 很容易看到调用栈的内容.
总体来说:java递归和c语言是一样的
今天的分享就到这里了,感谢观看。

到了这里,关于【JAVASE】带你了解的方法魅力的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JAVASE】带你了解面向对象三大特性之一(多态)

    ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:再无B~U~G-CSDN博客 多态的概念:通俗来说,就是多种形态, 具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状 态。 总的来说:同一件事情,发生在不同对象

    2024年04月14日
    浏览(73)
  • Java开发 - 带你了解集群间的相互调用,你还在等什么?

    目录 前言 导读 项目准备 集群准备 父工程引入子项目 服务调用方HelloService准备 pom文件 yml文件 Controller文件 服务提供方HelloWorld准备  pom文件 yml文件 Controller文件  运行此两个工程  hello_world组集群 集群调用测试 RestTemplate换成Dubbo行不行,怎么换 两个pom文件引入依赖  两个启

    2024年02月09日
    浏览(42)
  • 带你了解大语言模型的前世今生

    本文分享自华为云社区《大语言模型的前世今生》,作者: 码上开花_Lancer 。 大规模语言模型(Large Language Models,LLM),也称大规模语言模型或大型语言模型,是一种由包含数百亿以上参数的深度神经网络构建的语言模型,使用自监督学习方法通过大量无标注文本进行训练。

    2024年02月05日
    浏览(41)
  • 探索高级UI、源码解析与性能优化,了解开源框架及Flutter,助力Java和Kotlin筑基,揭秘NDK的魅力!

    链接: https://pan.baidu.com/s/13cR0Ip6lzgFoz0rcmgYGZA?pwd=y7hp 提取码: y7hp 复制这段内容后打开百度网盘手机App,操作更方便哦 --来自百度网盘超级会员v4的分享 📚【01】Java筑基:全方位指南带你从入门到进阶,打造坚实的Java基础!🔥 🔬【02】Kotlin:深入浅出,揭示Kotlin的奇妙之处,让

    2024年02月12日
    浏览(50)
  • 1分钟带你了解golang(go语言)

    Golang:也被称为Go语言,是一种开源的编程语言。由Google的Robert Griesemer、Rob Pike和Ken Thompson于2007年开始设计,2009年11月正式对外发布。(被誉为21世纪的C语言) 像python一样的优雅,有c一样的性能 天生的协程 编译快 … 编辑器: goland(推荐) 下载链接 vscode 官网:golang.goog

    2024年02月03日
    浏览(43)
  • 不知道该学那一个语言?一文带你了解三门语言

    名字:阿玥的小东东 学习:Python。正在学习c++ 主页:阿玥的小东东 目录 粉丝留言,回答问题 1.首先,初步了解 

    2024年02月21日
    浏览(49)
  • 【JavaSE专栏48】Java集合类ArrayList解析,这个动态数组数据结构你了解吗?

    作者主页 :Designer 小郑 作者简介 :3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。 主打方向 :Vue、SpringBoot、微信小程序 本文讲解了 Java 中集合类 ArrayList 的语法、使用说明和应用场景,并给出了样例代码。

    2024年02月16日
    浏览(60)
  • 【C语言】-- 一篇带你了解指针,内存,解引用

    目录 1、什么是指针? 1.1 内存 1.2 指针变量 二、指针和指针类型 1、指针类型 2、指针+整数 3、指针的解引用 三、野指针 1、野指针成因 (1) 指针未初始化 (2) 指针越界访问 (3) 指针指向的空间释放 2、如何规避野指针 四、指针运算 1、指针-指针        本篇文章我们来了解C语

    2024年02月16日
    浏览(58)
  • 什么是VHDL?一文带你了解VHDL语言

    基于FPGA的SOC在嵌入式系统应用越来越广了,比较流行的硬件描述语言有两种Verilog HDL/VHDL,均为IEEE标准。VHDL如果有C语言基础的话就会比较容易上手。而VHDL语言则需要Ada编程基础。另外VHDL语言具有大量成熟的模块,从某种角度说VHDL更具生命力。 VHDL 的历史 VHDL 的 英 文 全 名

    2024年02月05日
    浏览(48)
  • 【Mysql】一篇带你了解数据定义,操作和查询语言

    目录 数据定义语言DDL(Data Definition Language) 一.对数据库的操作 二.对数据表的操作 数据操作语言DML(Data Manipulation Language) 一.添加 insert into 二.删除  delete 三.修改  update 数据查询语言DQL(Data Query Language) 一.查询 select 二. 1.between ... and ...(在....之间) 2.in, exists

    2024年02月12日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包