• 【8】Java方法


    一、介绍

    1、定义

    方法就是用来解决一类问题的代码的有序组合,是一个功能模块。
     
    1)举例

    Scanner sc = new Scanner(System.in);
    sc.nextInt();
    sc.next();
    System.out.println();

     2)解释:

    其中sc为Scanner的对象;
    sc.nextInt()是从键盘上获取整型值的方法;
    sc.next()是从键盘上获取字符型值的方法;

    2、方法的声明和调用

    1)语法格式:
    访问修饰符 返回类型 方法名(参数列表){
    方法体
    }

    public static void main(String[] args){
    System.out.println("Hello,Imooc!");
    }
    2)访问修饰符:
    方法允许被访问的权限范围
    举例:public, 可以不写, protected,private
     
    3)返回类型:void--无返回值,也可以是其他类型 基本数据类型,对象等
    4)方法名:命名规则和变量一样,第一个单词小写
    5)参数列表:可以省略,可以有多个,用逗号分开,是由参数类型、参数名 组成的
    6)方法分类:根据方法是否带参数、是否返回值:
    -无参无返回值方法
    -无参带返回值
    -带参无返回值
    -带参带返回值
    (下面我们根据这四个分类来介绍)

    3.方法重载

    二、方法分类(根据是否有参和返回值)

    1、无参无返回值方法

    举例:
    一行打印输出一串星号
    要实现的效果图:
    ************************
    欢迎来到Java的世界!
    ************************
     
    提示:对于重复操作的行为,归结为一个方法,之后调用
    1)方法必须在类的内部定义。
    2)方法调用:先声明对象,然后用“对象名.方法名()”的方式去调用方法。

    package com.fiona.javaBasis.day8method;
    
    public class MethodDemo {//类名MethodDemo
        //打印输出星号的方法,一般写在主方法前面
        public void printStar(){//无参无返回值,使用viod且括号是空的
            System.out.println("************************");
        }
        public static void main(String[] args) {
    
    //方法的声明:创建一个MethodDemo类的对象myMethedDemo
            MethodDemo myMethodDemo=new MethodDemo();
    
    //方法的调用:使用对象名.方法名()去调用方法
            myMethodDemo.printStar();
            System.out.println("欢迎来到Java的世界!");
            myMethodDemo.printStar();
    
        }
    }
    View Code

    2、无参带返回值方法

    1)方法在类的内部定义。
    2)习惯把方法写到主方法的前面。
    3)例如Scanner类
    4)return(返回)的类型必须与方法类型一致,且名称可以一致

    5)举例:

    public class Two {
    //求长方形的面积
    public int area() {//无参有返回值,返回值是int类型
    int length=10;
    int width=5;
    int getArea=length*width;
    return getArea;//返回语句,变量名和方法名可以一致
    }
    public static void main(String[] args) {
    Two rc=new Two();
    //因为是有返回值的,所以需要有输出语句,不可以直接rc.area()
    System.out.println("长方形的面积为:"+rc.area());
    View Code

    3、带参无返回值

    1)调用方法前必须先创建对象,然后使用对象调用方法。
    2)传参可以是变量也可以是字面值;传参类型与参数类型必须一致
     
    3)举例:定义一个求两个float类型数据最大值的方法,在方法中将最大值打印输出
    package com.fiona.javaBasis.day8method;
    //举例:定义一个求两个float类型数据最大值的方法,在方法中将最大值打印输出
    
    public class MaxDemo {
    
        //求最大值的方法
        public void max(float a,float b){//有两个参数的话用逗号分隔
            float max;
            max=a>b?a:b;
            System.out.println("两个数"+a+"和"+b+"的最大值是:"+max);
        }
        public static void main(String[] args) {
            MaxDemo maxDemo=new MaxDemo(); //创建一个对象
            int a=5,b=3;
            maxDemo.max(a,b);//调用上面的方法
            float m=5.6f,n=8.9f;
            maxDemo.max(m,n);
            maxDemo.max(9.8f,12.3f);//不定义变量,直接传值
    
        }
    }
    //两个数5.0和3.0的最大值是:5.0
    //两个数5. 6和8.9的最大值是:8.9
    //两个数9.8和12.3的最大值是:12.3
    View Code

     4)练习题:根据商品总价,计算出对应的折扣

    package com.fiona.javaBasis.day8method;
    /*
    定义一个方法,根据商品总价,计算出对应的折扣并输出。折扣信息如下:
    1) 总价<100,不打折
    2) 总价在100到199之间,打9.5折
    3) 总价在200以上,打8.5折
    */
    import java.util.Scanner;
    public class demo01 {
        //定义对象
        //定义商品总价存放到变量中
        public void zhehou(float a) {
            if(a<100){
                System.out.println("折后商品总价为:"+a);
            }else if (100<=a&a<=199){
                System.out.println("折后商品总价为:"+a*0.95);
    
            }else {
                System.out.println("折后商品总价为:"+a*0.9);
            }
        }
        public static void main(String[] args) {
            demo01 ZongJia=new demo01();
            //调用方法,输出折后商品总价
            System.out.println("请输入商品价格:");
            Scanner sc= new Scanner(System.in);
            float b=sc.nextInt();
            ZongJia.zhehou(b);
    //        demo01 ZongJia=new demo01();
    //        float b=160f;
    //        ZongJia.zhehou(b);
    
        }
    }
    View Code

    4、带参有返回值方法

    1)方法不能嵌套定义,也就是不能在在主方法中再写一个方法
    2)带有返回值的方法是为了参与进一步的运算
    3)下面的举例求阶乘,可以用嵌套for循环,也可以用有参有返回值的方法,我们这里使用方法。
     
    4)举例:定义一个求n!的方法,然后再求1!+2!+3!+4!+5!

    package com.fiona.javaBasis.day8method;
    
    public class FacDemo {
    
        //方法不能嵌套定义,不能再主方法中再写一个方法
        //1、求阶乘的方法
        public int fac(int n){//带参有返回值
            int s=1;//s存放阶乘的结果
            for(int i=1;i<=n;i++){
                s*=i;//s=s*i;求阶乘
            }
            return s;
        }
    
        //2、主方法
        public static void main(String[] args){
            FacDemo facDemo=new FacDemo();
            //计算单个数字的阶乘
            int fac=facDemo.fac(3);//3传给上面方法的n
            System.out.println("3!="+fac);
    
    
            //使用循环计算累加阶乘
            int sum=0;
    
            //求1!+2!+3!+4!+5!
            for(int i=1;i<=5;i++){
                fac=facDemo.fac(i);
                sum=sum+fac;
            }
            System.out.println("1!+2!+3!+4!+5!="+sum);
        }
    }
    View Code

     三、数组作为方法参数

    举例:打印输出数组元素的值
    public class Five {
        //循环打印输出数组元素的值
        public void printArry(int[] arr) {
            for(int i=0;i<arr.length;i++) {//可以用增强型for循环:for(int n:arr)
                System.out.print(arr[i]+" ");//System.out.print(n+ " ");
            }
            System.out.println();
        }
        public static void main(String[] args) {
            int[] arr= {10,20,30,40,50,};
            Five am=new Five();
            am.printArry(arr);
    
        }
    }
    View Code

    练习:求数组元素的平均值

    package com.fiona.javaBasis.day8method;
    //编写方法,求数组元素的平均值。
    /*
    1、定义一个方法,求数组的平均值
    
    2、在主方法中定义对象,并初始化一个float类型的数组,调用方法求数组元素的平均值,并将平均值打印输出
    
    提示:
    
    当数组元素的内容为:78.5,98.5,65.5,32.5和
    
    75.5时,可得到效果图所示的结果
    
     */
    
    public class arrAvg {
        public  float arrAvg(float[] a) {
            float sum=0f,avg=1f;
            for(int i=0;i<a.length;i++){
                sum+=a[i];
            }
            avg=sum/a.length;
            return avg;
        }
    
        public static void main(String[] args) {
            //定义对象
            arrAvg Arr=new arrAvg();
            //创建float类型的数组并初始化
            float[] a={78.5f,98.5f,65.5f,32.5f,75.5f};
            //调用方法求平均值并打印输出
            System.out.println("数组的平均数为:"+Arr.arrAvg(a));
        }
    }
    View Code

    举例:查找数组元素的值

    提示
    方法参数:数组、要查找的元素 返回值:Boolean类型
    把查找的过程放到方法里,主方法只放业务代码

    import java.util.Scanner;
    public class ArraySearch {
        //查找数组元素值的方法
        public boolean search(int n,int[] a){
            boolean flag=false;//设置默认值默认没找到
            for(int i=0;i<a.length;i++){
                if(a[i]==n){
                    flag=true;//找到了
                    break;
                }
            }
            return flag;
    
        }
        public static void main(String[] args) {
            int[] arr={10,20,30,40,50,60};
            Scanner sc=new Scanner(System.in);
            System.out.println("请输入要查找的数据:");
            int n1=sc.nextInt();
            ArraySearch as=new ArraySearch();
            boolean flag=as.search(n1,arr);
            if(flag){
                System.out.println("找到了");
            }
            else{
                System.out.println("没找到");
            }
    
    
        }
    }
    View Code

    四、方法重载

    1、定义:方法名相同,但是参数列表(数据类型or数量)不同,叫做方法重载
    2、举例:求最大值的方法
    //定义一个求两个float类型数据最大值的方法,在方法中将最大值打印输出
    
    public class MaxDemo {
        //求最大值的方法
        public void max(double a, double b) {
        }
        public void max(float a,float b){//有两个参数的话用逗号分隔
            float max;
            max=a>b?a:b;
            System.out.println("两个数"+a+"和"+b+"的最大值是:"+max);
        }
        public static void main(String[] args) {
            MaxDemo maxDemo=new MaxDemo(); //创建一个对象
            int a=5,b=3;
            maxDemo.max(a,b);//调用上面的方法
            float m=5.6f,n=8.9f;
            maxDemo.max(m,n);
            maxDemo.max(9.8f,12.3f);//不定义变量,直接传值
            maxDemo.max(9.8,12.3);//添加上double方法后,这里double类型就不会报错了
        }
    }
    //两个数5.0和3.0的最大值是:5.0
    //两个数5. 6和8.9的最大值是:8.9
    //两个数9.8和12.3的最大值是:12.3
    View Code

    3、选择题

    注意:蓝框中的与红框的对比,是方法的重载,另外两个不是

     

    4、举例:定义三个方法,实现int、double和数组类型和的问题
    //定义三个方法,实现int、double和数组类型和的问题
    public class MathDemo {
        //1、求两个int类型数的和
        public int plus(int m,int n){
            return m+n;
        }
        //2、求两个double类型数的和
        public double plus(double m,double n){
            return m+n;
        }
        //3、求数组元素的累加和
        public int plus(int[] arr){
            int sum=0;//求累加和,必须要定义
            for(int i=0;i<arr.length;i++){
                sum=sum+arr[i];
            }
            return sum;
        }
        public static void main(String[] args) {
            int m=5,n=10;
            int[] arr={1,2,3,4,5,6};
            MathDemo mathDemo=new MathDemo();
            System.out.println("int类型的和:"+mathDemo.plus(m,n));
            System.out.println("double类型的和:"+mathDemo.plus(5.6,7.8));
            System.out.println("数组元素的和:"+mathDemo.plus(arr));
    
        }
    }
    //int类型的和:15
    //double类型的和:13.399999999999999
    //数组元素的和:21
    View Code

    5、练习:两个重载的方法,分别求圆和长方形的面积 

    /*
            定义两个重载的方法,分别求圆和长方形的面积。
            1、定义两个求面积的重载方法,圆周率可以用Math.PI表示
            2、在主方法中调用方法并将结果输出。
            注意:当圆的半径为4.5,长方形长和宽分别为8和5时,可得到如效果图所示的结果
    */
    public class AreaDemo {
        //求圆形面积
        public double mj(double m){
            double mianji=m*m*Math.PI;
            return mianji;
        }
        //求长方形面积
        public double mj(double c,double k){
            double mianji=c*k;
            return mianji;
        }
        public static void main(String[] args) {
            //定义对象
            AreaDemo areaDemo=new AreaDemo();
            //定义一个double类型的变量存放半径,并初始化
            double r=4.5;
            //定义两个变量存放长和宽,并初始化
            double c=8,k=5;
            //调用方法,求圆的面积并打印输出
            System.out.println("圆的面积为:"+areaDemo.mj(r));
            //调用方法,求长方形面积并打印输出
            System.out.println("长方形的面积是:"+areaDemo.mj(c,k));
    
    
        }
    }
    //圆的面积为:63.61725123519331
    //方形的面积是:40.0
    View Code

     五、方法传值

    1、基本数据类型的传值

    1)方法中改变的值并不会对主方法中的变量值产生影响
    2)主方法必须使用对象的名字调用,例如ex.swapTest();
    3)普通方法直接用方法名字调用(在一个类里),例如swap(m,n);

    4)举例
    public class ExchangeDemo {
        //交换方法
        public void swap(int a,int b){
            int temp;
            System.out.println("交换前:a="+a+","+"b="+b);
            temp=a;
            a=b;
            b=temp;
            System.out.println("交换后:a="+a+","+"b="+b);
        }
        public void swapTest(){
    //ExchangeDemo ex=new ExchangeDemo();
    //普通方法调用方法不需要定义对象,直接调用即可 方法名(实参);
            int m=4,n=5;
            System.out.println("交换前:m="+m+","+"n="+n);
    
            swap(m,n);
            System.out.println("交换后:m="+m+","+"n="+n);
        }
        public static void main(String[] args) {
            ExchangeDemo ex=new ExchangeDemo();
            ex.swapTest();
    /*int m=4,n=5;
    System.out.println("交换前:m="+m+","+"n="+n);
    
    ex.swap(m,n);
    System.out.println("交换后:m="+m+","+"n="+n);*/
    
        }
    }
    View Code

    2、数组的传值

    1)基本数据类型传值不会影响主方法中的值;
    2)引用数据类型的传值会影响主方法中的值【数组、类、接口】。
    3)个人观点:基本数据类型作为方法参数时传递的是其保存的值;引用数据类型作为方法参数时传递的是其数据存储地址。
    4)举例:
    public class Ten {
    //定义一个用于修改某个数组元素值的方法
    
        public void updateArry(int[] a) {
            a[3]=15;
            System.out.println("数组a的元素为:");
            for(int n:a) {
                System.out.print(n+" ");
            }
            System.out.println();
        }
        public static void main(String[] args) {
            Ten b=new Ten();
            int[] a1= {1,2,3,4,5};
            System.out.println("方法调用前数组a1元素为:");
            for(int n:a1) {
                System.out.print(n+" ");
            }
            System.out.println();
            b.updateArry(a1);
            System.out.println("方法调用后数组a1元素为:");
            for(int n:a1) {
                System.out.print(n+" ");
            }
        }
    
    }
    //方法调用前数组a1元素为:
    //        1 2 3 4 5
    //        数组a的元素为:
    //        1 2 3 15 5
    //        方法调用后数组a1元素为:
    //        1 2 3 15 5 
    View Code

     六、可变参数列表

    1、定义

    参数的数量是不确定,可随时变化,
    例如:
    public void sum(int... n){}
     
    1)当方法的参数中有多个参数的时候,可变参数列表必须放在最后一个位置
    2)当可变参数列表作为方法参数时,可以将数组传递给可变参数列表
    3)数组作为参数时,是不能将多个值传递给数组的
    4)在方法定义中,方法名相同,一个可变参数,一个数组,认为当前的两个search方法重复定义,而不是重载!
     

    2、只有一个可变参数

     

    3、参数列表中有两个参数

    public class ArgsDemo1 {
        //查找
        public void search(int n,int...a){//可变参数不能使用数组
            boolean flag=false;
            for(int a1:a){
                if(a1==n){
                    flag=true;
                    break;
                }
            }
            if(flag){
                System.out.println("找到了"+n);
            }
            else{
                System.out.println("没找到"+n);
            }
        }
        public static void main(String[] args) {
            ArgsDemo1 ad1=new ArgsDemo1();
            ad1.search(3,1,2,3,4,5);
            int[] a={1,2,3,4,5};//可以将数组传递给可变参数列表
            ad1.search(3,a);
    
        }
    }
    //找到了3
    //找到了3
    View Code

    4、可变参数列表作为方法参数的重载问题

    可变参数列表所在的方法是最后被访问的。
     

    5、文档注释

    1)
    /**
    *关于可变参数列表和重载的问题
    *@author fiona作者
    *@version 1.0版本
    */
     
    2)在控制台进入相关目录下后可以通过javadoc -d doc xxx.java 生成doc文档包,生成的文档名叫index.html。(xxx类名)

     七、方法的调试

    eclipse功能键:
    F5单步跳入(进入方法内部执行)
    F6单步执行
    F7单步跳出(由方法内部跳回调用处)
    F8运行完当前断点,一直执行到下一个断点
    F11进入debug
     

    八、总结

    1、方法声明的语法格式
    访问修饰符 返回类型 方法名(参数列表) {
       方法体
    }
    1)访问修饰符:public、private、protected、默认(什么都不写)
    2)返回类型:可以是void或者任何数据类型(基本数据类型、引用数据类型)
    3)方法名:参数内容可以省略,可以是基本数据类型或者引用数据类型
     
    2、方法调用:
    用 类名创建对象:
    类名 对象名=new 类名();//Demo d =new Demo();
    然后用 对象名.方法名();进行调用。
     
    3、方法的重载:只与方法名和参数 列表相关,只有方法名相同,参数列表不同才是重载。
     
    4、可变参数列表:public void sum(int...n);
    1)当有两个以上的参数,可变参数必须放在最后。
    2)数组可以传递给可变参数的方法,反之不行。
    3)在重载中,含有可变参数的方法是最后被调用的。
    4)可变参数一定是 方法中最后一个参数;
    5)数组可以传递给可变参数的方法,反之不行
     
    5、方法的传值问题(基本数据类型传值,引用数据类型传值)
    1)基本数据类型传值:方法中对参数的修改,不会对 主方法中传来的变量产生影响。
    2)引用数据类型传值:方法中的改变,会影响主方法中传来的数组。
     
    6.方法调试
      

  • 相关阅读:
    VMware虚拟机网络设置
    Spring4 In Action-7.1.2-自定义DispatcherServlet配置、添加其他的Servlet和Filter
    Spring4 In Action-5.2.3-Spring Web应用程序-向页面输出列表、接收参数、接收表单
    Spring4 In Action-5.2.2-Spring Web应用程序-简单的控制器实现跳转
    Spring4 In Action-4.3-@AspectJ-args-往切面传递参数
    Spring4 In Action-4.2-@AspectJ-切面
    java.lang.IllegalStateException: Failed to load ApplicationContext
    Spring4 In Action-3.5.1-@PropertySource运行时注入值
    Spring4 In Action-3.2@Scope单例、多例Bean
    Spring In Action-3.2@Conditional条件化Bean
  • 原文地址:https://www.cnblogs.com/haifeima/p/12658486.html
Copyright © 2020-2023  润新知