Java方法基础


Java方法基础

  1. 何谓方法?

  2. 方法的定义及使用

  3. 方法重载

  4. 命令行传参

  5. 可变参数

  6. 递归

  7. 作业


1.何谓方法?

  • Java方法是语句的集合,它们在一起执行一个功能,比如 System.out.println() 专门打印输出的

    • 方法是解决一类问题的步骤的有序组合

    • 方法包含于类或对象中

    • 方法在程序中被创建,在其他地方被引用

  • 设计方法的原则:方法的本质计算实现某个功能的语句的集合。设计的时候保持方法的原子性。

    即一个方法只完成一个功能,有利于后期的扩展

  • 注意方法的命名规则

2.方法的定义及调用

  • 方法的定义

    • 修饰符:告诉编译器任何调用该方法,定义了该方法的访问类型。可选

    • 返回值类型:returnValueType 是方法的返回值类型。没有返回值的方法 returnValueType 关键字是void

    • 方法名:是方法的名称,用于被调用

    • 参数类型:调用方法时,传递的时实参;定义方法时,设置形式参数作占位符。可选

    • 方法体:定义该方法的功能

      修饰符 返回值类型 方法名(参数类型 参数名){
         方法体;
        ...;
         return 返回值;
      }
      //例子
      public static double sumCdt(double a,double b){
         return a*a+b*b;
      }
  • 方法调用

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

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

    • 方法有返回值时,调用方法

      // 定义于返回值同类型的变量 result 用于接收返回值,returnValueType result = 方法名(实参);
      // 例子
      int num = add(30,40);
      String str_1 = printSort("hello,world");
      int[] array_1 = sort(array);
    • 没有返回值,调用方法

      //没有返回值,不需要定义变量去接受,直接执行方法即可, 方法名(实参);
      // 例子
      System.out.println("hello,world!");
  • 值传递 和 引用传递

    • 值传递:Java 是 值传递

    • 引用传递

3.方法重载

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

  • 方法重载的规则

    • 方法名必须相同,且形参一定不同(个数不同,或类型不同,或参数排列顺序不同等

    • 方法的返回类型可以相同也可以不同

    • 仅仅返回类型不同不是方法的重载

  • 方法重载实现的原理

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

4.命令行传参

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

比如 在 cmd 中输入 java -version ,就会输出java的版本信息

我们自己写一个类似的例子,这要靠传递命令行参数给main()方法实现

1. 写一个实现在 cmd 中简单打印一下输入参数的内容的功能

  1. 在cmd中进入文件对应路径后,先编译好 java 文件,在执行文件的时候报错。

    为什么?因为在该路径下找不到主类

  1. 进入主类所在路径后,在执行文件,此时需要从主类依次向下调用

  1. 接着输入参数,执行函数,就实现了 在cmd 命令行中传参的简单打印功能。

5.可变参数

  • JDK 1.5 开始,Java支持传递同类型的可变参数的方法

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

  • 一个方法智能指定一个可变参数,并且它必须是方法的最后一个参数。任何普通参数必须在它的前面声明。

    //例子
    package MethodArray.MtehodStudy;

    public class MethodTest_3 {
       public static void main(String[] args) {
           // 可变参数输入,相当于数组
           printMax(123,32,4,3,41,45.2);
      }

       public static void printMax(double... numbers){
           // 等价于数组的使用方法
           if (numbers.length==0){
               System.out.println("你没有任何输入");
          }
           double result = numbers[0];
           // 取最大值
           for (double number : numbers) {
               if (number > result) {
                   result = number;
              }
          }
           System.out.println("这组数据的最大值是:"+result);
      }

    }

6.递归

  • 定义:A方法调用B方法,叫引用,A方法调用A方法,叫递归

  • 意义:递归可以用简单的程序来解决一下复杂的问题。它通常把一个大型问题层层转化为小问题来求解。递归的能力在于用少量的语句定义对象的无限集合。

  • 递归结构包含两个部分:

    • 递归头:什么时候将不调用自身。如果没有递归头,程序将陷入死循环。

    • 递归体:什么时候需要调用自身方法。

  • 问题:利用递归求10的阶乘

    package MethodArray.MtehodStudy;

    public class MethodTest_4 {
       public static void main(String[] args) {
           int result = fun(10);
           System.out.println(result);
      }

       public static int fun(int n){
           if(n==1){
               return n;
          }else {
               return n*fun(n-1);
          }
      }
    }
  • 注意:由于Java使用的是栈机制的(相当于一个瓶子,最底层是main方法,没调用一个方法就在上面压一层,因此不能无限压)

    • 调用递归会带来大量的函数调用,运用递归需注意基数问题,调用过多会因为电脑内存不够而导致程序崩溃。

    • 调用次数少才使用递归,重要的是我们要学习递归的思想,递归是解决复杂问题的一种思路

7.作业

  • 写一个计算器,要求实现加减乘除功能,并且能循环接收新的数据,通过用户交互实现。

    package MethodArray.MtehodStudy;

    import java.util.Scanner;
    // 该计算器可以一直进行计算,通过输入 非数字 来结束输入并打印最终结果。
    // 如果运算符那里的输入不合要求,还可以重新输入运算符,进行运算
    public class CalcProject_2 {
       public static void main(String[] args) {
           Scanner scan = new Scanner(System.in);
           double result = 0;  // 用于存储最后的结果
           int sure = 0;      // 判断语句是否进入switch 语句选择
           double temp = 0;    // 用于存储每一轮临时值
           double num1;
           System.out.println("请输入数字:");
           if(scan.hasNextDouble()){
               num1 = scan.nextDouble();
               System.out.println("请输入+ - * /");
               while (scan.hasNext()){
                   String str = scan.next();
                   System.out.println("请输入数字:");
                   if(scan.hasNextDouble()){
                       double num2 = scan.nextDouble();
                       switch (str){
                           case "+":
                               temp = add(num1,num2);
                               sure = 1;
                               num1 = temp;
                               break;
                           case "-":
                               temp = sub(num1,num2);
                               sure = 1;
                               num1 = temp;
                               break;
                           case "*":
                               temp = cdt(num1,num2);
                               sure = 1;
                               num1 = temp;
                               break;
                           case "/":
                               temp = div(num1,num2);
                               sure = 1;
                               num1 = temp;
                               break;
                           default:
                               System.out.println("您输入的运算符不合法");
                               break;
                      }
                       if(sure==0){
                           System.out.println("此时的结果为:"+num1);
                      }else {
                           System.out.println("此时的结果为:"+temp);
                      }
                       System.out.println("请输入+ - * /");
                  }else {
                       if(sure==0){
                           result = num1;
                      }else {
                           result = temp;
                      }
                       break;
                  }
              }
               System.out.println("最终的结果为:"+result);
               scan.close();
          }else System.out.println("输入不合法");

      }

       public static double add(double num1,double num2){
           return num1+num2;
      }

       public static double sub(double num1,double num2){
           return num1-num2;
      }

       public static double cdt(double num1,double num2){
           return num1*num2;
      }

       public static double div(double num1,double num2){
           return num1/num2;
      }
    }

     

  •  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM