Java-04方法详解

Java-04方法详解

  • 多写(代码),多写(笔记),多写(文章)
  • 多练(交流),多练(思维),多练(技能)
  • 多分享(知识),多分享(怎么了),多分享(为什么)
  • 最重要(坚持)
  • 每个牛B人物背后都有一段苦B的岁月,只要像傻B一样坚持,终将牛B!

1. 何谓方法

Java方法是语句的集合,他们在一起执行一个功能

  • 方法是解决一类问题的步骤的有序组合
  • 方法包含于类或对象中
  • 方法在程序中被创建,在其他地方被引用

设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成一个功能,这样利于我们后期的扩展

方法的命名规则:采用小驼峰的方式命名

2. 方法的定义及调用

2.1 方法的定义

Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码块,一般情况下,一个方法包含方法头和一个方法体

  • 修饰符:这个是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型
  • 返回值类型:方法可能会返回值。returnValue Type是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。这种情况下returnValue Type是关键字void
  • 方法名:是方法的实际名称。方法名和参数表共同构成方法签名
  • 参数类型:这个是可选的,参数像是一个占位符,当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数个数。
    • 形式参数:在方法被调用时用于接收外界输入的数据
    • 实参:调用方法时实际传给方法的数据
  • 方法体: 方法体包含具体的语句,定义该方法的具体功能
修饰符 返回值类型 方法名(参数类型 参数名) {
	// 方法体
	return 返回值;
}

例如:

public static void main(String[] args) {
    /**
     * add第一个参数值:2.5就是实参
     * add第二个参数值:10就是实参
     * 变量sum:就是返回值用一个变量进行存储
     */
    double sum = add(2.5, 10);
    System.out.println(sum);
}

/**
 * add就是方法名
 * @param x:x是形参
 * @param y:y是形参
 * @return :这个就是返回形参x+形参y相加计算后的值
 */
public static double add(double x, double y) {
    return x + y;
}

2.2 方法的调用

方法的调用:对象名.方法名(参数列表)

Java支持两种方法的调用方式,根据方法是否有返回值来选择

  • 当方法返回一个值的时候,方法的调用通畅被当做一个值
int sum = add(2.5, 10);
  • 如果方法的返回值为void,方法调用一定是一条语句
System.out.println("Hello World!");

2.3 拓展了解值传递和引用传递

2.3.1 值传递

定义:实参传递给形参的是值 形参和实参在内存上是两个独立的变量 对形参做任何修改不会影响实参

public class Demo1 {
    public static void main(String[] args) {
        int b =20;
        change(b);// 实参  实际上的参数
        System.out.println(b); // 20
    }
    public static void change(int a){//形参  形式上的参数
        a=100;
    }
}

值传递例子

通俗一点的说法就是:形参只是实参创建的一个副本,副本改变了,原本当然不可能跟着改变;小明去餐厅吃饭,看见别人点的红烧肉挺好吃,就把服务员叫过来,说我要一份红烧肉,服务员从后厨拿来一份红烧肉,小明吃完了,但是他吃的红烧肉跟旁边那个人吃的是一份吗?当然不是。

2.3.2 引用传递

定义:实参传递给形参的是参数对于 堆内存上的引用地址 实参和 形参在内存上指向 了同一块区域 对形参的修改会影响实参

public class Demo1 {
    public static void main(String[] args) {
        int [] a={1,2,3};
        System.out.println(a[0]); // 1
        change(a);
        System.out.println(a[0]); // 100
    }
    public static void change(int[] a ){
        a[0]=100;
    }
}

引用传递例子说明

原因:由于引用传递,传递的是地址,方法改变的都是同一个地址中的值,原来a[0]指向0x13地址,值是1,后来在a[0] 指向的也是0x13地址,将值变成了100。所以,再查询a[0]的值的时候,值自然变成了100
通俗一点的说法就是:小明回到家,他妻子说:冰箱二层有一只鸡,你去做了;小明做好了,叫妻子过来吃饭。这个时候,他妻子现在看见的鸡和她买回来的一样吗?当然不一样,都做熟了;什么意思呢?鸡就是数据,冰箱二层就是存储数据的地址,把鸡做熟了就是相当于把值改变了,地方还是那个地方,就是鸡变了。

3. 方法重载

定义:重载就是在一个类中,有相同的函数名称,但形参不同的函数

方法的重载规则:

  • 方法名称必须相同
  • 参数列表必须不同(个数不同、类型不同、参数排列顺序不同……)
  • 方法的返回类型可以相同,也可以不相同
  • 仅仅返回类型不同不足以成为方法的重载

实现理论:方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配对应的方法,如果匹配失败,则编译器报错

例子:

public class FunctionDemo {
    public static void main(String[] args) {
        // add 方法本身自己实现了一次,重载了2次,会根据调用时传递的参数不同而实现各自的业务
    }
    public static double add(double x, double y) {
        return x + y;
    }
    
    public static int add(int x, int y) {
        return x + y;
    }
    
    public static float add(int x, float y) {
        return x + y;
    }
}

4. 可变参数

定义:JDK 1.5 开始,Java支持传递同类型的可变参数给一个方法

语法:在方法声明中,在指定参数类型后加一个省略号(...)【是在英文输入法下的三个小点,而不是中文输入法下的Shift+6】

注意事项:

  • 一个方法中只能指定一个可变参数
  • 它必须是方法的最后一个参数,任何普通参数都必须在他之前申明

例子:

public static void main(String[] args) {
        printMax(10, 20, 30, 40, 50);
    }

public static void printMax(double... numbers) {
    if (numbers.length == 0) {
        System.out.println("No argument passed!");
        return;
    }

    double result = numbers[0];

    for (int i = 1; i < numbers.length; i++) {
        if (numbers[i] > result) {
            result = numbers[i];
        }
    }

    System.out.println("The max value is " + result);
}

5. 递归

定义:就是在运行的过程中调用自己,递归做为一种算法在程序设计语言中广泛应用。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。

递归必须要有的三要素:

  • 边界条件
  • 递归前进段
  • 递归返回段
当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

例子:

public static void main(String[] args) {
    System.out.println(factorial(20L));
    for (int i = 0; i < 10; i++) {
        System.out.print(fibonacci(i) + " ");
    }
}

/**
 * 阶乘
 * @param n 次数
 * @return
 */
public static long factorial(long n) {
    if (n == 1) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

/**
 * 斐波那契数列:这个数列从第3项开始,每一项都等于前两项之和
 * 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89……
 * @param n 次数
 * @return
 */
public static int fibonacci(int n) {
    if (n <= 0) {
        return 0;
    } else if (n == 1) {
        return 1;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}
posted @ 2021-06-08 10:07  爱Ni说不出口  阅读(86)  评论(0)    收藏  举报