首页 > 技术文章 > Java方法

YYwantMore 2021-02-09 12:56 原文

java的方法

什么是方法

  • Java方法是语句的集合,它们在一起执行一个功能。
    • 方法是解决一类问题的步骤的有序组合
    • 方法包含于类或对象中
    • 方法在程序中被创建,在其他地方被引用
  • 设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性就是一个方法只完成1个功能,这样利于我们后期的扩展
  • 例子:System.out.println(),这里就是调用System类里面out对象下的println方法。

方法的定义

  • Java的方法类似于其他语言否认函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法含一下语法:

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

      • 修饰符:修饰符,这是可选的,负责告诉编译器应该如何调用,和控制访问类型。

      • 返回值类型:方法可能会返回值,returnValueType是方法返回值的数据类型;有些方法没有返回值时,returnValueType用void。

      • 方法名:是方法的实际名字。方法名和参数共同构成方法的签名。

      • 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指参数的参数类型,顺序和参数的个数。参数是课选的,方法可以不包含任何参数。

        • 形式参数:在方法调用时用于接收外界输入的数据
        • 实参:调用方法时实际传给方法的数据。
      • 方法体:方法体包含具体的语句,定义该方法的功能。

        修饰符 返回值类型 方法名 (参数类型){
            ...
                方法体
            ...
                return 返回值;
        }
        

示例:

//这里我们写一个加法的方法来演示
public class Demo01 {

    public static void main(String[] args) {
        //调用add方法
        int sum = add(1,2);//这里的1,2就是实际参数:实际调用传递给他的参数

        System.out.println(sum);//打印结果
    }

    //这是加法的方法
    //public和static都是修饰符,int是返回类型,add是方法名,括号里面a,b是形式参数
    public static int add(int a,int b){
        return a+b;//a+b的值作为返回值
    }
}

结果肯定是3咯。


方法的重载

  • 重载就是在一个类中,有相同的函数名称,但形参不同的函数。
  • 方法重载的规则:
    • 方法名称必须相同。
    • 参数列表必须不同。
    • 方法的返回类型可以相同也可以不同。
    • 仅仅返回类型不同不足以成为方法重载。(考试喜欢考)
  • 实现理论:
    • 方法名相同时,编译器会根据调用方法的参数个数,参数类型去逐个匹配,以选择对应方法,如果匹配失败,则会报错。

示例:

//这里演示add方法的重载
public class Demo02 {
    public static void main(String[] args) {
        //调用add方法
        int sum = add(1,2);//这里的1,2就是实际参数:实际调用传递给他的参数
        double sum2 = add(0.2,0.4);

        System.out.println(sum);//打印结果
        System.out.println(sum2);
    }

    //这是加法的计算整数方法
    //public和static都是修饰符,int是返回类型,add是方法名,括号里面a,b是形式参数
    public static int add(int a,int b){
        return a+b;//a+b的值作为返回值
    }
    //这里是计算小数相加得到重载方法,注意对比区别
    public static double add(double a,double b){
        return a+b;
    }
}

命令行传参

  • 有时候你希望运行一个程序时候再传递消息,这时候要传递命令行参数给main()函数才能实现

示例:

public class Demo03 {
    public static void main(String[] args) {
        //args.length是数组长度
        for (int i = 0; i <args.length ; i++) {
            System.out.println("args["+i+"]"+args[i]);

        }
    }
}

然后我们右键单击Demo03在命令行里打开

输入javac Demo03,但是这里出现了一个编码DBK的错误

所以我们要在javac后面加上- encoding UTF -8,现在生成了一个.class文件

这个文件需要在src路径下才能运行,因为文件里面有包地址,所以我们返回src目录下,输入java SE3.Demo03.

在运行过程中我们传入参数this is input,结果如图:

这就是命令行传参,一般不常用到。

可变参数

  • 从JDK1.5开始,Java支持传递同类型的可变参数给一个方法

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

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

    //可变参数演示
    public class Demo04 {
        public static void main(String[] args) {
            Demo04 demo04 = new Demo04();//这里要调用test方法需要先创建Demo04类
            demo04.test(1.0,2,5,4,9,4,5,87,9,5);//调用Demo04两类里面的test方法
        }
        public void test(double i,int... j){
            if (j.length==0){//判断j有没有输入
                System.out.println("j没有传入值");
                return;//退出方法
            }
            System.out.println(i);
            for (int k = 0; k <j.length ; k++) {
                System.out.println(j[k]);
    
            }
        }
    }
    

    结果如图

注意:如果上面代码中方法中参数j放在参数i前面就会报错,像这样:

递归

  • A方法调用B方法我们容易理解,递归就是A方法调用A方法。
  • 利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
  • 递归结构包含两部分:
    • 递归头:什么时候不调用自身方法。如果没有头,会陷入死循环
    • 递归体:什么时候需要调用自身方法。

示例:

//递归演示
public class Demo05 {
    //这里我们编写一个计算阶乘的递归算法
    public static void main(String[] args) {
        Demo05 demo05 = new Demo05();//创建对象
        System.out.println(demo05.f(5));//计算5的阶乘

    }
    //递归方法
    public int f(int n){
        if(n==1){//边界条件
            return 1;
        }else {
            return n*f(n-1);//递归
        }
    }
}

这里我们分析一下:

这个算法就像这个图一样,从main方法开始,进入f(5),f(4),直到f(1)遇到边界条件然后返回值相乘。

注意:递归我们最重要的是学习这种思想,这种方式在计算量大的情况下会造成栈溢出。

这篇文章是个人的学习日记,期待大佬指正!
{{uploading-image-486281.png(uploading...)}}

推荐阅读