当前位置: 首页 > news >正文

Java方法的使用(重点:形参和实参的关系、方法重载、递归)

目录

一、Java方法

     * 有返回类型,在方法体里就一定要返回相应类型的数据。没有返回类型(void),就不要返回!!     * 方法没有声明一说。与C语言不同(C语言是自顶向下读取代码),而Java是全局的,所以不管在main前面或者后面的方法(函数),都能被识别到。     * 同C语言一样,函数不能嵌套定义。Java的方法也不能嵌套定义。

二、实参和形参的关系

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

 三、方法的重载

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

  /**     * 方法重载     * 1.方法名 必须相同     * 2.参数列表不同(个数、类型、顺序)     * 3.返回类型不影响     */

2.方法签名

 四、递归


一、Java方法

同C语言一样,要反复实现一个效果和功能的时候,我们为了方便写了一个有一个函数去调用。Java的方法也类似。

 

     * 有返回类型,在方法体里就一定要返回相应类型的数据。没有返回类型(void),就不要返回!!
     * 方法没有声明一说。与C语言不同(C语言是自顶向下读取代码),而Java是全局的,所以不管在main前面或者后面的方法(函数),都能被识别到。
     * 同C语言一样,函数不能嵌套定义。Java的方法也不能嵌套定义。

    //方法不能嵌套定义!!!err!!!
//    public static void main1(String[] args) {
//        public static void main2(String[] args){
//
//        }
//    }
}


     * 且方法只能写在类当中
    

 举例:实现一个求两数之和的方法

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

二、实参和形参的关系

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

public static void swap(int a,int b) {int tmp = a;a = b;b = tmp;}public static void main3(String[] args) {int x = 10;int y = 20;System.out.println("交换前:x = "+x+" y = "+y);swap(x,y);//形参只是实参的临时拷贝,虽然在函数里交换了值,出了函数就会被销毁,并没有影响实参//不同于C语言,Java没有指针。如果希望改变实参,需要后期学到类和对象。System.out.println("交换后:x = "+x+" y = "+y);}

 

可以发现,交换前后并没有变化,也就是根本没有交换。

这其实并不是我们编写的方法有问题,而是 形参和实参的关系 没有理解

分析: 

 

实参 a b main 方法中的两个变量,其空间在 main 方法的栈 ( 一块特殊的内存空间 ) 中,而形参 x y swap 方法中 的两个变量,x y 的空间在 swap 方法运行时的栈中,因此:实参 a b 与 形参 x y 是两个没有任何关联性的变量, swap 方法调用时,只是将实参 a b 中的值拷贝了一份传递给了形参 x y ,因此对形参 x y 操作不会对实参 a b
产生任何影响。
注意:对于 基础类型 来说 , 形参相当于实参的拷贝 . 传值调用

 三、方法的重载

以add举例,这里定义的求两数之和的的参数,是int和int,那假如我要求float和float的和呢?

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

可以在定义个add2

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

但是还有其他类型都要一个一个重新定义方法吗?

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

  /**
     * 方法重载
     * 1.方法名 必须相同
     * 2.参数列表不同(个数、类型、顺序)
     * 3.返回类型不影响
     */

例如:我这个两个方法都叫add,参数列表不同,就是方法重载。

方法重载的好处就是,只需要记住一个方法名,就可以调用实现相同的功能(尽管参数不同)

public static int add(int a, int b) {return a + b;}public static double add(double a, double b) {return a + b;}public static void main3(String[] args) {System.out.println(add(4, 6));System.out.println(add(1.2,3.8));}

 

 

2.方法签名

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

以上面的add来看,虽然两个类都叫add,但是由于参数不同,构成的完整的方法名其实是不同的,这样也能区别两个类。 

上述代码经过编译之后,然后使用 JDK 自带的 javap 反汇编工具查看,具体操作:
1. 先对工程进行编译生成 .class 字节码文件
2. 在控制台中进入到要查看的 .class 所在的目录
3. 输入: javap -v 字节码文件名字即可

 

 四、递归

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

例如:求n的阶乘,以及阶乘之和 

    public static long fac(long n) {int ret = 1;for (int i = 1;i <= n;i++){ret *= i;}return ret;}public static long facNum(long k) {long sum = 0;for (int i = 1; i <= k; i++) {sum += fac(i);}return sum;}public static void main2(String[] args) {long a = fac(5);System.out.println(a);long b = facNum(5);System.out.println(b);}

         每调用自己一次,就是递的过程,但是往下递的时候自己这个函数并没有销毁。(1,2,3,4就是递)等到最底层,无法继续递的时候,开始将结果,一层一层返回,这个就是归(5,6,7,8就是归)。返回一层,就将这个函数销毁。直到最后返回ret到main函数里。

http://www.lryc.cn/news/102564.html

相关文章:

  • 登录页的具体实现 (小兔鲜儿)【Vue3】
  • 大学如何自学嵌入式开发?
  • pytorch学习——线性神经网络——1线性回归
  • 00 - RAP 开发环境配置
  • 山西电力市场日前价格预测【2023-08-01】
  • QT--day5(网络聊天室、学生信息管理系统)
  • 【用IDEA基于Scala2.12.18开发Spark 3.4.1 项目】
  • HEVC 速率控制(码控)介绍
  • 四大软件测试策略的特点和区别(单元测试、集成测试、确认测试和系统测试)
  • ingress-nginx controller安装
  • 开源快速开发平台:做好数据管理,实现流程化办公!
  • 基于深度学习的裂纹图像分类研究(Matlab代码实现)
  • TypeScript入门学习汇总
  • Vue3使用vxetable进行表格的编辑、删除与新增
  • JUC 并发编程之JMM
  • k8s集群中安装kibana 7.x 踩坑
  • CSS的一些基础知识
  • 解决多线程环境下单例模式同时访问生成多个实例
  • 转转闲鱼交易猫源码搭建
  • 设计模式精华版汇总
  • uniapp实现带参数二维码
  • 金融行业软件测试面试题及其答案
  • 强化学习QLearning 进行迷宫游戏和代码
  • Vue2 第九节 过滤器
  • Swift 对象数组去重
  • 代码随想录算法训练营day52 300.递增子序列 674.最长连续递增子序列 718.最长重复子数组
  • Android 面试题 虚拟机、进程、线程 七
  • Flutter 状态组件 InheritedWidget
  • <C++> 入门
  • 政策加持智能家居市场,涂鸦赋能客户打造“以人为本”智能生活新方式