java_day06_1Java方法详解

JAVA方法详解

目录

  1. 何谓方法

  2. 方法的定义及调用

  3. 方法重载

  4. 命令行传参

  5. 可变参数

  6. 递归

1 何谓方法?

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

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

    • 方法包含于类或对象

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

  2. 设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。设计方法时最好保持方法的原子性,即一个方法只完成一个功能,这样有利于拓展。

  3. 方法的命名规则:首字母小写,驼峰命名;

示例如下:

 package com.xin.method;
 
 public class Demo01 {
     public static void main(String[] args) {   //void即不返回值
         int sum = add(1, 2);
         System.out.println(sum);     //输出为3
         test();                //输出九九乘法表
 
    }
 
     //加法
     public static int add(int a, int b){          //返回值为int,方法名为add,加一个类变量static才能调用
         return a+b;
    }
     //九九乘法表封装为方法
     public static void test(){            //尽量保证main方法里代码简洁
         for (int i = 1; i <= 9; i++) {
             for (int j = 1;  j<= 9; j++) {
                 if (j<=i) {
                     //System.out.print(j);
                     //System.out.print('\t');
                     System.out.print(j + "*" + i + "=" + (i * j));   //这里乘法要用双引号,单引号会出错
                     System.out.print('\t');
                }
            }
             System.out.print('\n');
        }
    }
 }

2 方法的定义和调用

2.1 方法的定义

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

  • 方法包含一个方法头和一个方法体。

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

    • 返回值类型:方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但是没有返回值。这时,returnValueType是关键字void。

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

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

      • 形式参数:在方法被调用时用于接收外界输入的数据(用来定义作用的)

      • 实参:调用方法时实际传给方法的数据

    • 方法体:方法体包含具体的语句,定义该方法的功能。

格式如下:

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

2.2 方法调用

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

  • 当方法返回一个值的时候,方法调用尝尝被当作一个值。例如:

 int larger = max(30, 40);
  • 如果方法返回值是void,方法调用一定是一条语句。

 System.out.printIn("Hello,kaungshen!")

示例如下:比大小

 package com.xin.method;
 
 public class Demo02 {
     public static void main(String[] args) {
        int sum =  max(5, 6);
         System.out.println(sum);
 
    }
     public static int max(int num1, int num2){
         int result = 0;
         if (num1>num2){
             result = num1;    //因为一般return都是放在后边,所以放个中间变量
        }else{
             result = num2;
        }
         return result;       //除了返回值,还有终止方法的意思
    }
 }

3 方法重载

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

  • 方法重载的原则:

    • 方法名称必须相同

    • 参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)

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

    • 仅仅返回类型不同不足以成为方法的重载

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

 

 package com.xin.method;
 
 public class Demo02 {
     public static void main(String[] args) {
        double sum =  max(5.0, 6.0);
         System.out.println(sum);
 
    }
     public static int max(int num1, int num2){
         int result = 0;
         if (num1>num2){
             result = num1;    //因为一般return都是放在后边,所以放个中间变量
        }else{
             result = num2;
        }
         return result;       //除了返回值,还有终止方法的意思
    }
     public static double max(double num1, double num2){        //方法可以重名,但是参数类型要不同
         double result = 0;
         if (num1>num2){
             result = num1;    //因为一般return都是放在后边,所以放个中间变量
        }else{
             result = num2;
        }
         return result;       //除了返回值,还有终止方法的意思
    }
 }

4 命令行传参

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

image-20220324210902293

 package com.xin.struct;
 
 public class ForDemo05 {
     public static void main(String[] args) {
         int[] numbers = {10, 20, 30, 40, 50}; //定义了
         for (int x:numbers){
             System.out.println(x);
        }
    }
 }

5 可变参数

  • JDK1.5开始。Java支持传递同类型的可变参数只设置一个方法。

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

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

 package com.xin.method;
 
 public class Demo04 {
     public static void main(String[] args) {
         Demo04 demo04 = new Demo04();
         demo04.test(1, 2, 2, 3, 5);
    }
 //   public void method(){}
 //   public void method(int i){}
 //   public void method(int i, int i2){}         //这种传递参数方式过于繁琐
 //   public void method(int i, double i2){}
     public void test (int... i){
         System.out.println(i[0]);
         System.out.println(i[1]);        //输出1 2 2 3 5,中间有换行
         System.out.println(i[2]);
         System.out.println(i[3]);
         System.out.println(i[4]);
    }
 }

通过实例理解可变参数的使用:

 package com.xin.method;
 
 public class Demo05 {
     public static void main(String[] args) {
         //调用可变参数的方法
         printMax(34, 3, 3, 2, 56.5);      //The Max value is 56.5
         printMax(new double[]{1, 2, 3});            //The Max value is 3.0
    }
     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);
    }
 }

6 递归

  • 递归就是自己调用自己

  • 利用递归可以用简单的程序解决一些复杂的问题。通常把一个大的复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。递归的能力在于用有限的语句来定义对象的无限集合。

  • 递归结构包括两个部分

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

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

递归实例演示:阶乘

 package com.xin.method;
 
 public class Demo06 {
     public static void main(String[] args) {
         System.out.println(f(5));    //输出结果为120
 
    }
     public static int f(int n){
         if (n == 1){
             return 1;
        }else{
             return n*f(n-1);
        }
    }
 }

计算器练习

 package com.xin.method;
 import java.util.Scanner;
 
 public class cal {
     public static void main(String[] args) {
         //创建一个扫描器对象,用于接收键盘数据
         String str = "";
         int count = 1;
         double sum1 = 0;
         double sum2 = 0;
         int a1 = 0;
         int a2 = 0;
         int a3 = 0;
         int a4 = 0;
         Scanner scanner = new Scanner(System.in);  //右侧打完,按a|t+enter,可以在左侧自动创建相应类型变量
         System.out.println("使用next方式接收");
         //判断用户有没有输入字符
         while (scanner.hasNext()){
             str = scanner.next();
             //System.out.println(str);
 
             switch (str){       //判断输入是数字还是符号
                 case "+":
                     //add(sum1, sum2);
                     a1 = 1;
                     break;
                 case "-":
                     //jian(sum1, sum2);
                     a2 = 1;
                     break;
                 case "*":
                     //mul(sum1, sum2);     //输出及格
                     a3 = 1;
                     break;
                 case "/":
                     //del(sum1, sum2);
                     a4 = 1;
                     break;
                 default:            //要先得到sum2才能计算,并执行相关函数
                     if (count == 1){
                         count = count + 1;
                         sum1 = Double.parseDouble(str);
                    }else{
                         count = count + 1;
                         sum2 = Double.parseDouble(str);
                         if (a1 == 1){
                             sum1 = add(sum1, sum2);
                             a1 = 0;
                        }else if(a2 == 1){
                             sum1 = jian(sum1, sum2);
                             a2 = 0;
                        }else if(a3 == 1){
                             sum1 = mul(sum1, sum2);
                             a3 = 0;
                        }else{
                             sum1 = del(sum1, sum2);
                             a4 = 0;
                        }
                    }
                     System.out.println(sum1);
        }
 
        }
         scanner.close();  //用完就关掉,节约资源
    }
     public static  double add(double a, double b){
         double sum = a + b;
         return sum ;
    }
     public static  double jian(double a, double b){
         double sum = a - b;
         return sum ;
    }
     public static  double mul(double a, double b){
         double sum = a * b;
         return sum ;
    }
     public static  double del(double a, double b){
         double sum = a / b;
         return sum ;
    }
 }

 

 

知识补充

1 查看方法源代码

  • 按住Ctrl,点击相应方法即可查看方法源代码

2 值传递和引用传递

  • Java一般都是值传递

  • 值传递(pass by value):在调用函数时,将实际参数复制一份传递到函数中,这样在函数中对参数进行修改,就不会影响到原来的实际参数

  • 引用传递(pass by reference):在调用函数时,将实际参数的地址直接传递到函数中。这样在函数中对参数进行的修改,就会影响到实际参数

posted @   诺不克  阅读(153)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示