Java学习日记3

发布时间 2023-03-28 09:43:52作者: s1mpLe丶Han

2023.3.27学习Java打卡

Java方法

#方法是解决一类问题的步骤的有序组合
#方法包含于类或对象中
#方法在程序中被创建,在其他地方被引用

例:

public class demo1 {
    public static void main(String[] args) {
        int sum = add(1,2);
        System.out.println(sum);
    }
    
    public static int add(int a, int b){
        return a+b;
    }
}
  • 方法的定义:

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

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

    1. 若方法返回一个值:

      int num = max(30, 40);
      
    2. 若方法返回值是void:

      System.out.println("xxxxxxxx");
      

      调用一定是一条语句。

      Java都是值传递!!

  • 方法的重载:在一个类中,方法名相同,形参不同的函数。

    规则:

    • 方法名必须相同
    • 参数列表必须不同(个数,类型,参数排列顺序不同等)
    • 方法返回类型可相同可不同
    • 仅返回类型不同,不可成为方法重载
  • 命令行传参

  • 可变参数

    规则:

    • 在指定参数类型后加一个省略号(...)
    • 一个方法中只能指定一个可变参数,他必须是方法的最后一个参数,任何普通参数必须在他前面声明。

    例:

    public class Demo1 {
        public static void main(String[] args) {
            Demo1 demo1 = new Demo1();
            demo1.test(1,2,56,51,3,8);
        }
        public void test(int... i){
            System.out.println(i[0]);
            System.out.println(i[1]);
            System.out.println(i[2]);
            System.out.println(i[3]);
            System.out.println(i[4]);
            System.out.println(i[5]);
        }
    
  • 递归

小练习:写一个计算器,要求实现加减乘除功能,并且能循环接受新的数据。

以下是我的代码:

import java.util.Scanner;

public class Demo1 {
    public static void main(String[] args) {
        Demo1 demo1 = new Demo1();
        for (int i = 0; i < 1000; i++) {
            System.out.println("您需要做什么计算?加法、减法、乘法、除法。");
            System.out.println("完成请输入退出");
            Scanner scanner = new Scanner(System.in);
            String need = scanner.nextLine();
            if(need.equals("加法")){
                double x = scanner.nextDouble();
                double y = scanner.nextDouble();
                demo1.add(x, y);
            }else if (need.equals("减法")) {
                double x = scanner.nextDouble();
                double y = scanner.nextDouble();
                demo1.sub(x, y);
            }else if (need.equals("乘法")) {
                double x = scanner.nextDouble();
                double y = scanner.nextDouble();
                demo1.multi(x, y);
            }else if (need.equals("减法")) {
                double x = scanner.nextDouble();
                double y = scanner.nextDouble();
                demo1.div(x, y);
            } else if (need.equals("退出")) {
                break;
            }
        }
    }
    public void add(double a, double b){
        double sum = 0;
        sum = a + b;
        System.out.println(a + "+" + b + "=" + sum);
    }
    public void sub(double a, double b){
        double sum = 0;
        sum = a - b;
        System.out.println(a + "-" + b + "=" + sum);
    }
    public void multi(double a, double b){
        double sum = 0;
        sum = a * b;
        System.out.println(a + "*" + b + "=" + sum);
    }
    public void div(double a, double b){
        double sum = 0;
        sum = a / b;
        System.out.println(a + "/" + b + "=" + sum);
    }
}

还请各位大神亮出你们的代码,我的代码好像太啰嗦了。

数组

定义:数组是相同类型数据的集合,是按照一定次序排列相同类型的若干数据的组合。其中每一个数据被称为一个数组元素,每个数组元素可以通过一个下标来访问他们。

  • 数组声明创建

    //声明数组
    dataType[] arrayRefVar;                        //首选方法
    dataType arrayRefVar[];                        //效果相同,但并非首选
    //使用new操作符创建数组
    dataType[] arrayRefVar = new dataType[arraySize];
    //获取数组长度
    arrays.length
    

    数组特点:

    • 其长度确定,一旦被创建,大小不可改变。
    • 其元素必须是相同类型,不可混合其他类型。
    • 数组中的元素可以是任何数据类型,包括基本类型和引用类型。
    • 数组变量属于引用类型,数组也可看作为对象,数组中的每个元素相当于该对象的成员变量。数组对象本身是在堆中。

内存分析

    • 存放new的对象和数组;可被所有线程共享
    • 存放基本变量类型(包括这个基本变量的具体数值);
    • 引用对象的变量(会存放这个引用在堆里面的集体地址)
  • 方法区

    • 可以被所有的线程共享
    • 包含所有的class和static变量

三种初始化

  • 静态初始化

    int[] a = {1, 2, 3};
    Man[] mans = {new Man(1, 1), new Man(2, 2)};
    
  • 动态初始化

    int[] a = new int[2];
    a[0] = 1;
    a[1] = 2;
    
  • 数组的默认初始化

    数组是引用类型,其元素相当于类的实例变量,因此,数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。

数组边界

  • 下标的合法区间:[0, length-1]
  • 越界则报ArrayIndexOutOfBoundsException。

数组使用

  • for-each循环
  • 数组作方法入参
  • 数组作返回值

多维数组

  • 二维数组

    int a[][] = new int[2][5]
    

Arrays类

  • 可以用提供的工具类Arrays,对数据对象进行一些基本操作。
  • Arrays类中的方法都是static修饰的静态方法,可以直接使用类名调用。

冒泡排序

import java.util.Arrays;

public class MaoPaoPaiXu {
    public static void main(String[] args) {
        int[] a = {1,2,3,5,7,9,22,44,63,75};
        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; i++) {
            boolean flag = false;//通过flag标识符减少没有意义的比较
            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 == false){
                break;
            }
        }
        return array;
    }
}

稀疏数组

当数组中大部分元素为0,或为同一值时,可用稀疏数组来保存。

处理方式:

  • 记录数组一共有几行几列,有多少不同值。

  • 把具有不同值的元素和行列和值记录在小规模数组中,从而缩小程序的规模。

    例:

    public class XiShuMetrix {
        public static void main(String[] args) {
            int[][] array1 = new int[11][11];
            array1[1][2] = 1;
            array1[2][3] = 1;
            System.out.println("输出原始数组:");
    
            for (int[] ints : array1) {
                for (int anInt : ints) {
                    System.out.print(anInt+"\t");
                }
                System.out.println();
            }
            //转换为稀疏数组
            int sum = 0;
            for (int i = 0; i < 11; i++) {
                for (int j = 0; j < 11; j++) {
                    if (array1[i][j] != 0) {
                        sum++;
                    }
                }
            }
            System.out.println("有效值个数为:"+sum);
    
            //创建一个稀疏数组
            int[][] array2 = new int[sum+1][3];
    
            array2[0][0] = 11;
            array2[0][1] = 11;
            array2[0][2] = sum;
    
            //遍历二维数组,将非零的值放入稀疏数组中
            int count = 0;
            for (int i = 0; i < array1.length; i++) {
                for (int j = 0; j < array1[i].length; j++) {
                    if(array1[i][j]!=0) {
                        count++;
                        array2[count][0] = i;
                        array2[count][1] = j;
                        array2[count][2] = array1[i][j];
                    }
                }
            }
            System.out.println("稀疏数组:");
            for (int i = 0; i < array2.length; i++) {
                System.out.println(array2[i][0] + "\t"
                                 + array2[i][1] + "\t"
                                 + array2[i][2] + "\t");
            }
            //还原稀疏数组
            //读取稀疏数组
            int[][] array3 = new int[array2[0][0]][array2[0][1]];
            //给其中元素还原值
            for (int i = 1; i < array2.length; i++) {
                array3[array2[i][0]][array2[i][1]] = array2[i][2];
            }
            System.out.println("输出还原数组:");
    
            for (int[] ints : array1) {
                for (int anInt : ints) {
                    System.out.print(anInt+"\t");
                }
                System.out.println();
            }
        }
    }
    

面向对象编程

  • 本质:以类的方式组织代码,以对象的方式组织(封装)数据

  • 三大特性:

    • 封装
    • 继承
    • 多态
  • 类:是一种抽象的数据类型,是对事物整体的抽象描述,不能代表某一个具体事物。

  • 对象:是抽象概念的具体实例。

创建与初始化对象

  • 使用new关键字创建对象
  • 使用new关键字创建对象时,除了分配内存空间外,还会给已创建的对象进行默认的初始化,以及类中构造器的调用。
  • 类中的构造器也称为构造器也称为构造方法,是创建对象时必须要调用的。
    • 构造器特点:
      1. 必须和类的名字相同;
      2. 必须没有返回值,也不能写void。