方法

方法

  • 一个方法只完成一个功能,这样有利于我们后期的扩展
  • 方法的命名规则应遵守首字母小写的驼峰命名规则

方法的定义

方法包含一个方法头和方法体。下面是一个方法的所有部分

  1. 修饰符(public、static)
  2. 返回值类型(void、int)
  3. 方法名
  4. 参数类型(形参)
  5. 方法体

方法的调用

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

当方法返回一个值的使用,方法调用通常被当做一个值

当方法返回值是空的时候,方法调用一定是一条语句

源代码
public class Demo01 {
    public static void main(String[] args) {
        //静态方法的调用可以为类.方法
        Class.say();
        //非静态方法的调用不可以直接类.方法 需要先实例化对象之后用对象.方法的方式调用
        //Class.say1();错误
        Class student = new Class();//实例化对象student, 利用和类同名的构造方法
        student.say1();//利用对象.方法来调用方法
    }
    public static void a(){
        b();
    }
    //静态方法可以直接调用静态方法
    public  static  void b(){
        d();//报错,静态方法无法直接调用非静态方法
    }
    //非静态方法可直接调用非静态方法
    public void c (){
        d();
    }
    public void d(){
        b();//非静态方法可以直接调用静态方法
    }
}


注:静态方法和类一起加载,而非静态方法是实例化之后才会存在。所以非静态方法无法直接调用静态方法

方法的重载(Overload)

方法重载的规则:

  • 方法名称必须相同。
  • 参数列表必须不同(可以是个数不同,类型不同,顺序不同)

实践理论:

  • 方法名称相同时,编译器会根据调用方法的参数个数,参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。

注:方法的重载的目的 就是通过传不同的参数达到调用不同的方法

命令行传参

有时候你希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()方法实现

可变参数

在方法声明中,在指定参数类型后加一个省略号(...)

一个方法中只能指定一个可变参数,他必须是方法的最后一个形参,其他的参数都要在它之前声明

注:可变参数有点类似与C语言中数组的首地址传递。

递归

递归分为递归头和递归体

  • 递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
  • 递归体:什么时候需要调用自身方法。
源代码

5的阶乘,递归算法

public class Demo03 {
    public static void main(String[] args) {
        System.out.println(f(5)); //120
    }
    public static int f(int n){
        if (n==1){
            return 1;
        }
        return f(n-1)*n;
    }
}


方法的数组参数传递

作为引用类型的数组也可以作为数组的形参或者返回值

注:JAVA中方法的数组(引用)传递类似于C语言中的地址传递,方法中对数组进行的操作对方法外也有影响

方法的引用类型的传递

同数组一样,引用类型的传递也是地址传递

public class Demo02 {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.name);//null
        change(person);
        System.out.println(person.name);//Xiaobai
    }
    //引用类型的传递不是值传递。这里person.name的改变就是person对象中属性name的改变
    public static void change(Person person){
        person.name = "Xiaobai";
    }
}
//定义一个person类,有一个属性:name
class Person{
    String name;
}


注:类中属性和类中方法一样,如果想要用类名.属性名调用该属性,则该属性必须要用static修饰符修饰