06 方法其他知识

一、方法重载

1.1 概念

方法重载:指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返回值类型无关。
      多个方法在同一个类中
      多个方法具有相同的方法名
      多个方法的参数不相同,类型不同或者数量不同
注意
      参数列表:个数不同,数据类型不同,顺序不同。
      重载方法调用:JVM通过方法的参数列表,调用不同的方法。

使用方法重载练习
public class Demo02MethodOverLoad {
    public static void main(String[] args) {
        //调用方法: 输出调用
        System.out.println(getSum(10,20));
        System.out.println(getSum(10,20,30));
        System.out.println(getSum(10.0,20.0));
        System.out.println(getSum(10.0,20.0,30.0));

    }

    //1.定义一个获取两个int数字之和的方法
    public static int getSum(int a, int b) {
        System.out.println("求两个int数字之和....");
        return a + b;
    }

    //2.定义一个获取三个int数字之和的方法
    public static int getSum(int a, int b,int c) {
        System.out.println("求三个int数字之和....");
        return a + b + c;
    }

    //3.定义一个获取两个double数字之和的方法
    public static double getSum(double a, double b) {
        System.out.println("求两个double数字之和....");
        return a + b;
    }

    //4.定义一个获取三个double数字之和的方法
    public static double getSum(double a, double b,double c) {
        System.out.println("求三个double数字之和....");
        return a + b + c;
    }
}
    

1.2 方法重载注意事项一

/*
    参数列表不同有哪些情况,可以构成重载?
        1.参数的数量不同
        2.参数的类型不同
        3.多个类型顺序不同

    方法重载关键看: 在方法名称相同的前提下,参数列表必须要有本质(名称不算)的区别
 */
public class Demo03MethodOverLoad {
    public static void main(String[] args) {

    }

    //1.定义方法method,没有参数
    public static void method() {

    }

    //2.定义方法method,有一个int参数
    //1没有参数,2有一个参数,参数的数量不同,可以构成重载
    public static void method(int a) {

    }

    //3.定义方法method,有一个double参数
    //2有一个int参数,3有一个double参数,参数的类型不同,可以构成重载
    public static void method(double a) {

    }

    //4.定义方法method,有一个int参数和一个double参数
    public static void method(int a, double b) {

    }

    //5.定义方法method,有一个double参数和一个int参数
    //4是先int后double,5是先double后int,多个类型顺序不同
    public static void method(double a, int b) {

    }
}

1.3 方法重载注意事项二

/*
    方法重载与哪些因素无关?
        1.与返回值类型无关
        2.与参数名称无关
        3.与修饰符无关
 */
public class Demo04MethodOverLoad {
    public static void main(String[] args) {

    }

    //1.定义方法method,参数是一个int,一个double
    public static int method(int a, double b) {
        return 0;
    }
    //2.定义方法method,参数是一个int,一个double
    //1返回int类型,2返回double类型,其它没有区别,不能构成重载,因为方法重载与返回值类型无关
    /*public static double method(int a, double b) {
        return 0.0;
    }*/

    //3.定义方法method,参数是一个int,一个double
    //1.的参数名称叫a和b,3的参数名称叫c和d,其它没有却别,不能构成重载因为方法重载与参数名称无关
    /*public static int method(int c, double d) {
        return 0;
    }*/

    //4.定义方法method,参数是一个int,一个double
    //1修饰符是public static,4修饰符是public,其它没区别,不能构成重载因为方法重载与修饰符无关
    /*public int method(int a, double b) {
        return 0;
    }*/
}

二、方法的参数传递

形式参数:
        在定义方法时,()中定义的变量,称为形式参数,定义时必须不能有值,方法被调用时,才会有值

实际参数:
        在调用方法时,()中给定的参数(常量/变量),称为实际参数,如果是变量,则必须要有值

2.1 基本数据类型作为方法参数

/*特点:
        形式参数的改变,不会影响实际参数
 
原因:
        基本类型作为参数,传递的是具体的数据值
        每个方法都有自己的内存空间,所以每个方法内部的变量也有自己的内存空间,
        即便是不同的方法内部定义了同名的变量,他们的内存空间不同,它们之间互不影响,互不干扰

 */
public class Demo03BaseVar {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        System.out.println("ms..a="+a);//10
        System.out.println("ms..b="+b);//20

        //调用方法
        change( a, b );//调用方法时,()中给出的参数,称为实际参数

        System.out.println("me..a="+a);//10
        System.out.println("me..b="+b);//20
    }

    //定义方法
    public static void change(int a, int b) {//方法定义时,()中定义的变量,称为形式参数
        System.out.println("cs..a="+a);//10
        System.out.println("cs..b="+b);//20
        a = a * 10;
        b = b * 10;
        System.out.println("ce..a="+a);//100
        System.out.println("cd..b="+b);//200

        return ;//结束方法,返回到调用处
    }
}

2.2 引用数据类型作为方法参数

 /*特点:
        形式参数的改变,会影响实际参数
        通过形参找到堆内存空间的数组,修改元素值后,再通过实参看到的是修改后的数组内容

    原因:
        引用变量保存的是堆内存空间的地址值,调用方法传递的是地址值,
        导致多个变量指向同一个数组,只要有一个变量修改的数组的元素,
        其它变量看到的都是修改后的元素

 */
public class Demo04RefVar {
    public static void main(String[] args) {
        int[] a = new int[] {10,20};//数组变量a保存数组在堆内存空间的地址
        System.out.println("ms..a[0]="+a[0]);//10
        System.out.println("ms..a[1]="+a[1]);//20

        //调用方法: 传递的是地址值
        change( a );//调用方法时,()中给出的参数,称为实际参数

        System.out.println("me..a[0]="+a[0]);//100
        System.out.println("me..a[1]="+a[1]);//200
    }

    //定义方法
    public static void change(int[] a) {//方法定义时,()中定义的变量,称为形式参数

        System.out.println("cs..a[0]="+a[0]);//10
        System.out.println("cs..a[1]="+a[1]);//20
        a[0] = a[0] * 10;
        a[1] = a[1] * 10;
        System.out.println("ce..a[0]="+a[0]);//100
        System.out.println("ce..a[1]="+a[1]);//200

        return ;//结束方法,返回到调用处
    }
}

2.3 方法的参数练习一

import java.util.Arrays;
import java.util.Scanner;

public class Demo09 {
    public static void main(String[] args) {
        /*在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数分。
        选手的最后得分为:去掉一个最高分和一个最低分后 的4个评委平均值 (不考虑小数部分)。*/
        int[] array = getArray(6);
        printArray(array);
        int sum = getSum(array);
        System.out.println("6个评委的总分为:" + sum);
        int max = getMax(array);
        System.out.println("6个评委中最高评分为:" + max);
        int min = getMin(array);
        System.out.println("6个评委中最低评分为:" + min);
        int avg = (sum - max - min) / (array.length - 2);
        System.out.println("去掉最高分去掉最低分后的平均分为:" + avg);
    }

    //获得数组
    public static int[] getArray(int value_num) {
        Scanner sc = new Scanner(System.in);
        int[] array = new int[value_num];
        for (int i = 0; i < array.length; i++) {
            System.out.println("第" + (i + 1) + "个评委的分数为:");
            array[i] = sc.nextInt();
        }
        return array;
    }

    //打印数组
    public static void printArray(int[] array) {
        System.out.println(Arrays.toString(array));
    }

    //获得数组中元素值的总和
    public static int getSum(int[] array) {
        int sum = 0;
        for (int i = 0; i < array.length; i++) {
            sum += array[i];
        }
        return sum;
    }

    //获得数组中元素值的最大值
    public static int getMax(int[] array) {
        int max = array[0];
        for (int i = 1; i < array.length; i++) {
            if (max < array[i]) {
                max = array[i];
            }
        }
        return max;
    }

    //获得数组中元素值的最小值
    public static int getMin(int[] array) {
        int min = array[0];
        for (int i = 1; i < array.length; i++) {
            if (min > array[i]) {
                min = array[i];
            }
        }
        return min;
    }
}

2.4 练习二

方法一:
public class Demo11 {
    public static void main(String[] args) {
       /* 定义一个方法传入一个int类型数组,输出这个数组中每一个数字及其出现的个数
        例如 传入数组[1,2,2,2,3,3,4,4,4,4]  打印结果:
        数字1出现了1次
        数字2出现了3次…*/
        int[] array = {1,2,2,2,3,3,4,4,4,4};
        printNum(array);
    }

    public static void printNum(int[] array) {
        int[] new_array =new int[array.length];
        int num = 0;
        for (int i = 0; i < array.length; i++) {
            boolean flag = true;
            for (int i1 = i+1; i1 < array.length; i1++) {
                if (array[i] == array[i1]) {   //i索引后面有和array[i]相同元素的话,不把这个元素放到新的数组中
                    flag = false;
                    break;
                }
            }
            if (flag) {
                new_array[num] = array[i];
                num++;
            }
        }
        for (int i = 0; i < num; i++) {
            int count = getNum(new_array[i],array);
            System.out.println("数字"+new_array[i]+"出现了"+count+"次");
        }
    }
    public static int getNum(int value,int[] array){
        int num =0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] == value) {
                num++;
            }
        }
        return num;
    }
}


方法二:
package com.itheima.level02;
/*
 * 定义一个方法传入一个int类型数组,输出这个数组中每一个数字及其出现的个数
	例如 传入数组[1,2,2,2,3,3,4,4,4,4]  
		打印结果:
			数字1出现了1次
			数字2出现了3次…
			
			
	如:原数组:		 int[] arr =   {1,2,2,2,3,3,4,4,4,4,22,0,0}  
	 	记录出现的元素	 int[] ele =   {1,2,3,4,22,0}
	 	记录元素出现的次数  int[] count = {1,3,2,4, 1,2}
 */
public class Task02 {
	
	public static void main(String[] args) {
		int[] arr = {1,2,2,2,3,3,4,4,4,4,22,0,0};
		
		int[] ele = new int[arr.length];//记录出现的元素
		ele[0] = arr[0]; //数字1
		int index = 1; //已存到ele数组中元素数量
		
		int[] count = new int[arr.length];//记录元素出现的个数
		count[0] = 1; //记录出现1次
		
		for (int i = 1; i < arr.length; i++) {
			int element = arr[i];
			//查找element元素在ele数组中是否存在
			//存在,则元素出现个数+1, 
			boolean isFind = false; 
			for (int j = 0; j < index; j++) {
				if (ele[j] == element) {
					isFind = true;//说明已找到
					count[j]++;//出现次数+1
				}
			}
			if (!isFind) {//如果不存在,则元素存个ele数组中,并设置元素出现个数为1
				ele[index] = element;
				count[index] = 1;
				index++;
			}
		}
		
		//打印结果:
		for (int i = 0; i < index; i++) {
			//数字1出现了1次
			System.out.println("数字"+ele[i]+"出现了"+count[i]+"次");
		}
	} 
}


方法三:
public class Demo11 {
    public static void main(String[] args) {
       /* 定义一个方法传入一个int类型数组,输出这个数组中每一个数字及其出现的个数
        例如 传入数组[1,2,2,2,3,3,4,4,4,4]  打印结果:
        数字1出现了1次
        数字2出现了3次…*/

       /*定义一个方法传入一个int类型数组,输出这个数组中每个数字及其出现的个数
       * 例如 传入数组[]*/
        int[] array = {1,2,2,2,3,3,4,4,4,4};
        printNum(array);
    }
    public static void printNum(int[] array) {
        int num = 0;
        for (int i = 0; i < array.length; i++) {
            boolean flag = true;
            for (int j = 0; j < i; j++) {       
                if (array[i] == array[j]) {  //i的索引前面如果有和array[i]相同的元素的时候,不打印输出
                    flag = false;
                    break;
                }
            }
            if (flag) {
                int count = getNum(array[i], array);
                System.out.println("数字"+array[i]+"出现了"+count+"次");
            }
        }
    }
    public static int getNum(int value,int[] array){
        int num =0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] == value) {
                num++;
            }
        }
        return num;
    }
}

2.5 练习三

import java.util.Arrays;
public class Demo03 {
public static void main(String[] args) {
    /*冒泡排序  {2,6,5,4,3,1} ----->{1,2,3,4,5,6} 
    
    第一步:{2,6,5,4,3,1}------->{2,5,4,3,1,6}
    第二步:{2,5,4,3,1,6}------->{2,4,3,1,5,6}
    ...
    最后一步:{2,1,3,4,5,6,}------>{1,2,3,4,5,6}*/
    int[] array = {2,6,5,4,3,1};
    for (int i = 1; i < 6; i++) {
        getArray(array,i);
    }
    System.out.println(Arrays.toString(array));
}

    public static void getArray(int[] array, int a) {
        for (int i = 0; i < array.length-a; i++) {
            if (array[i] > array[i + 1]) {
                array[i] = array[i]^array[i+1];
                array[i+1] = array[i]^array[i+1];
                array[i] = array[i]^array[i+1];
            }
        }
    }
}

三、随机数

3.1 Random产生随机数(掌握)

  • 概述:

    • Random类似Scanner,也是Java提供好的API,内部提供了产生随机数的功能
    • API后续课程详细讲解,现在可以简单理解为Java已经写好的代码
  • 使用步骤:

    1. 导入包

      import java.util.Random;

    2. 创建对象

      Random r = new Random();

    3. 产生随机数

      int num = r.nextInt(10);

      解释: 10代表的是一个范围,如果括号写10,产生的随机数就是0(包括)-9(包括),括号写20,参数的随机数则是0(包括)-19(包括)

3.2 Random练习-猜数字

  • 需求:程序自动生成一个1-100(包含1和100)之间的数字,使用程序实现猜出这个数字是多少?

  • 效果:

    • 如果猜的数字比真实数字大,提示你猜的数据大了
    • 如果猜的数字比真实数字小,提示你猜的数据小了
    • 如果猜的数字与真实数字相等,提示恭喜你猜中了
  • 代码实现

/*
   Random练习-猜数字
       需求:程序自动生成一个1-100(包含1和100)之间的数字,使用程序实现猜出这个数字是多少?
       效果:
           如果猜的数字比真实数字大,提示你猜的数据大了
           如果猜的数字比真实数字小,提示你猜的数据小了
           如果猜的数字与真实数字相等,提示恭喜你猜中了

       实现步骤:
           1.创建Random类的对象
           2.产生一个1-100(包含1和100)之间的数字保存到int变量guessNum中,以供大家猜测
           3.创建键盘录入Scanner类的对象
           4.到底多少次可以猜对,是不确定的,使用死循环(while(true))
           4.1 获取键盘录入的用户猜测的数字,保存到int变量inputNum中
           4.2 判断 如果用户猜测的inputNum中的数字 等于 产生的 guessNum 中的数字,说明猜对了
               提示: "恭喜你猜中了"
               使用break,结束循环
           4.3 判断 如果用户猜测的inputNum中的数字 小于 产生的 guessNum 中的数字,说明没猜对
               提示: "你猜的数据小了"
           4.4 判断 如果用户猜测的inputNum中的数字 大于 产生的 guessNum 中的数字,说明没猜对
               提示: "你猜的数据大了"



*/
public class Demo06GuessNum {
   public static void main(String[] args) {
       //1.创建Random类的对象
       Random r = new Random();

       //2.产生一个1-100(包含1和100)之间的数字保存到int变量guessNum中,以供大家猜测
       int guessNum = r.nextInt(100) + 1;

       //3.创建键盘录入Scanner类的对象
       Scanner sc = new Scanner(System.in);

       //4.到底多少次可以猜对,是不确定的,使用死循环(while(true))
       while (true) {
           //4.1 获取键盘录入的用户猜测的数字,保存到int变量inputNum中
           System.out.println("请输入您猜测的数字(1到100之间的): ");
           int inputNum = sc.nextInt();

           //4.2 判断 如果用户猜测的inputNum中的数字 等于 产生的 guessNum 中的数字,说明猜对了
           if (inputNum == guessNum) {
               //提示: "恭喜你猜中了"
               System.out.println("恭喜你猜中了");

               //使用break,结束循环
               break;

           } else if (inputNum < guessNum) {
               //4.3 判断 如果用户猜测的inputNum中的数字 小于 产生的 guessNum 中的数字,说明没猜对
               //提示: "你猜的数据小了"
               System.out.println("你猜的数据小了");
           } else {
               //4.4 判断 如果用户猜测的inputNum中的数字 大于 产生的 guessNum 中的数字,说明没猜对
               //提示: "你猜的数据大了"
               System.out.println("你猜的数据大了");

           }

       }
   }
}

3.2 Random练习-电脑猜数字

import java.util.Random;
import java.util.Scanner;

public class Demo13 {
    public static void main(String[] args) {
        //输入一个0~100之间的数字,让电脑来猜,看需要多少次能够猜对
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数(0~100):");
        int num = sc.nextInt();
        Random rand = new Random();
        int b = 0;
        int c = 100;
        int count = 1;
        while (true) {
            //boolean flag = true;   //
            int a = rand.nextInt(c - b + 1) + b;
            System.out.println(a);
            if (a > num) {
                System.out.println("猜大了");
                c = a - 1;
                System.out.println("在" + b + "~" + c + "的范围内");
            } else if (a < num) {
                System.out.println("猜小了");
                b = a + 1;
                if (c == 101) {
                    System.out.println("在" + b + "~" + 100 + "的范围内");
                }
                System.out.println("在" + b + "~" + c + "的范围内");
            } else {
                System.out.println("恭喜您猜对了");
                break;
            }
            count++;

        }
        System.out.println("一共猜了" + count + "次猜对");
    }
}
posted @ 2021-07-12 10:41  uoi  阅读(133)  评论(0)    收藏  举报