java的方法

简介: java的方法

1.方法的概念

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

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

2.方法的使用

2.1方法的定义

// 方法定义
修饰符 返回值类型 方法名称([参数类型 形参 ...]){
    方法体代码;
    [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当中,方法必须写在类当中
  1. 在java当中,方法不能嵌套定义
  2. 在java当中,没有方法声明一说

2.2方法的执行过程

       调用方法--->传递参数--->找到方法地址--->执行被调方法的方法体--->被调方法结束返回--->回到主调方法继续往下执行

借用下图,可以形象的解释

【注意事项】

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

代码示例一(两数之和):

    public static int add(int a,int b) {
        return a+b;
    }
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int ret = add(a,b);
        System.out.println("调用方法后的值是:"+ret);
    }

代码示例二(计算 1! + 2! + 3! + 4! + n!):

    public static int fac(int n) {
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            int tmp = 1;
            for (int j = 1; j <= i; j++) {
                tmp *= j;
            }
            sum += tmp;
        }
        return sum;
    }
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int num = scan.nextInt();
        int sum = fac(num);
        System.out.println(sum);
    }

2.3实参与形参的关系:

       在Java中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体。相当于是形参只是实参的一份临时拷贝,并且对形参的值进行修改并不会影响实参。

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

       在调用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产生任何影响。


注意:对于基础类型来说, 形参相当于实参的拷贝. 即 传值调用

2.4没有返回值的方法

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

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

3.方法的重载

       如果要求两个数的和,要求根据数据的类型返回相应的返回值。那么就需要写一个整数和的方法、一个浮点数和的方法。如果类似的要求很多,你取名字都是一件极其麻烦的事情,这里就需要用到方法的重载了。

3.1方法重载的概念与使用

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


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

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

    public static void print(int a,int b) {
        System.out.println(a+b);
    }
    public static void print(float a,float b) {
        System.out.println(a+b);
    }
    public static void print(float a,float b,float c) {
        System.out.println(a+b+c);
    }
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        print(a,b);
        float c = 3.14f;
        float d = 5.5f;
        float e = 8.8f;
        print(c,d);
        print(c,d,e);
    }

注意:

  1. 方法名必须相同
  2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
  3. 与返回值类型是否相同无关
  4. 编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法

3.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 字节码文件名字即可

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

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

4.递归

先讲个故事,这个故事的内容就是:

       从前有坐山,山上有座庙,庙里有个老和尚给小和尚将故事,讲的就是:"从前有座山,山上有座庙,庙里有个老和尚给小和尚讲故事,讲的就是:"从前有座山,山上有座庙...""从前有座山……"

上面的这个故事有个特征:

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

4.1递归的概念

       一个方法在执行过程中调用自身, 就称为 "递归".递归相当于数学上的 "数学归纳法", 有一个起始条件, 然后有一个递推公式.

       例如, 我们求 N!

              起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件.

               递归公式: 求 N! , 直接不好求, 可以把问题转换成 N! => N * (N-1)!

递归的必要条件:

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

代码示例: 递归求 N 的阶乘

    public static int facTow(int n) {
        if(n == 1) {
            return 1;
        }
        return n * facTow(n-1);
    }
    public static void main(String[] args) {
        int a= 5;
        int ret = facTow(a);
        System.out.println(ret);
    }

       上述代码就运用到了递归,本质上就是自己调用自己,这里只要有停止的条件,不然就会陷入死递归。

4.2递归的执行流程剖析

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

    public static int facThree(int n) {
        System.out.println("方法开始="+n);
        if(n == 1) {
            System.out.println("方法结束:n = 1,ret = 1");
            return 1;
        }
        int ret = n * facThree(n-1);
        System.out.println("方法结束"+" n = "+n+" ret = "+ret);
        return ret;
    }
    public static void main(String[] args) {
        int a= 5;
        int ret = facThree(a);
        System.out.println(ret);
    }

关于 "调用栈"

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

扩展:

  递归中有一些十分经典的问题:斐波那契数列、青蛙跳台阶、汉诺塔...感兴趣的小伙伴可以自行了解哦,后期也是会出一些这种的解题思路和方法,敬请期待!


       以上就是本期的全部内容啦,希望看完后能够对你有所帮助。希望小伙伴们可以点赞收藏加关注,学习知识不迷路,hhh~,我们下期再见啦。

目录
相关文章
|
21天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
55 3
|
12天前
|
Java
判断不为空和不为空串的方法java
判断不为空和不为空串的方法java
|
15天前
|
Java
【专栏】Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
|
3天前
|
XML JavaScript Java
详解Java解析XML的四种方法
详解Java解析XML的四种方法
|
3天前
|
存储 Java API
掌握8条方法设计规则,设计优雅健壮的Java方法
掌握8条方法设计规则,设计优雅健壮的Java方法
|
3天前
|
Java C语言
详解java方法与递归
详解java方法与递归
10 3
|
4天前
|
SQL Java 数据库连接
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
9 0
|
4天前
|
Java
Java一分钟之-方法定义与调用基础
【5月更文挑战第8天】本文介绍了Java编程中的方法定义和调用,包括基本结构、常见问题和避免策略。方法定义涉及返回类型、参数列表和方法体,易错点有返回类型不匹配、参数错误和忘记返回值。在方法调用时,要注意参数传递、静态与非静态方法的区分,以及重载方法的调用。避免错误的策略包括明确返回类型、参数校验、理解值传递、区分静态和非静态方法以及合理利用重载。通过学习和实践,可以提升编写清晰、可维护代码的能力。
13 0
|
7天前
|
搜索推荐 Java Shell
8大Java排序方法(由简入繁),有代码详解和原理指导
8大Java排序方法(由简入繁),有代码详解和原理指导
31 0
|
13天前
|
Java API
【亮剑】三种有效的方法来删除List中的重复元素Java的List
【4月更文挑战第30天】本文介绍了三种Java中删除List重复元素的方法:1) 使用HashSet,借助其不允许重复值的特性;2) 利用Java 8 Stream API的distinct()方法;3) 对自定义对象重写equals()和hashCode()。每种方法都附带了代码示例,帮助理解和应用。