方法的使用

news2024/11/29 16:32:33

 

目录

1. 举例说明什么叫方法

2. 方法概念及使用

2.1 什么是方法(method)

1.2 方法定义

1.3 方法调用的执行过程

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

2. 方法重载

2.1 为什么需要方法重载

2.3 方法签名

3. 递归

递归执行过程分析


1. 举例说明什么叫方法

 

我们利用面向对象的方式来说明什么叫做方法。

我们假设我们有一只猫,这个类型叫做cat类(这里运用到一些面向对象的内容,不用纠结),那么我们这只猫有那些属性呢?

我们假设它的名字叫做marry,年龄为2岁,颜色为白色。

那么它肯定还有一些行为对吧,比如跑,跳,叫,这些都是它的行为,我们称之为方法。

public class demo {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.speak();//speak()这就是方法,我们通过 . 来调用方法
    }
}
class Cat{
    String name ;
    int age ;
    String color;
    public void speak(){
        System.out.println("喵喵喵");
    }
}

2. 方法概念及使用

2.1 什么是方法(method)

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

比如我上述的例子,小猫 喵喵喵 就是一个方法。

1.2 方法定义

方法语法格式:

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

这个修饰符我们以后会有一章重点讲解,这里先不用理解。

示例: 实现一个两个整数相加的方法

public class Method{
// 方法的定义
    public static int add(int x, int y) {
    return x + y;
    }
}

当然啦,方法和C语言中的函数还是有很多不同的。

注意事项:

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

1.3 方法调用的执行过程

方法调用过程
调用方法--->传递参数--->找到方法地址--->执行被调方法的方法体--->被调方法结束返回--->回到主调方法继续往下执行。
就好像做菜,干什么都需要一步一步得走。
注意事项
定义方法的时候 , 不会执行方法的代码 . 只有调用的时候才会执行 .
一个方法可以被多次调用 .

举例:

public class Method {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        System.out.println("第一次调用方法之前");
        int ret = add(a, b);
        System.out.println("第一次调用方法之后");
        System.out.println("ret = " + ret);
        System.out.println("第二次调用方法之前");
        ret = add(30, 50);
        System.out.println("第二次调用方法之后");
        System.out.println("ret = " + ret);
    }
    public static int add(int x, int y) {
        System.out.println("调用方法中 x = " + x + " y = " + y);
        return x + y;
    }
}
// 执行结果
一次调用方法之前
        调用方法中 x = 10 y = 20
        第一次调用方法之后
        ret = 30
        第二次调用方法之前
        调用方法中 x = 30 y = 50
        第二次调用方法之后
        ret = 80

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

这个和C语言中的一样,都是一个形参和一个实参,但是和C语言不一样的我们这里只有传值传递,没有了传址传递,具体的以后会细讲。

注意: 在Java中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体

就拿C语言中比较经典的案例来说明,交换两个数的值

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 方法调用时,只是将实参 a b 中的值拷贝了一份传递给了形参 x y,具体的解析可以参考之前的C语言。

2. 方法重载

2.1 为什么需要方法重载

比如:我们要求两个数相加,到后面我又需要去求三个、四个、五个数的相加,我不可能去取那么多名字,然后根据不同的名字去找方法,这样太辛苦了。

Java提供了便利,Java中允许同一类中有多个同名的方法的存在,但是要求形参列表不一致。

class 类名{ 
    public static int addInt(int x, int y) {
        return x + y;
    }
    public static double addDouble(double x, double y) {
        return x + y;
    }
}

切记啊,在同一类中的才叫重载。

注意:
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 个错误

2.3 方法签名

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

L两个同名的方法假设命名为sum(_int,_int),程序就无法识别,而sun(_double,_double)就可以被区分开。

如下图所示:

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

特殊字符数据类型
Vvoid
Zboolean
Bbyte
Cchar
Sshort
Iint
Jlong
Ffloat
Ddouble
[数组(以[开头,配合其他的特殊字符,表述对应数据类型的数组,几个[表述几维数组)
L引用类型,以L开头,以;结尾,中间是引用类型的全类名

3. 递归

递归的概念相信大家都懂,我也就不介绍了。

我们直接看例子:递归求 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;
        } in
        t 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

相信大家学过C语言的基本都做过这个。

其他递归的本质就是:追溯,利用后进后出,从追溯底部开始输出步骤。

递归调用的规则:

1. 执行一个方法时,就创建一个新的受保护的独立空间也就是:栈空间。

2. 方法的局部变量是独立的。

3. 如果方法中调用的是引用数据类型(比如数组,类),就需要共享该引用数据类型的数据(存放于堆区中)。

4. 递归必须无限逼近退出条件。

递归执行过程分析

递归的程序的执行过程不太容易理解, 要想理解清楚递归, 必须先理解清楚 "方法的执行过程", 尤其是 "方法执行结束之后, 回到调用位置继续往下执行".
就拿上面的代码画图:

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

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

相关文章

2022年特色小镇行业研究报告

第一章 行业概况 特色小镇是在几平方公里土地上集聚特色产业、生产生活生态科技相融合、不同于行政建制镇和产业园区的创新创业平台。根据类型的不同,特色小镇可以分为三类,即产业类、社区类和旅游类。 产业类:通过招商引资吸引企业进入&…

门控循环单元(GRU)【动手学深度学习v2】

理论 候选隐藏状态。 圆圈 表示 按元素乘法。 这里面的 这个符号值得是 按元素相乘。 Rt理解为 和Ht 长度一样的一维向量。(这么理解) 这里如果Rt长的像0的话,那么乘出来的结果,就也像0。 要是像0 的话,相当于是说…

文件操作之文件系统

目录 一 磁盘 1 磁盘的物理结构 2 磁盘在物理结构上如何存储数据 CHS寻址 3 从物理结构到抽象结构 LBA寻址 4管理 二 块组 boot block super block inode table data blocks block bitmap GDT:Global Descriptor Table 块组描述符 三 文件名和目录之…

网课查题接口搭建

网课查题接口搭建 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台(点击跳…

字符串匹配算法(C/Java实现)

目录BF算法C语言实现Java实现KMP算法Java实现C语言实现next[]数组的优化BF算法 BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,…

R语言代做实现:混合正态分布EM最大期望估计法

全文链接:http://tecdat.cn/?p4815 原文出处:拓端数据部落公众号 因为近期在分析数据时用到了EM最大期望估计法这个算法,在参数估计中也用到的比较多。然而,发现国内在R软件上实现高斯混合分布的EM的实例并不多,大多…

Linux系统下实现开机自动加载驱动模块

在使用模块化加载驱动时,若系统内部存在同类别设备驱动,可能会出现无法加载我们添加的动态模块,比如Linux系统内置了CDC驱动,当我们使用兼容CDC和VCP驱动USB转串口芯片时,就会出现上电出现的是CDC串口,从而…

vue3 组件响应式v-model 失效,实践踩坑,一文搞懂组件响应式原理,对初学者友好

文章目录前情提要实战解析最后前情提要 vue3的v-model已经有了变化,假如你还不知道其中细节,看完这篇文章你就完全明白了,我以踩坑的场景来进行解析。起因是在我的项目中需要一个输入框组件,这个组件用来根据输入异步查询系统内已…

Python编程 基础数据类型

作者简介:一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言: 一.Python基础数据类型 1.为什么会有数据类型?&am…

公共云和私有云之间的区别

目前,越来越多的公司正在调整云服务来运行他们的应用程序。其实,有不同类型的云部署模型来满足客户的不同需求。云部署模型分为三种类型:公有云、私有云和混合云(公有云和私有云的混合)。在本文中,我们将对公共云和私有云之间的区…

【数据结构】单链表——单链表的定义及基本操作的实现(头插、尾插、头删、尾删、任意位置的插入与删除)

🧑‍💻作者: 情话0.0 📝专栏:《数据结构》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢! 单链表前言…

分享30个PHP源码,总有一款适合你

链接:https://pan.baidu.com/s/1dVbUn5YFMOze4J-K8sCAXQ?pwdeinu 提取码:einu 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下...,大家下载后可以看到。 Emlog for SAE 适合新浪sae使用的个人博客…

网关Gateway-快速上手

gateway网关官方文档: https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/# 网关的概念 网关作为流量的入口,常用的功能包括路由转发,权限校验,限流等。 Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关…

Java:修改Jar的源码,并上传Nexus私有仓库,替换jar版本

第一步:修改jar包源代码 建一个全类名一模一样的类,然后把要修改的类的代码复制过去,然后编译生成class。然后拿编译后的class覆盖到jar中对应的位置 第二步:上传nexus jar文件,pom文件:在本地仓库中可以…

Linux操作系统~进程有哪些状态?

目录 R状态 S/D状态 什么是D状态 T状态 X状态 Z状态 什么是等待队列,什么是运行队列,什么是挂起/阻塞,什么叫唤醒进程 对比宏观上操作系统的三种状态 从操作系统宏观的概念上讲,进程有三种状态,就绪态&#xff0…

自动化测试和测试自动化你分的清楚吗?

目录 前言 两种自动化测试 为什么测试自动化对连续测试至关重要 使测试自动化成为现实 拥抱连续测试 总结 重点:配套学习资料和视频教学 前言 当我们谈论持续测试,以及持续交付和DevOps时,“自动化”一词就泛滥了。从根本上讲&#xf…

ES6之对象解构

对象和数组字面量是JavaScript中两种最常用的数据结构,由于JSON数据格式的普及,二者已经成为语言中最重要的一部分。在代码中,我们经常定义很多对象和数组,然后从去提取相关的信息片段,ES6为简化这种任务引入了新特性&…

猿代码浅谈MPI与OpenMP并行程序设计

一、什么是OpenMP? OpenMP是一种用于共享内存并行系统的多线程程序设计的库(Compiler Directive),特别适合于多核CPU上的并行程序开发设计。它支持的语言包括:C语言、C、Fortran;不过,用以上这些语言进行程序开发时,并非需要特别…

一文读懂qt界面设计(分裂器,布局,拉伸,各种属性设置)

可以先看看我这个文章:qt关于界面设计中的一些知识总结_我是标同学的博客-CSDN博客_qt 水平伸展 现在我们来正式开始讲解。 布局种类 qt中能称为布局管理器的有如下6个: 水平布局(QHBoxLayout)垂直布局(QVBoxLayout…

数字电路基础04(查找表LUT)

文章目录 LUT(Look Up Table)为什么要用LUT?示例(3输入LUT)LUT(Look Up Table) 在FPGA中,利用LUT来实现组合逻辑的功能,将组合逻辑的输入输出结果,存储为真值表的形式,来代替传统的由逻辑门组成的组合逻辑电路LUT就是将组合逻辑转换成真值表LUT实际上是将输入数据作…