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~,我们下期再见啦。

目录
相关文章
|
3天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
27 4
|
14天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
35 17
|
7天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
13 2
|
28天前
|
算法 Java Linux
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
这篇文章介绍了如何使用Java的Graphics2D类在图片上合成另一个照片,并将照片切割成圆形头像的方法。
45 1
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
|
15天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
13 3
|
17天前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
|
15天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
12 2
|
15天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
12 1
|
15天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
26 1
|
15天前
|
Java
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅。它们用于线程间通信,使线程能够协作完成任务。通过这些方法,生产者和消费者线程可以高效地管理共享资源,确保程序的有序运行。正确使用这些方法需要遵循同步规则,避免虚假唤醒等问题。示例代码展示了如何在生产者-消费者模型中使用`wait()`和`notify()`。
22 1