java基础应用

1.数组

1.1 数组介绍

​ 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。

1.2 数组的定义格式

1.2.1 第一种格式

​ 数据类型[] 数组名

​ 示例:

int[] arr;        
double[] arr;      
char[] arr;
1.2.2 第二种格式

​ 数据类型 数组名[]

​ 示例:

int arr[];
double arr[];
char arr[];

1.3 数组的动态初始化

1.3.1 什么是动态初始化

​ 数组动态初始化就是只给定数组的长度,由系统给出默认初始化值

1.3.2 动态初始化格式
数据类型[] 数组名 = new 数据类型[数组长度];
int[] arr = new int[3];
1.3.3 动态初始化格式详解
  • 等号左边:

    • int:数组的数据类型

    • []:代表这是一个数组

    • arr:代表数组的名称

  • 等号右边:

    • new:为数组开辟内存空间
    • int:数组的数据类型
    • []:代表这是一个数组
    • 5:代表数组的长度

代码 :

package com.wedu.array;

public class Demo2Array {
    /*
        数组的动态初始化:
                        在初始化的时候, 需要手动指定数组的长度, 系统会为数组容器分配初始值.

        动态初始化格式:
                        数据类型[] 数组名 = new 数据类型[数组的长度];

        注意:
                        打印数组变量的时候, 会打印出数组的内存地址

        [I@10f87f48 :

                        @ : 分隔符
                        [ : 当前的空间是一个数组类型
                        I : 当前数组容器中所存储的数据类型
                        10f87f48 : 十六进制内存地址

                                0 1 2 3 4 5 6 7 8 9 a b c d e f
     */
    public static void main(String[] args) {
        // 数据类型[] 数组名 = new 数据类型[数组的长度];
        // 通过new关键字创建了一个int类型的数组容器, 该容器可以存储5个int类型的整数, 该容器被arr数组变量所记录
        int[] arr = new int[5];
        // [I@10f87f48
        System.out.println(arr);

        byte[] bArr = new byte[3];
        // [B@b4c966a
        System.out.println(bArr);

    }
}

1.4 数组元素访问

1.4.1 什么是索引

​ 每一个存储到数组的元素,都会自动的拥有一个编号,从0开始。

​ 这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。

1.4.2访问数组元素格式
数组名[索引];
1.4.3示例代码
package com.wedu.array;

public class Demo3ArrayIndex {
    /*
        数组动态初始化:
                初始化的时候, 手动指定数组长度, 系统会为数组容器分配初始值.

        数组的元素访问格式:
                数组名[索引]

                索引: 数组中数据的编号方式, 编号从0开始
                作用: 访问数组容器中的空间位置

        注意:
                数组在创建完毕后, 即使没有赋值, 也可以取出, 但取出的元素都是默认初始化值.

     */
    public static void main(String[] args) {
        int[] arr = new int[3];         // 0 1 2
        System.out.println(arr);        // 数组的内存地址  [I@10f87f48

        // 数组名[索引]  访问数组容器中的空间位置
        System.out.println(arr[0]);     // 0  系统自动分配的默认初始化值
        System.out.println(arr[1]);
        System.out.println(arr[2]);

        System.out.println("--------------");

        // 数组名[索引]
        arr[0] = 11;
        arr[1] = 22;
        arr[2] = 33;

        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
}

1.5 内存分配

1.5.1 内存概述

​ 内存是计算机中的重要原件,临时存储区域,作用是运行程序。

​ 我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。

​ 必须放进内存中才能运行,运行完毕后会清空内存。

​ Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。

1.5.2 java中的内存分配
  • 目前我们只需要记住两个内存,分别是:栈内存和堆内存
区域名称作用
寄存器给CPU使用,和我们开发无关。
本地方法栈JVM在使用操作系统功能的时候使用,和我们开发无关。
方法区存储可以运行的class文件。
堆内存存储对象或者数组,new来创建的,都存储在堆内存。
方法栈方法运行时使用的内存,比如main方法运行,进入方法栈中执行。

1.6 Java内存分配-一个数组内存图

在这里插入图片描述

1.7 两个数组内存图

在这里插入图片描述

1.8 多个数组指向相同内存图

在这里插入图片描述

1.9 数组的静态初始化

1.9.1 什么是静态初始化

​ 在创建数组时,直接将元素确定

1.9.2 静态初始化格式
  • 完整版格式

    数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
    
  • 简化版格式

    数据类型[] 数组名 = {元素1,元素2,...};
    
1.9.3示例代码
package com.wedu.array2;

public class Demo1Array {
    /*
        数组静态初始化 : 初始化时指定每个数组元素的初始值,由系统决定数组长度

        完整格式:
                    数据类型[] 数组名 = new 数据类型[]{数据1,数据2,数据3...};
        简化格式:
                    数据类型[] 数组名 = {数据1,数据2,数据3...};
     */
    public static void main(String[] args) {
        // 数据类型[] 数组名 = new 数据类型[]{数据1,数据2,数据3...};
        int[] arr = new int[]{11,22,33};
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);

        // 数据类型[] 数组名 = {数据1,数据2,数据3...};
        int[] arr2 = {44,55,66};
        System.out.println(arr2);
        System.out.println(arr2[0]);
        System.out.println(arr2[1]);
        System.out.println(arr2[2]);

    }
}

1.10 数组操作的两个常见问题

1.10.1 索引越界异常
  • 出现原因

    public class ArrayDemo {
        public static void main(String[] args) {
            int[] arr = new int[3];
            System.out.println(arr[3]);
        }
    }
    

    数组长度为3,索引范围是0~2,但是我们却访问了一个3的索引。

    程序运行后,将会抛出ArrayIndexOutOfBoundsException 数组越界异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。

  • 解决方案

    将错误的索引修改为正确的索引范围即可!

1.10.2 空指针异常
  • 出现原因

    public class ArrayDemo {
        public static void main(String[] args) {
            int[] arr = new int[3];
    
            //把null赋值给数组
            arr = null;
            System.out.println(arr[0]);
        }
    }
    

    arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出 NullPointerException 空指针异常。在开发中,空指针异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。

  • 解决方案

    给数组一个真正的堆内存空间引用即可!

1.11 数组遍历

  • 数组遍历:就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。

    public class ArrayTest01 {
    	public static void main(String[] args) {
    		int[] arr = { 1, 2, 3, 4, 5 };
    		System.out.println(arr[0]);
    		System.out.println(arr[1]);
    		System.out.println(arr[2]);
    		System.out.println(arr[3]);
    		System.out.println(arr[4]);
    	}
    }
    

    以上代码是可以将数组中每个元素全部遍历出来,但是如果数组元素非常多,这种写法肯定不行,因此我们需要改造成循环的写法。数组的索引是 0 到 lenght-1 ,可以作为循环的条件出现。

    public class ArrayTest01 {
        public static void main(String[] args) {
            //定义数组
            int[] arr = {11, 22, 33, 44, 55};
    
            //使用通用的遍历格式
            for(int x=0; x<arr.length; x++) {
                System.out.println(arr[x]);
            }
        }
    }
    

1.12 数组获取最大值

  • 最大值获取:从数组的所有元素中找出最大值。

  • 实现思路:

    • 定义变量,保存数组0索引上的元素
    • 遍历数组,获取出数组中的每个元素
    • 将遍历到的元素和保存数组0索引上值的变量进行比较
    • 如果数组元素的值大于了变量的值,变量记录住新的值
    • 数组循环遍历结束,变量保存的就是数组中的最大值
  • 代码实现:

    package com.wedu.test;
    
    import java.util.Scanner;
    
    public class Test2Array {
        /*
            需求: 从数组中查找最大值
    
                    int[] arr = {12,45,98,73,60};
    
            实现步骤:
                    1. 假设数组中的第一个元素为最大值
                    2. 遍历数组, 获取每一个元素, 准备进行比较
                    3. 如果比较的过程中, 出现了比max更大的, 让max记录更大的值
                    4. 循环结束后, 打印最大值.
         */
        public static void main(String[] args) {
            int[] arr = {12,45,98,73,60};
            // 1. 假设数组中的第一个元素为最大值
            int max = arr[0];
            // 2. 遍历数组, 获取每一个元素, 准备进行比较
            for(int i = 1; i < arr.length; i++){
                // 3. 如果比较的过程中, 出现了比max更大的, 让max记录更大的值
                if(arr[i] > max){
                    max = arr[i];
                }
            }
            //  4. 循环结束后, 打印最大值.
            System.out.println("max:" + max);
        }
    }
    
    

1.13 数组元素求和

  • 需求:键盘录入5个整数,存储到数组中,并对数组求和

  • 思路:
    1.创建键盘录入对象,准备键盘录入
    2.定义一个求和变量,准备记录累加后的结果
    3.动态初始化一个长度为5的int数组,准备存储键盘录入的数值
    4.将键盘录入的数值存储到数组中
    5.遍历数组,取出每一个元素,并求和
    6.输出总和

  • 代码实现:

    package com.wedu.test;
    
    import java.util.Scanner;
    
    public class Test3Array {
        /*
            需求:键盘录入5个整数,存储到数组中,并对数组求和
    
            思路:
                1.创建键盘录入对象,准备键盘录入
                2.定义一个求和变量,准备记录累加后的结果
                3.动态初始化一个长度为5的int数组,准备存储键盘录入的数值
                4.将键盘录入的数值存储到数组中
                5.遍历数组,取出每一个元素,并求和
                6.输出总和
         */
        public static void main(String[] args) {
            // 1.创建键盘录入对象,准备键盘录入
            Scanner sc = new Scanner(System.in);
            // 2.定义一个求和变量,准备记录累加后的结果
            int sum = 0;
            // 3.动态初始化一个长度为5的int数组,准备存储键盘录入的数值
            int[] arr = new int[5];
            // 4.将键盘录入的数值存储到数组中
            for(int i = 0; i < arr.length; i++){
                System.out.println("请输入第" + (i+1) + "个整数:");
                //arr[i] = 10;
                arr[i] = sc.nextInt();
            }
    
            // 5.遍历数组,取出每一个元素,并求和
            for (int i = 0; i < arr.length; i++) {
                sum += arr[i];
            }
    
            // 6.输出总和
            System.out.println("sum:" + sum);
    
        }
    }
    
    

1.14 数组基本查找【应用】

  • 需求:
    已知一个数组 arr = {19, 28, 37, 46, 50}; 键盘录入一个数据,查找该数据在数组中的索引,并在控
    制台输出找到的索引值。

  • 思路:
    1.定义一个数组,用静态初始化完成数组元素的初始化
    2.键盘录入要查找的数据,用一个变量接收
    3.定义一个索引变量,初始值为-1
    4.遍历数组,获取到数组中的每一个元素
    5.拿键盘录入的数据和数组中的每一个元素进行比较,如果值相同,就把该值对应的索引赋值给索引变量,并结束循环
    6.输出索引变量

  • 代码实现:

    public static void main(String[] args) {
            // 1.定义一个数组,用静态初始化完成数组元素的初始化
            int[] arr = {19, 28, 37, 46, 50};
            // 2.键盘录入要查找的数据,用一个变量接收
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入您要查找的元素:");
            int num = sc.nextInt();
            // 3.定义一个索引变量,初始值为-1
            // 假设要查找的数据, 在数组中就是不存在的
            int index = -1;
            // 4.遍历数组,获取到数组中的每一个元素
            for (int i = 0; i < arr.length; i++) {
                // 5.拿键盘录入的数据和数组中的每一个元素进行比较,如果值相同,就把该值对应的索引赋值给索引变量,并结束循环
                if(num == arr[i]){
                    // 如果值相同,就把该值对应的索引赋值给索引变量,并结束循环
                    index = i;
                    break;
                }
            }
            //  6.输出索引变量
            System.out.println(index);
        }
    }
    
    

1.15 评委打分【应用】

  • 需求:在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数分。
    选手的最后得分为:去掉一个最高分和一个最低分后 的4个评委平均值 (不考虑小数部分)。

  • 思路:
    1.定义一个数组,用动态初始化完成数组元素的初始化,长度为6
    2.键盘录入评委分数
    3.由于是6个评委打分,所以,接收评委分数的操作,用循环
    4.求出数组最大值
    5.求出数组最小值
    6.求出数组总和
    7.按照计算规则进行计算得到平均分
    8.输出平均分

  • 代码实现:

    import java.util.Scanner;
    
    public class ArrayTest4 {
        public static void main(String[] args) {
            // 1.定义一个数组,用动态初始化完成数组元素的初始化,长度为6
            int[] arr = new int[6];
    
            // 2.键盘录入评委分数
            Scanner sc = new Scanner(System.in);
    
            // 3.由于是6个评委打分,所以,接收评委分数的操作,用循环
            for (int i = 0; i < arr.length; i++) {
                System.out.println("请输入第" + (i+1) + "个评委的打分:");
                int score = sc.nextInt();
                if(score >= 0 && score <= 100){
                    // 合法的分值
                    arr[i] = score;
                } else {
                    // 非法的分值
                    System.out.println("您的打分输入有误, 请检查是否是0-100之间的");
                    i--; // 减少i以重新输入该位置的值
                }
            }
    
            // 4.求出数组最大值
            int max = arr[0];
            for (int i = 1; i < arr.length; i++) {
                if(max < arr[i]) {
                    max = arr[i];
                }
            }
    
            // 5.求出数组最小值
            int min = arr[0];
            for (int i = 1; i < arr.length; i++) {
                if(min > arr[i]) {
                    min = arr[i];
                }
            }
    
            // 6.求出数组总和
            int sum = 0;
            for (int i = 0; i < arr.length; i++) {
                sum += arr[i];
            }
    
            // 7.按照计算规则进行计算得到平均分,使用double类型以保持精度
            double avg = (sum - max - min) / 4.0; // 注意这里使用4.0而不是4
    
            // 8.输出平均分
            System.out.println("去除最高分和最低分后的平均分为:" + avg);
    
            // 关闭scanner对象
            sc.close();
        }
    }
    

1. 方法概述

1.1 方法的概念

​ 方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集

  • 注意:
    • 方法必须先创建才可以使用,该过程成为方法定义
    • 方法创建后并不是直接可以运行的,需要手动使用后,才执行,该过程成为方法调用

2. 方法的定义和调用

2.1 无参数方法定义和调用

  • 定义格式:

    public static void 方法名 (   ) {
    	// 方法体;
    }
    
  • 范例:

    public static void method (    ) {
    	// 方法体;
    }
    
  • 调用格式:

    方法名();
    
  • 范例:

    method();
    
  • 注意:

    ​ 方法必须先定义,后调用,否则程序将报错

2.2 方法的调用过程

  • 总结:每个方法在被调用执行的时候,都会进入栈内存,并且拥有自己独立的内存空间,方法内部代码调用完毕之后,会从栈内存中弹栈消失。

2.3 方法练习-奇偶数判断

  • 需求:判断一个数是奇数还是偶数
  • 代码:
public class Demo1Method {
    /*

        带参数方法的定义格式:
                public static void 方法名  ( 参数 )  { … … }
                public static void 方法名  ( 数据类型 变量名 )  { … … }

        带参数方法的调用格式:
                方法名 ( 参数 ) ;
                方法名 ( 变量名/常量值 ) ;

        tips: 参数可以是一个, 也可以是多个.

        需求: 判断一个数是奇数还是偶数
     */
    public static void main(String[] args) {
        isEvenNumber(10);
    }

    public static void isEvenNumber(int num){
        if(num % 2 == 0){
            System.out.println("偶数");
        }else{
            System.out.println("奇数");
        }
    }
}

3. 带参数方法的定义和调用

3.1 带参数方法定义和调用

  • 定义格式:

    参数:由数据类型和变量名组成 - 数据类型 变量名

    参数范例:int a

    public static void 方法名 (参数1) {
    	方法体;
    }
    
    public static void 方法名 (参数1, 参数2, 参数3...) {
    	方法体;
    }
    
  • 范例:

    public static void isEvenNumber(int number){
        ...
    }
    public static void getMax(int num1, int num2){
        ...
    }
    
    • 注意:

      方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序将报错
      
      方法定义时,多个参数之间使用逗号( ,)分隔
      
  • 调用格式:

    方法名(参数);
    
    方法名(参数1,参数2);
    
  • 范例:

    isEvenNumber(10);
    
    getMax(10,20);
    
    • 方法调用时,参数的数量与类型必须与方法定义中的设置相匹配,否则程序将报错

3.2 形参和实参

  1. 形参:方法定义中的参数

​ 等同于变量定义格式,例如:int number

  1. 实参:方法调用中的参数

​ 等同于使用变量或常量,例如: 10 number

3.3 带参数方法的练习-打印n-m之间所有的奇数

  • 需求:设计一个方法(print) 用于打印 n 到 m 之间所有的奇数

  • 思路:

    ​ 1:定义方法,名称为print
    ​ 2:为方法添加两个int类型的形参,准备接受调用者传递过来的实参
    ​ 3:方法中设计for循环,循环从n开始,到m结束
    ​ 4:循环中加入if判断,是奇数,则打印
    ​ 5:main方法中调用print方法,传入两个实际参数

  • 代码:

package com.wedu.method2;

public class Demo2Method {
    public static void main(String[] args) {
        // 5:main方法中调用print方法,传入两个实际参数
        print(20,10);
    }

    //1:定义方法,名称为print
    // 2:为方法添加两个int类型的形参,准备接受调用者传递过来的实参
    public static void print(int n, int m){
        System.out.println(n + "到" + m + "之间的奇数为:");
        // 3:方法中设计for循环,循环从n开始,到m结束
        for(int i = 20; i <= 10; i++){
            // 4:循环中加入if判断,是奇数,则打印
            if(i % 2 == 1){
                System.out.println(i);
            }
        }
    }

}

4. 带返回值方法的定义和调用

4.1 带返回值方法定义和调用

  • 定义格式

    public static 数据类型 方法名 ( 参数 ) { 
    	return 数据 ;
    }
    
  • 范例

    public static boolean isEvenNumber( int number ) {           
    	return true ;
    }
    public static int getMax( int a, int b ) {
    	return  100 ;
    }
    
    • 注意:
      • 方法定义时return后面的返回值与方法定义上的数据类型要匹配,否则程序将报错
  • 调用格式

    方法名 ( 参数 ) ;
    数据类型 变量名 = 方法名 ( 参数 ) ;
    
  • 范例

    isEvenNumber ( 5 ) ;
    boolean  flag =  isEvenNumber ( 5 ); 
    
    • 注意:
      • 方法的返回值通常会使用变量接收,否则该返回值将无意义

4.2 带返回值方法的练习-求两个数的最大值(应用)

  • 需求:设计一个方法可以获取两个数的较大值,数据来自于参数

  • 思路:

    1. 定义一个方法,声明两个形参接收计算的数值,求出结果并返回
    2. 使用 if 语句 得出 a 和 b 之间的最大值,根据情况return具体结果
    3. 在main()方法中调用定义好的方法并使用 【 变量保存 】
  • 代码:

     /*
            需求:设计一个方法可以获取两个数的较大值,数据来自于参数
    
            1. 定义一个方法,声明两个形参接收计算的数值,求出结果并返回
            2. 使用 if 语句 得出 a 和 b 之间的最大值,根据情况return具体结果
            3. 在main()方法中调用定义好的方法并使用 【 变量保存 】
         */
        public static void main(String[] args) {
            // 3. 在main()方法中调用定义好的方法并使用 【 变量保存 】
            System.out.println(getMax(10,20));  // 输出调用
    
            int result = getMax(10,20);
            System.out.println(result);
    
            for(int i = 1; i <= result; i++){
                System.out.println("HelloWorld");
            }
    
        }
    
        // 方法可以获取两个数的较大值
        public static int getMax(int a, int b){
            if(a > b){
                return a;
            }else{
                return b;
            }
        }
    
    }
    
    

5. 方法的注意事项

5.1 方法的通用格式

  • 格式:

    public static 返回值类型 方法名(参数) {
       方法体; 
       return 数据 ;
    }
    
  • 解释:

    • public static 修饰符,目前先记住这个格式

      返回值类型 方法操作完毕之后返回的数据的数据类型

      ​ 如果方法操作完毕,没有数据返回,这里写void,而且方法体中一般不写return

      方法名 调用方法时候使用的标识

      参数 由数据类型和变量名组成,多个参数之间用逗号隔开

      方法体 完成功能的代码块

      return 如果方法操作完毕,有数据返回,用于把数据返回给调用者

  • 定义方法时,要做到两个明确

    • 明确返回值类型:主要是明确方法操作完毕之后是否有数据返回,如果没有,写void;如果有,写对应的数据类型
    • 明确参数:主要是明确参数的类型和数量
  • 调用方法时的注意:

    • void类型的方法,直接调用即可
    • 非void类型的方法,推荐用变量接收调用

5.2 方法的注意事项

  • 方法不能嵌套定义

    • 示例代码:

      public class MethodDemo {
          public static void main(String[] args) {
      
          }
      
          public static void methodOne() {
      		public static void methodTwo() {
             		// 这里会引发编译错误!!!
          	}
          }
      }
      
  • void表示无返回值,可以省略return,也可以单独的书写return,后面不加数据

    • 示例代码:

      public class MethodDemo {
          public static void main(String[] args) {
      
          }
          public static void methodTwo() {
              //return 100; 编译错误,因为没有具体返回值类型
              return;	
              //System.out.println(100); return语句后面不能跟数据或代码
          }
      }
      

6. 方法重载

6.1 方法重载

  • 方法重载概念

    方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载

    • 多个方法在同一个类中
    • 多个方法具有相同的方法名
    • 多个方法的参数不相同,类型不同或者数量不同
  • 注意:

    • 重载仅对应方法的定义,与方法的调用无关,调用方式参照标准格式
    • 重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关,换句话说不能通过返回值来判定两个方法是否相互构成重载
  • 正确范例:

    public class MethodDemo {
    	public static void fn(int a) {
        	//方法体
        }
        public static int fn(double a) {
        	//方法体
        }
    }
    
    public class MethodDemo {
    	public static float fn(int a) {
        	//方法体
        }
        public static int fn(int a , int b) {
        	//方法体
        }
    }
    
  • 错误范例:

    public class MethodDemo {
    	public static void fn(int a) {
        	//方法体
        }
        public static int fn(int a) { 	/*错误原因:重载与返回值无关*/
        	//方法体
        }
    }
    
    public class MethodDemo01 {
        public static void fn(int a) {
            //方法体
        }
    } 
    public class MethodDemo02 {
        public static int fn(double a) { /*错误原因:这是两个类的两个fn方法*/
            //方法体
        }
    }
    

6.2 方法重载练习

  • 需求:使用方法重载的思想,设计比较两个整数是否相同的方法,兼容全整数类型(byte,short,int,long)

  • 思路:

    ​ ①定义比较两个数字的是否相同的方法compare()方法,参数选择两个int型参数

    ​ ②定义对应的重载方法,变更对应的参数类型,参数变更为两个long型参数

    ​ ③定义所有的重载方法,两个byte类型与两个short类型参数

    ​ ④完成方法的调用,测试运行结果

  • 代码:

    public class MethodTest {
        public static void main(String[] args) {
            //调用方法
            System.out.println(compare(10, 20));
            System.out.println(compare((byte) 10, (byte) 20));
            System.out.println(compare((short) 10, (short) 20));
            System.out.println(compare(10L, 20L));
        }
    
        //int
        public static boolean compare(int a, int b) {
            System.out.println("int");
            return a == b;
        }
    
        //byte
        public static boolean compare(byte a, byte b) {
            System.out.println("byte");
            return a == b;
        }
    
        //short
        public static boolean compare(short a, short b) {
            System.out.println("short");
            return a == b;
        }
    
        //long
        public static boolean compare(long a, long b) {
            System.out.println("long");
            return a == b;
        }
    
    }
    

7. 方法的参数传递

7.1 方法参数传递基本类型

  • 测试代码:

    package com.wedu.param;
    
    public class Test1 {
        /*
             方法参数传递为基本数据类型 :
    
                    传入方法中的, 是具体的数值.
         */
        public static void main(String[] args) {
            int number = 100;
            System.out.println("调用change方法前:" + number);
            change(number);
            System.out.println("调用change方法后:" + number);
        }
    
        public static void change(int number) {
            number = 200;
        }
    }
    
    
    
  • 结论:

    • 基本数据类型的参数,形式参数的改变,不影响实际参数
  • 结论依据:

    • 每个方法在栈内存中,都会有独立的栈空间,方法运行结束后就会弹栈消失

7.2 方法参数传递引用类型

  • 测试代码:

    package com.wedu.param;
    
    public class Test2 {
        /*
             方法参数传递为引用数据类型 :
    
                    传入方法中的, 是内存地址.
         */
        public static void main(String[] args) {
            int[] arr = {10, 20, 30};
            System.out.println("调用change方法前:" + arr[1]);
            change(arr);
            System.out.println("调用change方法后:" + arr[1]);
        }
    
        public static void change(int[] arr) {
            arr[1] = 200;
        }
    }
    
  • 结论:

    • 对于引用类型的参数,形式参数的改变,影响实际参数的值
  • 结论依据:

    • 引用数据类型的传参,传入的是地址值,内存中会造成两个引用指向同一个内存的效果,所以即使方法弹栈,堆内存中的数据也已经是改变后的结果

7.3 数组遍历

  • 需求:设计一个方法用于数组遍历,要求遍历的结果是在一行上的。例如:[11, 22, 33, 44, 55]

  • 思路:

    • 因为要求结果在一行上输出,所以这里需要在学习一个新的输出语句System.out.print(“内容”);

      System.out.println(“内容”); 输出内容并换行

      System.out.print(“内容”); 输出内容不换行

      System.out.println(); 起到换行的作用

    • 定义一个数组,用静态初始化完成数组元素初始化

    • 定义一个方法,用数组遍历通用格式对数组进行遍历

    • 用新的输出语句修改遍历操作

    • 调用遍历方法

  • 代码:

    package com.wedu.test;
    
    public class Test1 {
        /*
            需求:设计一个方法用于数组遍历,要求遍历的结果是在一行上的。例如:[11, 22, 33, 44, 55]
            思路:
                1.定义一个数组,用静态初始化完成数组元素初始化
                2.定义一个方法,对数组进行遍历
                3.遍历打印的时候,数据不换行
                4.调用遍历方法
         */
        public static void main(String[] args) {
            // 1.定义一个数组,用静态初始化完成数组元素初始化
            int[] arr = {11, 22, 33, 44, 55};
            // 4.调用遍历方法
            printArray(arr);
    
            System.out.println("另外一段代码逻辑 ");
        }
    
        /*
            2.定义一个方法,对数组进行遍历
    
            1, 参数           int[] arr
            2, 返回值类型      void
         */
        public static void printArray(int[] arr){
    
            System.out.print("[");
    
            for (int i = 0; i < arr.length; i++) {
    
                if(i == arr.length -1){
                    // 如果满足条件, 说明是最后一个元素, 最后一个元素, 特殊处理
                    System.out.println(arr[i] + "]");
                }else{
                    // 3.遍历打印的时候,数据不换行
                    System.out.print(arr[i] + ", ");
                }
    
    
            }
        }
    }
    
    

7.4 数组最大值

  • 需求:设计一个方法用于获取数组中元素的最大值

  • 思路:

    • ①定义一个数组,用静态初始化完成数组元素初始化
    • ②定义一个方法,用来获取数组中的最大值,最值的认知和讲解我们在数组中已经讲解过了
    • ③调用获取最大值方法,用变量接收返回结果
    • ④把结果输出在控制台
  • 代码:

    package com.wedu.test;
    
    public class Test2 {
        /*
            需求:设计一个方法用于获取数组中元素的最大值
    
            思路:
                1.定义一个数组,用静态初始化完成数组元素初始化
                2.定义一个方法,用来获取数组中的最大值
                3.调用获取最大值方法,用变量接收返回结果
                4.把结果输出在控制台
         */
        public static void main(String[] args) {
            // 1.定义一个数组,用静态初始化完成数组元素初始化
            int[] arr = {11, 55, 22, 44, 33};
            // 3.调用获取最大值方法,用变量接收返回结果
            int max = getMax(arr);
            //  4.把结果输出在控制台
            System.out.println(max);
        }
    
        /*
            2.定义一个方法,用来获取数组中的最大值
    
            1, 参数       int[] arr
            2, 返回值类型  int
         */
        public static int getMax(int[] arr){
            int max = arr[0];
            for (int i = 1; i < arr.length; i++) {
                if(max < arr[i]){
                    max = arr[i];
                }
            }
            return max;
        }
    }
    
    

7.5 方法同时获取数组最大值和最小值

  • 需求:设计一个方法,该方法能够同时获取数组的最大值,和最小值

  • 注意: return语句, 只能带回一个结果.

  • 代码:

    public class Test3 {
        /*
            需求:设计一个方法,该方法能够同时获取数组的最大值,和最小值
    
            注意: return语句, 只能带回一个结果.
         */
        public static void main(String[] args) {
    
            int[] arr = {11,55,33,22,44};
    
            int[] maxAndMin = getMaxAndMin(arr);
    
            System.out.println(maxAndMin[0]);
            System.out.println(maxAndMin[1]);
    
        }
    
        public static int[] getMaxAndMin(int[] arr){
            int max = arr[0];
            for (int i = 1; i < arr.length; i++) {
                if(max < arr[i]){
                    max = arr[i];
                }
            }
    
            int min = arr[0];
            for (int i = 1; i < arr.length; i++) {
                if(min > arr[i]){
                    min = arr[i];
                }
            }
    
            int[] maxAndMin = {min, max};
    
            return maxAndMin;
        }
    }
    
    

8.Debug模式

8.1 什么是Debug模式

是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序。

8.2 Debug介绍与操作流程

  • 如何加断点

    • 选择要设置断点的代码行,在行号的区域后面单击鼠标左键即可
  • 如何运行加了断点的程序

    • 在代码区域右键Debug执行
  • 看哪里

    • 看Debugger窗口

    • 看Console窗口

  • 点哪里

    • 点Step Into (F7)这个箭头,也可以直接按F7
  • 如何删除断点

    • 选择要删除的断点,单击鼠标左键即可

    • 如果是多个断点,可以每一个再点击一次。也可以一次性全部删除

9. 进制的介绍与书写格式

9.1 进制的介绍与书写格式

代码 :

public class Demo1 {
    /*
        十进制:Java中,数值默认都是10进制,不需要加任何修饰。
        二进制:数值前面以0b开头,b大小写都可以。
        八进制:数值前面以0开头。
        十六进制:数值前面以0x开头,x大小写都可以。

        注意: 书写的时候, 虽然加入了进制的标识, 但打印在控制台展示的都是十进制数据.
     */
    public static void main(String[] args) {
        System.out.println(10);
        System.out.println("二进制数据0b10的十进制表示为:" + 0b10);
        System.out.println("八进制数据010的十进制表示为:" + 010);
        System.out.println("十六进制数据0x10的十进制表示为:" + 0x10);
    }
}

9.2 任意进制到十进制的转换

在这里插入图片描述

在这里插入图片描述

9.3 进制转换-十进制到任意进制转换

9.3.1 : 十进制到二进制的转换

​ 公式:除基取余使用源数据,不断的除以基数(几进制,基数就是几)得到余数,直到商为0,再将余数倒着拼起来即可。

​ 需求:将十进制数字11,转换为2进制。

​ 实现方式:源数据为11,使用11不断的除以基数,也就是2,直到商为0。

在这里插入图片描述

9.3.2 : 十进制到十六进制的转换

​ 公式:除基取余使用源数据,不断的除以基数(几进制,基数就是几)得到余数,直到商为0,再将余数倒着拼起来即可。

​ 需求:将十进制数字60,转换为16进制。

​ 实现方式:源数据为60,使用60不断的除以基数,也就是16,直到商为0。

在这里插入图片描述

​ 结论:十进制到任意进制的转换

​ 公式:除基取余使用源数据,不断的除以基数(几进制,基数就是几)得到余数,直到商为0,再将余数倒着 拼起来即可

9.4 快速进制转换法

​ 8421码:

​ 8421码又称BCD码,是BCD代码中最常用的一种BCD: (Binary-Coded Decimal‎) 二进制码十进制数在这种编码方式中,每一位二进制值的1都是代表一个固定数值,把每一位的1代表的十进制数加起来得到的结果就是它所代表的十进制数。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

9.5 原码反码补码

前言 : 计算机中的数据,都是以二进制补码的形式在运算,而补码则是通过反码和原码推算出来的

**原码 **:(可直观看出数据大小)

就是二进制定点表示法,即最高位为符号位,【0】表示正,【1】表示负,其余位表示数值的大小。

通过一个字节表示+7和-7,代码:byte b1 = 7; byte b2 = -7;一个字节等于8个比特位,也就是8个二进制位

0(符号位) 0000111

1(符号位) 0000111

反码 : 正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码 : (数据以该状态进行运算)正数的补码与其原码相同;负数的补码是在其反码的末位加1。

在这里插入图片描述

在这里插入图片描述

9.6 位运算-基本位运算符

package com.wedu.demo;

public class Demo2 {
    /*
        位运算:

            位运算符指的是二进制位的运算,先将十进制数转成二进制后再进行运算。
            在二进制位运算中,1表示true,0表示false。

             & 位与 : 遇false则false, 遇0则0

                        00000000 00000000 00000000 00000110     // 6的二进制
                     &  00000000 00000000 00000000 00000010     // 2的二进制
                    -----------------------------------------
                        00000000 00000000 00000000 00000010     // 结果: 2

             | 位或 : 遇true则true, 遇1则1

             ^ 位异或 : 相同为false, 不同为true

             ~ 取反 : 全部取反, 0变1, 1变0  (也包括符号位)

                    00000000 00000000 00000000 00000110         // 6的二进制补码
                  ~ 11111111 11111111 11111111 11111001

                  -                                   1         // -1求反码
                   ------------------------------------
                    11111111 11111111 11111111 11111000         // 反码推原码

                    10000000 00000000 00000000 00000111         // -7
     */
    public static void main(String[] args) {
        System.out.println(6 & 2);
        System.out.println(~6);
    }
}

9.7 位运算-位移运算符

位运算概述 : 位运算符指的是二进制位的运算,先将十进制数转成二进制后再进行运算。在二进制位运算中,1表示true,0表示false。

位运算符介绍 :
在这里插入图片描述

代码 :

package com.wedu.demo;

public class Demo3 {
    /*
       位移运算符:

               << 有符号左移运算,二进制位向左移动, 左边符号位丢弃, 右边补齐0
                        运算规律: 向左移动几位, 就是乘以2的几次幂

                                12 << 2

                                (0)0000000 00000000 00000000 000011000  // 12的二进制

       -----------------------------------------------------------------------------
               >> 有符号右移运算,二进制位向右移动, 使用符号位进行补位
                        运算规律: 向右移动几位, 就是除以2的几次幂

                                000000000 00000000 00000000 0000001(1)  // 3的二进制

       -----------------------------------------------------------------------------

                >>> 无符号右移运算符,  无论符号位是0还是1,都补0

                                010000000 00000000 00000000 00000110  // -6的二进制

     */
    public static void main(String[] args) {
        System.out.println(12 << 1);  // 24
        System.out.println(12 << 2);  // 48

    }
}

package com.wedu.demo;

public class Demo4 {
    /*
        ^ 运算符的特点

                一个数, 被另外一个数, 异或两次, 该数本身不变
     */
    public static void main(String[] args) {
        System.out.println(10 ^ 5 ^ 10);
    }
}

10.基础练习

10.1 数据交换

案例需求

​ 已知两个整数变量a = 10,b = 20,使用程序实现这两个变量的数据交换
​ 最终输出a = 20,b = 10;

代码实现

package com.wedu.test;

public class Test1 {
    /*
        需求:已知两个整数变量a = 10,b = 20,使用程序实现这两个变量的数据交换
        最终输出a = 20,b = 10;


        思路:
        1. 定义一个三方变量temp,将a原本记录的值,交给temp记录 (a的值,不会丢了)
        2. 使用 a 变量记录 b 的值,(第一步交换完毕,b的值也丢不了了)
        3. 使用 b 变量记录 temp的值,也就是a原本的值 (交换完毕)
        4. 输出 a 和 b 变量即可
     */
    /*
        动态初始化格式:

            数据类型[][] 变量名 = new 数据类型[m][n];
            m表示这个二维数组,可以存放多少个一维数组
            n表示每一个一维数组,可以存放多少个元素
     */
    public static void main(String[] args) {
        int a = 10;
        int b = 20;

        // 将a原本记录的值,交给temp记录 (a的值,不会丢了)
        int temp = a;
        // 用 a 变量记录 b 的值,(第一步交换完毕,b的值也丢不了了)
        a = b;
        // 使用 b 变量记录 temp的值,也就是a原本的值 (交换完毕)
        b = temp;

        // 输出 a 和 b 变量即可
        System.out.println("a=" + a);
        System.out.println("b=" + b);
    }
}

10.2 数组反转【应用】

案例需求 :

​ 已知一个数组 arr = {19, 28, 37, 46, 50}; 用程序实现把数组中的元素值交换,

​ 交换后的数组 arr = {50, 46, 37, 28, 19}; 并在控制台输出交换后的数组元素

实现步骤 :

1. 定义两个变量, start和end来表示开始和结束的指针.          
  1. 确定交换条件, start < end 允许交换
  2. 循环中编写交换逻辑代码
  3. 每一次交换完成, 改变两个指针所指向的索引 start++, end–
  4. 循环结束后, 遍历数组并打印, 查看反转后的数组

代码实现 :

package com.wedu.test;

public class Test2 {
    /*
        需求:已知一个数组 arr = {19, 28, 37, 46, 50}; 用程序实现把数组中的元素值交换,
          交换后的数组 arr = {50, 46, 37, 28, 19}; 并在控制台输出交换后的数组元素。

        步骤:
              1. 定义两个变量, start和end来表示开始和结束的指针.
              2. 确定交换条件, start < end 允许交换
              3. 循环中编写交换逻辑代码
              4. 每一次交换完成, 改变两个指针所指向的索引 start++, end--
              5. 循环结束后, 遍历数组并打印, 查看反转后的数组
     */
    public static void main(String[] args) {
        int[] arr = {19, 28, 37, 46, 50};
        //  1. 定义两个变量, start和end来表示开始和结束的指针.
        int start = 0;
        int end = arr.length -1;
        //  2. 确定交换条件, start < end 允许交换
        // 4. 每一次交换完成, 改变两个指针所指向的索引 start++, end--
        // for(int start = 0, end = arr.length -1; start < end; start++, end--)
        for( ; start < end; start++, end--){
            // 3. 循环中编写交换逻辑代码
            int temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
        }

        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

10.3 二维数组概述

概述 : 二维数组也是一种容器,不同于一维数组,该容器存储的都是一维数组容器

10.4 二维数组动态初始化

动态初始化格式:

数据类型[][] 变量名 = new 数据类型[m][n];
m表示这个二维数组,可以存放多少个一维数组
n表示每一个一维数组,可以存放多少个元素
package com.wedu.demo;

public class Demo1Array {
    /*
        动态初始化格式:

            数据类型[][] 变量名 = new 数据类型[m][n];
            m表示这个二维数组,可以存放多少个一维数组
            n表示每一个一维数组,可以存放多少个元素
     */
    public static void main(String[] args) {
        // 数据类型[][] 变量名 = new 数据类型[m][n];
        int[][] arr = new int[3][3];
        /*
            [[I@10f87f48

            @ : 分隔符
            10f87f48 : 十六进制内存地址
            I : 数组中存储的数据类型
            [[ : 几个中括号就代表的是几维数组
         */
        System.out.println(arr);

        /*
            二维数组存储一维数组的时候, 存储的是一维数组的内存地址
         */
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);

        System.out.println(arr[0][0]);
        System.out.println(arr[1][1]);
        System.out.println(arr[2][2]);

        // 向二维数组中存储元素
        arr[0][0] = 11;
        arr[0][1] = 22;
        arr[0][2] = 33;

        arr[1][0] = 11;
        arr[1][1] = 22;
        arr[1][2] = 33;

        arr[2][0] = 11;
        arr[2][1] = 22;
        arr[2][2] = 33;

        // 从二维数组中取出元素并打印
        System.out.println(arr[0][0]);
        System.out.println(arr[0][1]);
        System.out.println(arr[0][2]);
        System.out.println(arr[1][0]);
        System.out.println(arr[1][1]);
        System.out.println(arr[1][2]);
        System.out.println(arr[2][0]);
        System.out.println(arr[2][1]);
        System.out.println(arr[2][2]);
    }
}

10.5 二维数组访问元素的细节问题

问题 : 二维数组中存储的是一维数组, 那能不能存入 [提前创建好的一维数组] 呢 ?

答 : 可以的

代码实现
package com.wedu.demo;

public class Demo2Array {
    /*
        问题: 二维数组中存储的是一维数组, 那能不能存入 [提前创建好的一维数组] 呢 ?
        答 : 可以的
     */
    public static void main(String[] args) {
        int[] arr1 = {11,22,33};
        int[] arr2 = {44,55,66};
        int[] arr3 = {77,88,99,100};

        int[][] arr = new int[3][3];

        arr[2][3] = 100;

        arr[0] = arr1;
        arr[1] = arr2;
        arr[2] = arr3;

        System.out.println(arr[1][2]);
        System.out.println(arr[2][3]);
    }
}

10.6 二维数组静态初始化

**完整格式 :** 数据类型[][] 变量名 = new 数据类型[][]{ {元素1, 元素2...} , {元素1, 元素2...} 

**简化格式 :**  数据类型[][] 变量名 = { {元素1, 元素2...} , {元素1, 元素2...} ...};

**代码实现 : **

package com.wedu.demo;

public class Demo3Array {
    /*
        完整格式:数据类型[][] 变量名 = new 数据类型[][]{ {元素1, 元素2...} , {元素1, 元素2...} ...};

        简化格式: 数据类型[][] 变量名 = { {元素1, 元素2...} , {元素1, 元素2...} ...};
     */
    public static void main(String[] args) {
        int[] arr1 = {11,22,33};
        int[] arr2 = {44,55,66};

        int[][] arr = {{11,22,33}, {44,55,66}};
        System.out.println(arr[0][2]);

        int[][] array = {arr1,arr2};
        System.out.println(array[0][2]);
    }
}

10.7 二维数组遍历

需求 :

​ 已知一个二维数组 arr = {{11, 22, 33}, {33, 44, 55}};

​ 遍历该数组,取出所有元素并打印

步骤 :

1. 遍历二维数组,取出里面每一个一维数组
2. 在遍历的过程中,对每一个一维数组继续完成遍历,获取内部存储的每一个元素

代码实现 :

package com.wedu.test;

public class Test1 {
    /*
        需求:

            已知一个二维数组 arr = {{11, 22, 33}, {33, 44, 55}};
            遍历该数组,取出所有元素并打印

        步骤:
            1. 遍历二维数组,取出里面每一个一维数组
            2. 在遍历的过程中,对每一个一维数组继续完成遍历,获取内部存储的每一个元素
     */
    public static void main(String[] args) {
        int[][] arr = {{11, 22, 33}, {33, 44, 55}};

        // 1. 遍历二维数组,取出里面每一个一维数组
        for (int i = 0; i < arr.length; i++) {
            //System.out.println(arr[i]);
            // 2. 在遍历的过程中,对每一个一维数组继续完成遍历,获取内部存储的每一个元素
            //int[] temp = arr[i];
            for (int j = 0; j < arr[i].length; j++) {
                System.out.println(arr[i][j]);
            }
        }
    }
}

10.8 二维数组求和

需求 :

某公司季度和月份统计的数据如下:单位(万元)
第一季度:22,66,44
第二季度:77,33,88
第三季度:25,45,65
第四季度:11,66,99

步骤 :

  1. 定义求和变量,准备记录最终累加结果
  2. 使用二维数组来存储数据,每个季度是一个一维数组,再将4个一维数组装起来
  3. 遍历二维数组,获取所有元素,累加求和
  4. 输出最终结果

代码实现 :

package com.wedu.test;

public class Test2 {
    /*
        需求:
            某公司季度和月份统计的数据如下:单位(万元)
            第一季度:22,66,44
            第二季度:77,33,88
            第三季度:25,45,65
            第四季度:11,66,99

        步骤:
            1. 定义求和变量,准备记录最终累加结果
            2. 使用二维数组来存储数据,每个季度是一个一维数组,再将4个一维数组装起来
            3. 遍历二维数组,获取所有元素,累加求和
            4. 输出最终结果
     */
    public static void main(String[] args) {
        // 1. 定义求和变量,准备记录最终累加结果
        int sum = 0;
        // 2. 使用二维数组来存储数据,每个季度是一个一维数组,再将4个一维数组装起来
        int[][] arr = { {22,66,44} , {77,33,88} , {25,45,65} , {11,66,99}};
        // 3. 遍历二维数组,获取所有元素,累加求和
        for (int i = 0; i < arr.length; i++) {
            for(int j = 0; j < arr[i].length; j++){
                sum += arr[i][j];
            }
        }
        // 4. 输出最终结果
        System.out.println(sum);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绯霞润凝霄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值