玄子JAVA基础笔记3

方法

方法的定义

package CH03_JAVAMethod;

import java.util.Scanner;

//方法的定义
public class XZ01_DefinitionOfMethod {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入第一个数字:");
        int x = input.nextInt();
        System.out.println("请输入第二个数字:");
        int y = input.nextInt();
//      声明变量x和y接收用户输入变量
        int result = sum(x, y);
//      调用方法获取返回值
        System.out.println("大数是:" + result);
//        输出返回值
        input.close();
    }

    public static int sum(int x, int y) {
//      修饰符     返回值类型 方法名(参数类型 参数名){
        int result = 0;
//        声明变量返回结果
        if (x == y) {
            return 0;
        }
        if (x > y) {
            result = x;
        } else {
            result = y;
        }
//        方法体
        return result;
//      return 返回值;
    }

}
  • Java方法是语句的集合:

    • 它们在一起执行一个功能。
    • 方法是解决一类问题的步骤的有序组合
    • 方法包含于类或对象中
    • 方法在程序中被创建,在其他地方被引用
  • 设计方法的原则:

    • 方法的本意是功能块,就是实现某个功能的语句块的集合。
    • 我们设计方法的时候,最好保持方法的原子性,
    • 就是一个方法只完成1个功能,这样利于我们后期的扩展。
  • 方法的定义Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:

    • 方法包含一个方法头和一个方法体。下面是一个方法的所有部分:
    • 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
    • 返回值类型:方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值,在这种情况下,returnValueType是关键字void。
    • 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
    • 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
      • 形式参数:在方法被调用时用于接收外界输入的数据。
      • 实参:调用方法时实际传给方法的数据。
    • 方法体:方法体包含具体的语句,定义该方法的功能。

方法的重载

package CH03_JAVAMethod;

//方法的重载
public class XZ02_OverloadingOfMethod {
    public static void main(String[] args) {
//      声明变量x和y接收用户输入变量
        int result = add(10, 20, 30);
        int result2 = add(10, 20);
        double result3 = add(10, 20, 30.6, 40);
//      方法名相同,根据传递参数数量,类型不同自动判断
        System.out.println("和为:" + result);
        System.out.println("和为:" + result2);
        System.out.println("和为:" + result3);
//        输出返回值
    }

    public static int add(int x, int y) {
//      修饰符     返回值类型 方法名(参数类型 参数名){
        int result = 0;
//        声明变量返回结果
        result = x + y;
//        方法体
        return result;
//      return 返回值;
    }

    public static int add(int x, int y, int z) {
//      修饰符     返回值类型 方法名(参数类型 参数名){
        int result = 0;
//        声明变量返回结果
        result = x + y + z;
//        方法体
        return result;
//      return 返回值;
    }

    public static double add(double x, double y, double z, double n) {
//      修饰符     返回值类型 方法名(参数类型 参数名){
        double result = 0;
//        声明变量返回结果
        result = x + y + z + n;
//        方法体
        return result;
//      return 返回值;
    }

}
  • 方法的重载重载就是在一个类中,有相同的函数名称,但形参不同的函数。
  • 方法的重载的规则:
    • 方法名称必须相同。
    • 参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。
    • 方法的返回类型可以相同也可以不相同。
    • 仅仅返回类型不同不足以成为方法的重载。
  • 实现理论:
    • 方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。

命令行传参

package CH03_JAVAMethod;

//传参
public class XZ03_ChuanshenOfMethod {
    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++) {
            System.out.println("args[" + i + "]: " + args[i]);
        }
    }
}

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

  1. 通过cmd窗体编译java文件传递参数

  2. 编译文件 javac XZ03_ChuanshenOfMethod.java

  3. cd…/ 回退到 src目录下

  4. 书写全路径 java CH03_JAVAMethod/XZ03_ChuanshenOfMethod

  5. 加上传递参数 java CH03_JAVAMethod.XZ03_ChuanshenOfMethod XuanZi XuanZiShaer

    !!!注释可能无法编译,导致编译失败

可变参数

package CH03_JAVAMethod;

//可变参数
public class XZ04_VariableParameterOfMethod {
    public static void main(String[] args) {
        printMax(312, 22.2, 3213, 32131);
    }

    public static void printMax(int a, 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);
    }

}
  • 可变参数:
    • JDK1.5开始,Java支持传递同类型的可变参数给一个方法。
    • 在方法声明中,在指定参数类型后加一个省略号(…)。
    • 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。

递归

package CH03_JAVAMethod;

//递归
public class XZ05_RecursionOfMethod {
    public static void main(String[] args) {
        System.out.println(f(25));
    }

    public static long f(long n) {
        if (n == 1) {
            return 1;
        } else {
            return n * f(n - 1);
        }
    }
}
  • 递归:
    • A方法调用B方法,我们很容易理解!
    • 递归就是:A方法调用A方法!就是自己调用自己调用
    • 递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
    • 递归结构包括两个部分:
      • 递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
      • 递归体:什么时候需要调用自身方法。

数组

数组的定义

package CH04_JAVAArrays;

//数组的定义
public class XZ01_DefinitionOfArray {
    public static void main(String[] args) {

        int[] nums;
//        声明数组
        nums = new int[10];
//        定义数组空间

        nums[0] = 1;
        nums[1] = 2;
        nums[2] = 3;
        nums[3] = 4;
        nums[4] = 5;
        nums[5] = 6;
        nums[6] = 7;
        nums[7] = 8;
        nums[8] = 9;
        nums[9] = 10;
//        对数组进行赋值
//        nums[10] = 11;
//        数组素引超出范围
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }
        System.out.println("和为:" + sum);

    }
}
  • 数组的定义:
    • 数组是相同类型数据的有序集合。
    • 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
    • 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。

数组状态

package CH04_JAVAArrays;

//数组状态
public class XZ02_ArrayState {
    public static void main(String[] args) {
        int[] nums = new int[10];
        nums[0] = 1;
//        动态状态
        int[] nums2 = {10, 20, 30, 40, 50};
//        静态状态
        System.out.println(nums[0]);
        System.out.println(nums[1]);
        System.out.println(nums2[0]);
    }
}
  • 数组的默认初始化:
    • 数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。

数组下标越界

package CH04_JAVAArrays;

//数组下标越界
public class XZ03_ArraySubscriptOutOfBounds {

    public static void main(String[] args) {
        int[] nums = new int[10];

        System.out.println(nums[10]);
//打印数组下标超过数组存储就会报错: 数组下标越界
    }
}
  • 数组是相同数据类型(数据类型可以为任意类型)的有序集合
  • 数组也是对象。数组元素相当于对象的成员变量
  • 数组长度的确定的,不可变的。如果越界,则报:ArraylndexOutofBounds

数组的基本特点

  • 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。其元素必须是相同类型,不允许出现混合类型。
  • 数组中的元素可以是任何数据类型,包括基本类型和引用类型。
  • 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。
  • 数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。

数组基础案例

package CH04_JAVAArrays;

//数组基础案例
public class XZ04_ArrayBasicCase {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

        System.out.println("=========遍历数组============");
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + "\t");
        }
        System.out.println();
        System.out.println("==========遍历数组============");
        for (int num : nums) {
            System.out.print(num + "\t");
        }
        System.out.println();
        System.out.println("==========计算和============");
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }
        System.out.print("和为:" + sum);
        System.out.println();
        System.out.println("==========计算最大数============");
        int max = nums[0];
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] > max) {
                max = nums[i];
            }
        }
        System.out.print("最大数为:" + max);
        System.out.println();
        System.out.println("==========反转数组============");
        for (int i = 0; i < reverse(nums).length; i++) {
            System.out.print(reverse(nums)[i] + "\t");
        }
    }

    public static int[] reverse(int[] nums) {
//        反转数组
        int[] result = new int[nums.length];
        for (int i = 0, j = result.length - 1; i < nums.length; i++, j--) {
            result[i] = nums[j];
        }
        return result;
    }

}

多维数组

package CH04_JAVAArrays;

//多维数组
public class XZ05_multidimensionalArray {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5};
        int[][] ages = {{1, 2}, {2, 3}, {3, 4}, {4, 5}};

        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + "\t");
        }
        System.out.println();
        System.out.println("==========打印多维数组======");
        for (int i = 0; i < ages.length; i++) {
            for (int j = 0; j < ages[i].length; j++) {
                System.out.print(ages[i][j] + "\t");
            }
        }
    }
}

多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。

Arrays类

package CH04_JAVAArrays;
//Arrays类

import java.util.Arrays;

public class XZ06_ArrayClass {
    public static void main(String[] args) {
        int[] nums = {2, 4, 6, 7, 5};

        Arrays.sort(nums);
        //数组排序
        System.out.println(Arrays.toString(nums));
        //打印数组
        Arrays.fill(nums, 2, 4, 0);
        //          填充数组         起始下标        填充值
        System.out.println(Arrays.toString(nums));

    }
}
  • Arrays类:
    • 数组的工具类java.util.Arrays
    • 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。
    • 查看JDK帮助文档
    • Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"不用“使用对象来调用(注意:是”不用”而不是“不能”)
    • 具有以下常用功能:
      • 给数组赋值:通过fill方法。
      • 对数组排序:通过sort方法,按升序。
      • 比较数组:通过 equals方法比较数组中元素值是否相等。
      • 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作。

冒泡排序

package CH04_JAVAArrays;

import java.util.Arrays;

//冒泡排序
public class XZ07_bubbleSort {
    public static void main(String[] args) {
//        比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置
//        每一次比较,都会产生出一个最大,或者最小的数字
//        下一轮则可以少一次排序
//        依次循环,直到结束
        int[] a = {1, 4, 5, 6, 72, 2, 2, 2, 25, 6, 7};
        int[] sort = sort(a);//调用完我们自己写的排序方法以后,返回一个排序后的数组
        System.out.println(Arrays.toString(sort));

    }

    public static int[] sort(int[] array) {
        //临时变量
        int temp = 0;
        //外层循环,判断我们这个要走多少次;
        for (int i = 0; i < array.length - 1; i++) {

            boolean flag = false;//减少没有意义的比较

            //内层循环,比价判断两个数,如果第一个数,比第二个数大,则交换位置
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j + 1] > array[j]) {
                    temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                    flag = true;
                }
            }
            if (!flag) {
                break;
            }
        }
        return array;
    }
}
  • 冒泡排序无疑是最为出名的排序算法之一,总共有八大排序!

  • 冒泡的代码还是相当简单的,两层循环,外层冒泡轮数,里层依次比较,江湖中人人尽皆知。

  • 我们看到嵌套循环,应该立马就可以得出这个算法的时间复杂度为O(n2)。

    冒泡排序口诀:

    1. 外层循环 n-1 ,控制比较轮数
    2. 内层循环 n-1-i ,控制每一轮比较次数
    3. 两两比较做交换 ,判断大小交换位置

玄子JAVA基础笔记3_第1张图片

稀疏数组

暂时不记录后续补充


你可能感兴趣的:(JAVA,java,算法,开发语言)