LOADING

加载过慢请开启缓存 浏览器默认开启

SakuraKy的博客

Genius is an infinite capacity for taking pains.

日记,算法,vlog

day07-综合练习

java 2024/12/12

练习一:飞机票

需求:

​ 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。

​ 按照如下规则计算机票价格:旺季(5-10 月)头等舱 9 折,经济舱 8.5 折,淡季(11 月到来年 4 月)头等舱 7 折,经济舱 6.5 折。

代码示例:

package com.itheima.test;

import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) {
        /* 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。
        按照如下规则计算机票价格:旺季(5-10月)头等舱9折,经济舱8.5折,淡季(11月到来年4月)头等舱7折,经济舱6.5折。*/

        //分析:
        //1.键盘录入机票原价、月份、头等舱或经济舱
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入机票的原价");
        int ticket = sc.nextInt();
        System.out.println("请输入当前的月份");
        int month = sc.nextInt();
        System.out.println("请输入当前购买的舱位 0 头等舱 1 经济舱");
        int seat = sc.nextInt();
        //2.先判断月份是旺季还是淡季
        //ctrl + alt + M 自动抽取方法
        if (month >= 5 && month <= 10) {
            //旺季 //3.继续判断当前机票是经济舱还是头等舱
            //ticket = getPrice(ticket, seat, 0.9, 0.85);
            ticket = getTicket(ticket, seat, 0.9, 0.85);
        } else if ((month >= 1 && month <= 4) || (month >= 11 && month <= 12)) {
            //淡季
            //ticket = getPrice(ticket, seat, 0.7, 0.65);
            ticket = getTicket(ticket, seat, 0.7, 0.65);
        } else {
            //表示键盘录入的月份是一个非法数据
            System.out.println("键盘录入的月份不合法");
        }

        System.out.println(ticket);
    }

    public static int getTicket(int ticket, int seat, double v, double v2) {
        if (seat == 0) {
            //头等舱
            ticket = (int) (ticket * v);
        } else if (seat == 1) {
            //经济舱
            ticket = (int) (ticket * v2);
        } else {
            System.out.println("没有这个舱位");
        }
        return ticket;
    }

    //1.我要干嘛?根据舱位和折扣来计算最终的票价
    //2.我干这件事,需要什么才能完成?原价 舱位 头等舱的折扣 经济舱的折扣
    //3.方法的调用处是否需要继续使用这个结果  需要
    /*  public static int getPrice(int ticket, int seat, double v0, double v1) {
        if (seat == 0) {
            //头等舱
            ticket = (int) (ticket * v0);
        } else if (seat == 1) {
            //经济舱
            ticket = (int) (ticket * v1);
        } else {
            System.out.println("没有这个舱位");
        }
        return ticket;
    }*/
}

练习二:打印素数

​ 判断 101~200 之间有多少个素数,并输出所有素数。

备注:素数就是质数

代码示例:

package com.itheima.test;

public class Test2 {
    public static void main(String[] args) {
        //判断 101 ~ 200 之间有多少个素数,并打印所有素数

        //思路一: 2 ~ 99
        //定义变量i ,赋值100
        //判断i是否为质数

        //定义一个变量用来统计有多少个质数
        int count = 0;
        //外循环:遍历101~200这个范围,依次得到这个范围之内的每一个数字
        for (int i = 101; i <= 200; i++) {
            //i 依次表示循环中的每一个数字
            //继续判断i是否为一个质数
            boolean flag = true;
            //内循环:判断当前数字是否为一个质数。
            for (int j = 2; j < i; j++) {
                //j 表示2~99之间的每一个数字
                if(i % j == 0){
                    flag = false;
                    //跳出单层循环,内循环
                    break;
                }
            }
            if(flag){
                System.out.println("当前数字"+i+"是质数");
                count++;
            }
        }

        System.out.println("一共有" + count + "个质数");

        /* int i = 7;
        boolean flag = true;
        for (int j = 2; j < i; j++) {
            //j 表示2~99之间的每一个数字
            if(i % j == 0){
                flag = false;
                break;
            }
        }
        if(flag){
            System.out.println("当前数字是质数");
        }else{
            System.out.println("当前数字不是一个质数");
        }*/
    }
}

练习三:验证码

需求:

​ 定义方法实现随机产生一个 5 位的验证码

验证码格式:

​ 长度为 5

​ 前四位是大写字母或者小写字母

​ 最后一位是数字

代码示例:

package com.itheima.test;

import java.util.Random;

public class Test3 {
    public static void main(String[] args) {
        /*   需求:
            定义方法实现随机产生一个5位的验证码
            验证码格式:
            长度为5
            前四位是大写字母或者小写字母
            最后一位是数字
     */

        //方法:
        //在以后如果我们要在一堆没有什么规律的数据中随机抽取
        //可以先把这些数据放到数组当中
        //再随机抽取一个索引

        //分析:
        //1.大写字母和小写字母都放到数组当中
        char[] chs = new char[52];
        for (int i = 0; i < chs.length; i++) {
            //ASCII码表
            if(i <= 25){
                //添加小写字母
                chs[i] = (char)(97 + i);
            }else{//27
                //添加大写字母
                // A --- 65
                chs[i] = (char)(65 + i - 26);
            }
        }

        //定义一个字符串类型的变量,用来记录最终的结果
        String result = "";

        //2.随机抽取4次
        //随机抽取数组中的索引
        Random r = new Random();
        for (int i = 0; i < 4; i++) {
            int randomIndex = r.nextInt(chs.length);
            //利用随机索引,获取对应的元素
            //System.out.println(chs[randomIndex]);
            result = result + chs[randomIndex];
        }
        //System.out.println(result);
        //3.随机抽取一个数字0~9
        int number = r.nextInt(10);
        //生成最终的结果
        result = result + number;

        //打印最终结果
        System.out.println(result);

    }
}

练习四:复制数组

需求:

​ 把一个数组中的元素复制到另一个新数组中去。

代码示例:

package com.itheima.test;

public class Test4 {
    public static void main(String[] args) {
        /* 需求:
        把一个数组中的元素复制到另一个新数组中去。*/

        //分析:
        //1.定义一个老数组并存储一些元素
        int[] arr = {1,2,3,4,5};
        //2.定义一个新数组的长度跟老数组一致
        int[] newArr = new int[arr.length];
        //3.遍历老数组,得到老数组中的每一个元素,依次存入到新数组当中
        for (int i = 0; i < arr.length; i++) {
            //i 表示老数组中的索引。新数组中的每一个索引
            //arr[i]  表示老数组中的元素
            newArr[i] = arr[i];
        }

        //4.新数组中已经存满元素了
        for (int i = 0; i < newArr.length; i++) {
            System.out.println(newArr[i]);
        }

    }
}

练习五:评委打分

需求 :

​ 在唱歌比赛中,有 6 名评委给选手打分,分数范围是[0 - 100]之间的整数。选手的最后得分为:去掉最高分、最低分后的 4 个评委的平均分,请完成上述过程并计算出选手的得分。

代码示例:

package com.itheima.test;

import java.util.Scanner;

public class Test5 {
    public static void main(String[] args) {
        //在唱歌比赛中,有6名评委给选手打分,分数范围是[0 - 100]之间的整数。
        // 选手的最后得分为:去掉最高分、最低分后的4个评委的平均分,请完成上述过程并计算出选手的得分。


        //分析:
        //1.定义一个数组,用来存储6名评委的打分(0~100)
        int[] scoreArr = getScores();
        for (int i = 0; i < scoreArr.length; i++) {
            System.out.println(scoreArr[i]);
        }
        //2.求出数组中的最大值
        int max = getMax(scoreArr);
        //3.求出数组中的最小值
        int min = getMin(scoreArr);
        //4.求出数组中6个分数的总和
        int sum = getSum(scoreArr);
        //5.(总和 - 最大值 - 最小值 )/4
        int avg =  (sum - max - min)/(scoreArr.length - 2);
        //6.打印结果
        System.out.println("选手的最终得分为:" + avg);
    }


    public static int getSum(int[] scoreArr){
        int sum = 0;
        for (int i = 0; i < scoreArr.length; i++) {
            sum = sum + scoreArr[i];
        }
        return  sum;

    }



    //求数组的最大值
    public static int getMax(int[] scoreArr){
        int max = scoreArr[0];
        for (int i = 1; i < scoreArr.length; i++) {
            if(scoreArr[i] > max){
                max = scoreArr[i];
            }
        }
        return max;
    }

    //求数组的最小值
    public static int getMin(int[] scoreArr){
        int min = scoreArr[0];
        for (int i = 1; i < scoreArr.length; i++) {
            if(scoreArr[i] < min){
                min = scoreArr[i];
            }
        }
        return min;
    }



    //1.我要干嘛?定义一个数组,用来存储6名评委的打分(0~100)
    //2.我需要什么?都不需要
    //3.干完了这件事情,是否需要返回?必须返回
    public static int[] getScores(){
        //定义数组
        int[] scores = new int[6];
        //使用键盘录入的形式,输入分数:0~100
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < scores.length; ) {
            System.out.println("请输入评委的打分");
            int score = sc.nextInt();//100
            if(score >=0 && score<= 100){
                scores[i] = score;
                i++;
            }else{
                System.out.println("成绩超出了范围,继续录入,当前的i为:" + i);
            }
        }
        return  scores;
    }
}

练习六:数字加密

需求:

​ 某系统的数字密码(大于 0),比如 1983,采用加密方式进行传输。

规则如下:

​ 先得到每位数,然后每位数都加上 5 , 再对 10 求余,最后将所有数字反转,得到一串新数。

举例:

        1	9	8	3
+5		6   14  13  8
%10		6   4   3   8
反转	   8   3   4   6
加密后的结果就是:8346

代码示例:

package com.itheima.test;

public class Test6 {
    public static void main(String[] args) {
        /*
        某系统的数字密码(大于0)。比如1983,采用加密方式进行传输,
        规则如下:
            每位数加上5
            再对10求余,
            最后将所有数字反转,
            得到一串新数。
*/


        //分析:
        //1.把整数里面的每一位放到数组当中
        int[] arr = {1, 9, 8, 3};
        //2.加密
        //每位数加上5
        for (int i = 0; i < arr.length; i++) {
            arr[i] = arr[i] + 5;
        }
        //再对10求余,
        for (int i = 0; i < arr.length; i++) {
            arr[i] = arr[i] % 10;
        }
        //将所有数字反转
        for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        //8 3 4 6 --> 8346
        //3.把数组里面的每一个数字进行拼接,变成加密之后的结果
        int number = 0;
        for (int i = 0; i < arr.length; i++) {
            number = number * 10 + arr[i];
        }
        System.out.println(number);
    }
}

练习六扩展:

package com.itheima.test;

public class Test7 {
    public static void main(String[] args) {
        //需求:
        //把整数上的每一位都添加到数组当中
        //反向推导



        //1.计算出数组的长度
        int number = 12345;
        //定义一个变量临时记录number的值,就是为了第三步的时候再次使用
        int temp = number;
        //定义一个变量进行统计
        int count = 0;
        while(number != 0){
            //每一次循环就去掉右边的一个数字
            number = number / 10;
            //去掉一位计数器就自增一次。
            count++;
        }
        //2.定义数组
        //动态初始化
        int[] arr = new int[count];
        //3.把整数上的每一位都添加到数组当中
        int index = arr.length -1;
        while(temp != 0){//12345
            //获取temp里面的每一位数组
            int ge = temp % 10;
            //再去掉右边的那位数字
            temp = temp / 10;
            //把当前获取到的个位添加到数组当中
            arr[index] = ge;
            index--;
        }
        //验证结果  1  2  3  4 5
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

练习七:数字解密

把上一题加密之后的数据进行解密

代码示例:

package com.itheima.test;

public class Test8 {
    public static void main(String[] args) {
        /*某系统的数字密码(大于0)。比如1983,采用加密方式进行传输,
        规则如下:
            每位数加上5
            再对10求余,
            最后将所有数字反转,
            得到一串新数。
            按照以上规则进行解密:
            比如1983加密之后变成8346,解密之后变成1983
        */


        //1.定义数组记录解密之后的结果
        int[] arr = {8, 3, 4, 6};
        //2.反转
        for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        //3.由于加密是通过对10取余的方式进行获取的
        //所以在解密的时候就需要判断,0~4之间+10  5~9数字不变
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] >= 0 && arr[i] <= 4) {
                arr[i] = arr[i] + 10;
            }
        }
        //4.每一位减5
        for (int i = 0; i < arr.length; i++) {
            arr[i] = arr[i] - 5;
        }
        //5.获取数组里面的每一位数字拼接成最终的结果
        int number = 0;
        for (int i = 0; i < arr.length; i++) {
            number = number * 10 + arr[i];
        }
        System.out.println(number);




    }
}

练习八:抽奖

需求:

​ 一个大 V 直播抽奖,奖品是现金红包,分别有{2, 588 , 888, 1000, 10000}五个奖金。请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。打印效果如下:(随机顺序,不一定是下面的顺序)

888元的奖金被抽出
588元的奖金被抽出
10000元的奖金被抽出
1000元的奖金被抽出
2元的奖金被抽出

解法一:

package com.itheima.test;

import java.util.Random;

public class Test9 {
    public static void main(String[] args) {
        /* 需求:
        一个大V直播抽奖,奖品是现金红包,分别有{2, 588 , 888, 1000, 10000}五个奖金。
        请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。
        打印效果如下:(随机顺序,不一定是下面的顺序)
            888元的奖金被抽出
            588元的奖金被抽出
            10000元的奖金被抽出
            1000元的奖金被抽出
            2元的奖金被抽出
        */


        //分析:
        //1.定义数组表示奖池
        int[] arr = {2, 588, 888, 1000, 10000};
        //2.定义新数组用于存储抽奖的结果
        int[] newArr = new int[arr.length];
        //3.抽奖
        Random r = new Random();
        //因为有5个奖项,所以这里要循环5次
        for (int i = 0; i < 5; ) {
            //获取随机索引
            int randomIndex = r.nextInt(arr.length);
            //获取奖项
            int prize = arr[randomIndex];
            //判断当前的奖项是否存在,如果存在则重新抽取,如果不存在,就表示是有效奖项
            boolean flag = contains(newArr, prize);
            if(!flag){
                //把当前抽取到的奖项添加到newArr当中
                newArr[i] = prize;
                //添加完毕之后,移动索引
                i++;
            }
        }
        //4.遍历newArr
        for (int i = 0; i < newArr.length; i++) {
            System.out.println(newArr[i]);
        }


    }

    //判断prize在数组当中是否存在
    //存在:true
    //不存在:false
    public static boolean contains(int[] arr,int prize){
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] == prize){
                return true;
            }
        }
        return false;
    }


}

解法二:

package com.itheima.test;

import java.util.Random;

public class Test10 {
    public static void main(String[] args) {
       /* 需求:
        一个大V直播抽奖,奖品是现金红包,分别有{2, 588 , 888, 1000, 10000}五个奖金。
        请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。
        打印效果如下:(随机顺序,不一定是下面的顺序)
            888元的奖金被抽出
            588元的奖金被抽出
            10000元的奖金被抽出
            1000元的奖金被抽出
            2元的奖金被抽出
        */

        //1.把奖池里面的所有奖项打乱顺序
        int[] arr = {2, 588, 888, 1000, 10000};
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
            //获取随机索引
            int randomIndex = r.nextInt(arr.length);
            //拿着i跟随机索引randomIndex上的值进行交换
            int temp = arr[i];
            arr[i] = arr[randomIndex];
            arr[randomIndex] = temp;
        }
        //2.遍历奖池,从0索引开始获取每一个奖项
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }


    }
}

练习九:双色球

图片1

代码示例:

package com.itheima.test;

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

public class Test11 {
    public static void main(String[] args) {
        //1.生成中奖号码
        int[] arr = createNumber(); // 123456  7

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

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



        //2.用户输入彩票号码(红球 + 蓝球)//654321
        int[] userInputArr = userInputNumber();

        //3.判断用户的中奖情况
        //红球 蓝球
        int redCount = 0;
        int blueCount = 0;

        //判断红球
        for (int i = 0; i < userInputArr.length - 1; i++) {
            int redNumber = userInputArr[i];
            for (int j = 0; j < arr.length - 1; j++) {
                if(redNumber == arr[j]){
                    redCount++;
                    //如果找到了,那么后面的数字就没有必要继续比较了
                    //跳出内循环,继续判断下一个红球号码是否中奖
                    break;
                }
            }
        }

        //判断蓝球
        int blueNumber = userInputArr[userInputArr.length-1];
        if(blueNumber == arr[arr.length - 1]){
            blueCount++;
        }

        //根据红球的个数以及蓝球的个数来判断中奖情况
        if(redCount == 6 && blueCount == 1){
            System.out.println("恭喜你,中奖1000万");
        }else if(redCount == 6 && blueCount == 0){
            System.out.println("恭喜你,中奖500万");
        }else if(redCount == 5 && blueCount == 1){
            System.out.println("恭喜你,中奖3000");
        }else if((redCount == 5 && blueCount == 0) ||  (redCount == 4 && blueCount == 1)){
            System.out.println("恭喜你,中奖200");
        }else if((redCount == 4 && blueCount == 0) ||  (redCount == 3 && blueCount == 1)){
            System.out.println("恭喜你,中奖10");
        }else if((redCount == 2 && blueCount == 1) ||  (redCount == 1 && blueCount == 1)|| (redCount == 0 && blueCount == 1)){
            System.out.println("恭喜你,中奖5");
        }else{
            System.out.println("谢谢参与,谢谢惠顾");
        }

    }

    public static int[] userInputNumber() {
        //1.创建数组用于添加用户购买的彩票号码
        //6个红球 1个蓝球 数组长度:7
        int[] arr = new int[7];

        //2.利用键盘录入让用输入
        Scanner sc = new Scanner(System.in);
        //让用户输入红球号码
        for (int i = 0; i < 6; ) {
            System.out.println("请输入第" + (i + 1) + "个红球号码");
            int redNumber = sc.nextInt();
            //redNumber  在1~33  唯一不重复
            if (redNumber >= 1 && redNumber <= 33) {
                boolean flag = contains(arr, redNumber);
                if (!flag) {
                    //不存在
                    //有效的,可以添加到数组当中
                    arr[i] = redNumber;
                    i++;
                } else {
                    //存在
                    System.out.println("当前红球号码已经存在,请重新输入");
                }
            } else {
                System.out.println("当前红球号码超出范围");
            }
        }

        //让用户输入篮球号码
        System.out.println("请输入篮球号码");
        //1~16
        while (true) {
            int blueNumber = sc.nextInt();
            if (blueNumber >= 1 && blueNumber <= 16) {
                arr[arr.length - 1] = blueNumber;
                break;
            } else {
                System.out.println("当前篮球号码超出范围");
            }
        }
        return arr;

    }


    public static int[] createNumber() {
        //1.创建数组用于添加中奖号码
        //6个红球 1个蓝球 数组长度:7
        int[] arr = new int[7];

        //2.随机生成号码并添加到数组当中
        //红球:不能重复的  1 2 3 4 5 6
        //蓝球:可以跟红球号码重复 5

        //生成红球号码并添加到数组当中
        Random r = new Random();
        for (int i = 0; i < 6; ) {
            //获取红球号码
            int redNumber = r.nextInt(33) + 1;
            boolean flag = contains(arr, redNumber);
            if (!flag) {
                //把红球号码添加到数组当中
                arr[i] = redNumber;
                i++;
            }
        }

        //生成蓝球号码并添加到数组当中
        int blueNumber = r.nextInt(16) + 1;
        arr[arr.length - 1] = blueNumber;
        return arr;
    }

    //用于判断数组在数组中是否存在
    public static boolean contains(int[] arr, int number) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == number) {
                return true;
            }
        }
        return false;
    }
}

本篇文章代码由黑马程序员提供

阅读全文

day06-方法

java 2024/12/12

1. 方法概述

1.1 方法的概念

​ 方法(method)是程序中最小的执行单元

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

2. 方法的定义和调用

2.1 无参数方法定义和调用

  • 定义格式:

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

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

    方法名();
    
  • 范例:

    method();
    
  • 注意:

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

2.3 无参数方法的练习

  • 需求:设计一个方法用于打印两个数中的较大数
  • 思路:
    • ① 定义一个方法,用于打印两个数字中的较大数,例如 getMax()
    • ② 方法中定义两个变量,用于保存两个数字
    • ③ 使用分支语句分两种情况对两个数字的大小关系进行处理
    • ④ 在 main()方法中调用定义好的方法
  • 代码:
public class MethodTest {
    public static void main(String[] args) {
        //在main()方法中调用定义好的方法
        getMax();
    }

    //定义一个方法,用于打印两个数字中的较大数,例如getMax()
    public static void getMax() {
        //方法中定义两个变量,用于保存两个数字
        int a = 10;
        int b = 20;

        //使用分支语句分两种情况对两个数字的大小关系进行处理
        if(a > b) {
            System.out.println(a);
        } else {
            System.out.println(b);
        }
    }
}

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 带参数方法练习

  • 需求:设计一个方法用于打印两个数中的较大数,数据来自于方法参数 }
  • 思路:
    • ① 定义一个方法,用于打印两个数字中的较大数,例如 getMax()
    • ② 为方法定义两个参数,用于接收两个数字
    • ③ 使用分支语句分两种情况对两个数字的大小关系进行处理
    • ④ 在 main()方法中调用定义好的方法(使用常量)
    • ⑤ 在 main()方法中调用定义好的方法(使用变量)
  • 代码:
public class MethodTest {
    public static void main(String[] args) {
        //在main()方法中调用定义好的方法(使用常量)
        getMax(10,20);
        //调用方法的时候,人家要几个,你就给几个,人家要什么类型的,你就给什么类型的
        //getMax(30);
        //getMax(10.0,20.0);

        //在main()方法中调用定义好的方法(使用变量)
        int a = 10;
        int b = 20;
        getMax(a, b);
    }

    //定义一个方法,用于打印两个数字中的较大数,例如getMax()
    //为方法定义两个参数,用于接收两个数字
    public static void getMax(int a, int b) {
        //使用分支语句分两种情况对两个数字的大小关系进行处理
        if(a > b) {
            System.out.println(a);
        } else {
            System.out.println(b);
        }
    }
}

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

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

  • 思路:

    • ① 定义一个方法,用于获取两个数字中的较大数
    • ② 使用分支语句分两种情况对两个数字的大小关系进行处理
    • ③ 根据题设分别设置两种情况下对应的返回结果
    • ④ 在 main()方法中调用定义好的方法并使用变量保存
    • ⑤ 在 main()方法中调用定义好的方法并直接打印结果
  • 代码:

    public class MethodTest {
        public static void main(String[] args) {
            //在main()方法中调用定义好的方法并使用变量保存
            int result = getMax(10,20);
            System.out.println(result);
    
            //在main()方法中调用定义好的方法并直接打印结果
            System.out.println(getMax(10,20));
        }
    
        //定义一个方法,用于获取两个数字中的较大数
        public static int getMax(int a, int b) {
            //使用分支语句分两种情况对两个数字的大小关系进行处理
            //根据题设分别设置两种情况下对应的返回结果
            if(a > b) {
                return a;
            } else {
                return b;
            }
        }
    }
    

4.3 带返回值方法练习 2

需求:

​ 定义一个方法,求一家商场每个季度的营业额。根据方法结果再计算出全年营业额。

代码示例:

package com.itheima.demo;

public class MethodDemo9 {
    public static void main(String[] args) {
        /*需求:定义一个方法,求一家商场每个季度的营业额。
        根据方法结果再计算出全年营业额。*/
        int sum1 = getSum(10, 20, 30);
        int sum2 = getSum(10, 20, 30);
        int sum3 = getSum(10, 20, 30);
        int sum4 = getSum(10, 20, 30);

        int sum = sum1 + sum2 + sum3 + sum4;
        System.out.println(sum);

    }

    //心得:
    //1.我要干嘛?  决定了方法体   每个季度的营业额
    //2.我干这件事情,需要什么才能完成? 决定了形参 需要三个月的营业额 a b c
    //3.我干完这件事情,看调用处是否需要使用方法的结果。   决定了返回值
    //如果需要使用,那么必须返回
    //如果不需要使用,可以返回也可以不返回
    public static int getSum(int month1,int month2,int month3){
        int sum = month1 + month2 + month3;
        //因为方法的调用处,需要继续使用这个结果
        //所以我们必须要把sum返回
        return sum;
    }
}

4.4 带返回值方法练习 3

需求:

​ 键盘录入两个圆的半径(整数),比较两个圆的面积。

代码示例:

import java.util.Scanner;

public class MethodDemo10 {
    public static void main(String[] args) {
        //需求:键盘录入两个圆的半径(整数),比较两个圆的面积。
        //键盘录入圆的半径
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入圆的半径");
        int radii1 = sc.nextInt();

        System.out.println("请输入第二个圆的半径");
        int radii2 = sc.nextInt();
        double area1 = getArea(radii1);
        double area2 = getArea(radii2);
        if(area1 > area2){
            System.out.println("第一个圆更大");
        }else{
            System.out.println("第二个圆更大");
        }
    }

    //心得:
    //1.我要干嘛?   求圆的面积
    //2.我干这件事情,需要什么才能完成?        半径
    //3.方法的调用处,是否需要继续使用方法的结果    要比较
    public static double getArea(int radii) {
        double area = 3.14 * radii * radii;
        return area;
    }
}

5. 方法的注意事项

5.1 方法的注意事项

  • 方法不能嵌套定义

    • 示例代码:

      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语句后面不能跟数据或代码
          }
      }
      

5.2 方法的通用格式

  • 格式:

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

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

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

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

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

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

      方法体 完成功能的代码块

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

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

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

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

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.3 数组遍历

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

  • 思路:

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

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

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

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

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

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

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

    • ⑤ 调用遍历方法

  • 代码:

    public class Test1 {
        public static void main(String[] args) {
          /*  //先打印数据,再进行换行
            System.out.println("aaa");
            //只打印不换行
            System.out.print("bbb");
            System.out.print("ddd");
            //不打印任何内容,只换行
            System.out.println();
            System.out.print("cc");*/
            //设计一个方法用于数组遍历,要求遍历的结果是在一行上的。例如:[11, 22, 33, 44, 55]
            int[] arr = {1,2,3,4,5};
            printArr(arr);
        }
        //1.我要遍历数组
        //2.需要什么?  数组
        //3.调用处是否需要使用方法的结果。
        public static void printArr(int[] arr){
            System.out.print("[");
            for (int i = 0; i < arr.length; i++) {
                if(i == arr.length - 1){
                    System.out.println(arr[i] + "]");
                }else{
                    System.out.print(arr[i] + ", ");
                }
            }
        }
    }
    

7.4 数组最大值

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

  • 思路:

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

    public class MethodTest02 {
        public static void main(String[] args) {
            //定义一个数组,用静态初始化完成数组元素初始化
            int[] arr = {12, 45, 98, 73, 60};
    
            //调用获取最大值方法,用变量接收返回结果
            int number = getMax(arr);
    
            //把结果输出在控制台
            System.out.println("number:" + number);
        }
    
        //定义一个方法,用来获取数组中的最大值
        /*
            两个明确:
                返回值类型:int
                参数:int[] arr
         */
        public static int getMax(int[] arr) {
            int max = arr[0];
    
            for(int x=1; x<arr.length; x++) {
                if(arr[x] > max) {
                    max = arr[x];
                }
            }
            return max;
        }
    }
    

7.6 获取索引

需求:

​ 定义一个方法获取数字,在数组中的索引位置,将结果返回给调用处,如果有重复的,只要获取第一个即可。

代码示例:

package com.itheima.demo;

public class Test4 {
    public static void main(String[] args) {
        //定义一个方法获取数字,在数组中的索引位置,将结果返回给调用处
        //如果有重复的,只要获取第一个即可

        int[] arr = {1,2,3,4,5};
        int index = contains(arr, 3);
        System.out.println(index);
    }

    //1. 我要干嘛?判断数组中的某一个数是否存在
    //2. 需要什么?数组 数字
    //3. 调用处是否需要继续使用?返回
    //获取number在arr中的位置
    public static int contains(int[] arr, int number) {
        //遍历arr得到每一个元素
        for (int i = 0; i < arr.length; i++) {
            //拿着每一个元素跟number比较
            if(arr[i] == number){
                //如果相等,表示找到了
                return i;
            }
        }
        //当循环结束之后,如果还不能返回索引,表示数组中不存在该数据
        //可以返回-1
        return -1;
    }
}

本篇文章代码由黑马程序员提供

阅读全文

day05-循环高级

java 2024/12/12

1.无限循环

概念:

​ 又叫死循环。循环一直停不下来。

for 格式:

for(;;){
    System.out.println("循环执行一直在打印内容");
}

解释:

初始化语句可以空着不写,表示循环之前不定义任何的控制变量。

条件判断语句可以空着不写,如果不写,默认表示 true,循环一直进行。

条件控制语句可以空着不写,表示每次循环体执行完毕后,控制变量不做任何变化。

while 格式:

while(true){
    System.out.println("循环执行一直在打印内容");
}

解释:

​ 小括号里面就不能省略了,true 一定要写出来,否则代码会报错。

do…while 格式:

do{
    System.out.println("循环执行一直在打印内容");
}while(true);

解释:

​ 小括号里面就不能省略了,true 一定要写出来,否则代码会报错。

无限循环的注意事项:

  • 最为常用的格式:while
  • 无限循环下面不能再写其他代码了,因为永远执行不到。

2.条件控制语句

  • break
  • continue

break:

​ 不能单独存在的。可以用在 switch 和循环中,表示结束,跳出的意思。

代码示例:

//1.吃1~5号包子
for (int i = 1; i <= 5; i++) {
    System.out.println("在吃第" + i + "个包子");
    //2.吃完第三个的时候就不吃了
    if(i == 3){
        break;//结束整个循环。
    }
}

continue:

​ 不能单独存在的。只能存在于循环当中。

​ 表示:跳过本次循环,继续执行下次循环。

代码示例:

//1.吃1~5号包子
for (int i = 1; i <= 5; i++) {
    //2.第3个包子有虫子就跳过,继续吃下面的包子
    if(i == 3){
        //跳过本次循环(本次循环中,下面的代码就不执行了),继续执行下次循环。
        continue;
    }
    System.out.println("在吃第" + i + "个包子");
}

3. Random

Random 跟 Scanner 一样,也是 Java 提前写好的类,我们不需要关心是如何实现的,只要直接使用就可以了。

使用步骤:

  1. 导包
import java.util.Random;
导包的动作必须出现在类定义的上边。
  1. 创建对象
Random r = new Random ();
上面这个格式里面,只有r是变量名,可以变,其他的都不允许变。
  1. 生成随机数
int number = r.nextInt(随机数的范围);
上面这个格式里面,只有number是变量名,可以变,其他的都不允许变。
随机数范围的特点:从0开始,不包含指定值。比如:参数为10,生成的范围[0,10)

代码示例:

//1.导包
import java.util.Random;

public class RandomDemo1 {
    public static void main(String[] args) {
        //2.创建对象
        Random r = new Random();
        //3.生成随机数
        int number = r.nextInt(100);//包左不包右,包头不包尾
        //0 ~ 99
        System.out.println(number);

    }
}

4. 逢七过

需求:

​ 朋友聚会的时候可能会玩一个游戏:逢 7 过

​ 游戏规则:从任意一个数字开始报数,当你要报的数字是包含 7 或者是 7 的倍数时都要说过:过

​ 使用程序在控制台打印出 1-100 之间的满足逢七必过规则的数据

举例:

​ 1 2 3 4 5 6 过 8 9 10 11 12 13 过 15 16 过 18 …

代码示例:

/*朋友聚会的时候可能会玩一个游戏:逢7过
        游戏规则:从任意一个数字开始报数,当你要报的数字是包含7或者是7的倍数时都要说过:过
        需求:使用程序在控制台打印出1-100之间的满足逢七必过规则的数据*/
//分析:
//个位7  十位7   7倍数
//1 2 3 4 5 6 过 8 9 10 11 12 13 过 15 16 过 18 19 20 过....
//69 过 过 过 过 过 过... 80
//1.得到1~100之间的每一个数字
//开始:1
//结束:100
for (int i = 1; i <= 100; i++) {
    //2.判断每一个数字,如果符合规则,就打印过,如果不符合规则就打印真实的数字
    if(i % 10 == 7 || i / 10 % 10 == 7  ||  i % 7 == 0){
        System.out.println("过");
        continue;
    }
    System.out.println(i);
}

5. 平方根

需求:

​ 键盘录入一个大于等于 2 的整数 x ,计算并返回 x 的 平方根 。结果只保留整数部分 ,小数部分将被舍去 。

代码示例:

/*需求:键盘录入一个大于等于2的整数 x ,计算并返回 x 的 平方根 。
        结果只保留整数部分 ,小数部分将被舍去 。*/


//分析:
//平方根   16的平方根4
//         4的平方根2


// 10
// 1 * 1 = 1 < 10
// 2 * 2 = 4 < 10
// 3 * 3 = 9 < 10
// 4 * 4 = 16 > 10
//推断:10的平方根是在3~4之间。


// 20
// 1 * 1 = 1 < 20
// 2 * 2 = 4 < 20
// 3 * 3 = 9 < 20
// 4 * 4 = 16 < 20
// 5 * 5 = 25 > 20
//推断:20的平方根是在4~5之间。


//在代码当中
//从1开始循环,拿着数字的平方跟原来的数字进行比较
//如果小于的,那么继续往后判断
//如果相等,那么当前数字就是平方根
//如果大于的,那么前一个数字就是平方跟的整数部分


//1.键盘录入一个整数
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数");
int number = sc.nextInt();
//2.从1开始循环判断
//开始:1 结束: number
for (int i = 1; i <= number; i++) {
    //用i * i 再跟number进行比较
    if(i * i == number){
        System.out.println(i + "就是" + number + "的平方根");
        //一旦找到了,循环就可以停止了,后面的数字就不需要再找了,提高代码的运行效率。
        break;
    }else if(i * i > number){
        System.out.println((i - 1) + "就是" + number + "平方根的整数部分");
        break;
    }
}

6.判断是否为质数

需求:

​ 键盘录入一个正整数 x ,判断该整数是否为一个质数。

代码示例:

//需求:键盘录入一个正整数 x ,判断该整数是否为一个质数。

//质数:
//如果一个整数只能被1和本身整除,那么这个数就是质数。否则这个数叫做合数
//7 = 1 * 7 质数
//8 = 1 * 8  2 * 4 合数


//分析:
//1.键盘录入一个正整数
//number
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个正整数");
int number = sc.nextInt();//9

//定义一个变量,表示标记
//标记着number是否为一个质数
//true: 是一个质数
//false : 不是一个质数

//表示最初就认为number是一个质数
boolean flag = true;


//2.判断
//写一个循环,从2开始判断,一直判断到number-1为止
//看这个范围之内,有没有数字可以被number整除
for (int i = 2; i < number; i++) {
    //i 依次表示这个范围之内的每一个数字
    //看number是否能被i整除就可以了
    if(number % i == 0){// 9 % 2 = 1
        flag = false;
        //System.out.println(number + "不是一个质数");
        break;
    }/*else{
                System.out.println(number + "是一个质数");
            }*/
}

//只有当这个循环结束了,表示这个范围之内所有的数字都判断完毕了
//此时才能断定number是一个质数
if(flag){
    System.out.println(number + "是一个质数");
}else{
    System.out.println(number + "不是一个质数");
}

7. 猜数字小游戏

需求:

​ 程序自动生成一个 1-100 之间的随机数,在代码中使用键盘录入去猜出这个数字是多少?

要求:

​ 使用循环猜,一直猜中为止。

思路分析:

  1. 生成一个 1-100 之间的随机数
  2. 使用键盘录入去猜出这个数字是多少
  3. 把反复猜的代码写在循环中

代码示例:

//1.生成一个1-100之间的随机数
Random r = new Random();
int number = r.nextInt(100) + 1;// 0 ~ 99 + 1 --- 1 ~ 100
System.out.println(number);

//2.使用键盘录入去猜出这个数字是多少?
Scanner sc = new Scanner(System.in);
while(true){
    System.out.println("请输入一个整数");
    int guessNumber = sc.nextInt();
    //3.比较
    if(guessNumber > number){
        System.out.println("您猜的数字大了");
    }else if(guessNumber < number){
        System.out.println("您猜的数字小了");
    }else{
        System.out.println("恭喜你,猜中了");
        break;
    }
}

本篇文章代码由黑马程序员提供

阅读全文

day05-数组

java 2024/12/12

1.数组

概念:

​ 指的是一种容器,可以同来存储同种数据类型的多个值。

​ 但是数组容器在存储数据的时候,需要结合隐式转换考虑。

比如:

​ 定义了一个 int 类型的数组。那么 boolean。double 类型的数据是不能存到这个数组中的,

​ 但是 byte 类型,short 类型,int 类型的数据是可以存到这个数组里面的。

建议:

​ 容器的类,和存储的数据类型保持一致。

举例:

​ 整数 1 2 3 4 56 就可以使用 int 类型的数组来存储。

​ 小数 1.1 1.2 1.3 1.4 就可以使用 double 类型的数组来存储。

​ 字符串”aaa” “bbb” “ccc” 就可以使用 String 类型的数组来存储。

2.数组的定义

格式一:

​ 数据类型 [] 数组名

比如:int [] array

格式二:

​ 数据类型 数组名 []

比如: int array []

详解:

数据类型:限定了数组以后能存什么类型的数据。

方括号:表示现在定义的是一个数组。

数组名:就是一个名字而已,方便以后使用。

注意点:

​ 方法括号跟数组名,谁写在前面,谁写在后面都是一样的。

​ 平时习惯性使用第一种方式。

3.数组的静态初始化

完整格式:

​ 数据类型[] 数组名 = new 数据类型[]{元素 1,元素 2,元素 3,元素 4…};

比如:

​ int[] arr = new int[]{11,22,33};

​ double[] arr = new double[]{1.1,1.2,1.3};

格式详解:

​ 数据类型:限定了数组以后能存什么类型的数据。

​ 方括号:表示现在定义的是一个数组。

​ 数组名:其实就是名字而已,方便以后使用,在起名字的时候遵循小驼峰命名法。

​ arr namesArr

​ new:就是给数组在内存中开辟了一个空间。

​ 数据类型:限定了数组以后能存什么类型的数据。

​ 前面和后面的数据类型一定要保持一致。

​ int[] arr = new double[]{11,22,33};//错误写法

​ 方括号:表示现在定义的是一个数组。

​ 大括号:表示数组里面的元素。元素也就是存入到数组中的数据。

​ 多个元素之间,一定要用逗号隔开。

注意点:

  • 等号前后的数据类型必须保持一致。
  • 数组一旦创建之后,长度不能发生变化。

简化格式:

​ 数据类型[] 数组名 = {元素 1,元素 2,元素 3,元素 4…};

比如:

​ int[] array = {1,2,3,4,5};

​ double[] array = {1.1,1.2,1.3};

练习 1:

定义数组存储 5 个学生的年龄。

1.给数组限定什么类型? int
2.利用静态初始化完成创建并添加元素
int[] agesArr = new int[]{18,19,20,21,22};
int[] agesArr = {18,19,20,21,22};

练习 2:

定义数组存储 3 个学生的姓名。

1.给数组限定什么类型? String
2.利用静态初始化完成创建并添加元素
String[] namesArr = new String[]{"zhangsan","lisi","wangwu"};
String[] namesArr = {"zhangsan","lisi","wangwu"};

练习 3:

定义数组存储 4 个学生的身高。

1.给数组限定什么类型? double
2.利用静态初始化完成创建并添加元素
double[] heightsArr = new double[]{1.85,1.82,1.78,1.65};
double[] heightsArr = {1.85,1.82,1.78,1.65};

4.地址值

int[] arr = {1,2,3,4,5};
System.out.println(arr);//[I@6d03e736

double[] arr2 = {1.1,2.2,3.3};
System.out.println(arr2);//[D@568db2f2

打印数组的时候,实际出现的是数组的地址值。

数组的地址值:就表示数组在内存中的位置。

以[I@6d03e736 为例:

[ :表示现在打印的是一个数组。

I:表示现在打印的数组是 int 类型的。

@:仅仅是一个间隔符号而已。

6d03e736:就是数组在内存中真正的地址值。(十六进制的)

但是,我们习惯性会把[I@6d03e736 这个整体称之为数组的地址值。

地址值对于我们来京,作用不大,简单了解。

5.数组元素访问

格式:

​ 数组名[索引];

作用:

  • 获取数组中对应索引上的值

  • 修改数组中对应索引上的值

    一旦修改之后,原来的值就会被覆盖了。

代码示例:

public class ArrDemo2 {
    /*

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

         作用:
            1.获取指定索引上对应的元素
            2.修改指定索引上对应的元素


    */
    public static void main(String[] args) {
       int[] arr = {1,2,3,4,5};
       //需求1:获取arr数组中,3索引上的值
        int number = arr[3];
        System.out.println(number);
        System.out.println(arr[3]);

       //需求2:将arr数组中,3索引上的值修改为10
            arr[3] = 10;
        System.out.println("修改之后为:" + arr[3]);

    }
}

6.索引

​ 也叫角标、下标

​ 就是数组容器中每一个小格子对应的编号。

索引的特点:

  • 索引一定是从 0 开始的。
  • 连续不间断。
  • 逐个+1 增长。

7.数组的遍历

遍历:就是把数组里面所有的内容一个一个全部取出来。

数组的长度:数组名.length;

通用代码:

for(int i = 0; i < arr.length; i++){
    //在循环的过程中,i依次表示数组中的每一个索引
    sout(arr[i]);//就可以把数组里面的每一个元素都获取出来,并打印在控制台上了。
}

8.数组的动态初始化

格式:

​ 数据类型[] 数组名 = new 数据类型[数组的长度];

举例:

//1.定义一个数组,存3个人的年龄,年龄未知
int[] agesArr = new int[3];


//2.定义一个数组,存班级10名学生的考试成绩,考试成绩暂时未知,考完才知道。
int[] scoresArr = new int[10];

数组的默认初始化值:

整数类型:0

小数类型:0.0

布尔类型:false

字符类型:’\u0000’

引用类型:null

9.数组两种初始化方式的区别

静态初始化:int[] arr = {1,2,3,4,5};

动态初始化:int[] arr = new int[3];

静态初始化:手动指定数组的元素,系统会根据元素的个数,计算出数组的长度。

动态初始化:手动指定数组长度,由系统给出默认初始化值。

使用场景:

只明确元素个数,但是不明确具体的数据,推荐使用动态初始化。

已经明确了要操作的所有数据,推荐使用静态初始化。

举例:

  • 使用数组来存储键盘录入的 5 个整数。

    int[] arr = new int[5];

  • 将全班的学生成绩存入数组中,已知学生成绩为:66,77,88,99,100

    int[] arr = new int[5];

    arr[0] = 66;

    arr[1] = 77;

    … 虽然可以实现,但是太麻烦了。

    建议使用静态初始化:int[] arr = {66,77,88,99,100};

10.数组常见问题

当访问了数组中不存在的索引,就会引发索引越界异常。

避免:

​ 针对于任意一个数组,索引的范围:
最小索引:0
最大索引:数组的长度 - 1
数组名.length - 1

public class ArrDemo6 {
    public static void main(String[] args) {
       int[] arr = {1,2,3,4,5,5,5,5,5};
        //用索引来访问数组中的元素
        System.out.println(arr[1]);
        System.out.println(arr[10]);//ArrayIndexOutOfBoundsException

    }
}

11.数组的练习

练习 1:求和

需求:定义一个数组,存储 1,2,3,4,5

遍历数组得到每一个元素,求数组里面所有的数据和

代码示例:

/*定义一个数组,存储1,2,3,4,5
        遍历数组得到每一个元素,求数组里面所有的数据和*/


//分析:
//1.定义一个数组,并添加数据1,2,3,4,5
int[] arr = {1,2,3,4,5};

//求和变量
int sum = 0;
//2.遍历数组得到每一个数据,累加求和
for (int i = 0; i < arr.length; i++) {
    //i 依次表示数组里面的每一个索引
    //arr[i] 依次表示数组里面的每一个元素
    sum = sum + arr[i];
}

//当循环结束之后,sum的值就是累加之后的结果
System.out.println(sum);

练习 2:统计个数

需求:定义一个数组,存储 1,2,3,4,5,6,7,8,9,10

遍历数组得到每一个元素,统计数组里面一共有多少个能被 3 整除的数字

代码示例:

//分析:
//1.定义一个数组 存储1,2,3,4,5,6,7,8,9,10
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//定义一个变量,用来统计次数
int count = 0;
//2.遍历数组得到每一个元素
for (int i = 0; i < arr.length; i++) {
    //i 表示数组里面的每一个索引
    //arr[i] 表示数组里面的每一个元素
    //3.判断当前的元素是否为3的倍数,如果是那么统计变量就需要自增一次。
    if(arr[i] % 3 == 0){
        // System.out.println(arr[i]);
        count++;
    }
}
//当循环结束之后,就表示数组里面所有的数字都判断完毕了,直接打印count即可
System.out.println("数组中能被3整除的数字有" + count + "个");

练习 3:变化数据

需求:

定义一个数组,存储 1,2,3,4,5,6,7,8,9,10

遍历数组得到每一个元素。

要求:

1,如果是奇数,则将当前数字扩大两倍

2,如果是偶数,则将当前数字变成二分之一

代码示例:

//分析:
//1.定义一个数组,存1,2,3,4,5,6,7,8,9,10
int[] arr = {1,2,3,4,5,6,7,8,9,10};
//2.遍历数组得到每一个元素
for (int i = 0; i < arr.length; i++) {
    //i 依次表示数组里面的每一个索引
    //arr[i] 依次表示数组里面的每一个元素
    //3.对每一个元素进行判断
    if(arr[i] % 2 == 0){
        //偶数 变成二分之一
        arr[i] = arr[i] / 2;
    }else{
        //奇数 扩大两倍
        arr[i] = arr[i] * 2;
    }
}

//遍历数组
//一个循环尽量只做一件事情。
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}

练习 4:求最值

需求:求数组中的最大值

代码示例:

//定义数组求最大值:33,5,22,44,55

//扩展问题:
//1.根据求最大值的思路,自己改写一下求最小智
//2.为什么max要记录为arr[0],默认值不能为0吗?
//不能写0
//max的初始化值一定要是数组中的值。
//3.循环中开始条件一定是0吗?
//循环的开始条件如果为0,那么第一次循环的时候是自己跟自己比了一下,对结果没有任何影响,但是效率偏低
//为了提高效率,减少一次循环的次数,循环开始条件可以写1.


//1.定义数组用来存储5个值
int[] arr = {33,5,22,44,55};
//2.定义一个变量max用来存储最大值
//临时认为0索引的数据是最大的
int max = arr[0];
//3.循环获取数组中的每一个元素
//拿着每一个元素跟max进行比较
for (int i = 1; i < arr.length; i++) {
    //i 索引  arr[i] 元素
    if(arr[i] > max){
        max = arr[i];
    }
}
//4.当循环结束之后,max记录的就是数组中的最大值
System.out.println(max);//55

练习 5:统计个数

需求:生成 10 个 1~100 之间的随机数存入数组。

1)求出所有数据的和

2)求所有数据的平均数

3)统计有多少个数据比平均值小

代码示例:

//分析:
//1.定义数组
int[] arr = new int[10];
//2.把随机数存入到数组当中
Random r = new Random();

for (int i = 0; i < arr.length; i++) {
    //每循环一次,就会生成一个新的随机数
    int number = r.nextInt(100) + 1;
    //把生成的随机数添加的数组当中
    //数组名[索引] = 数据;
    arr[i] = number;
}


// 1)求出所有数据的和
//定义求和变量
int sum = 0;
for (int i = 0; i < arr.length; i++) {
    //循环得到每一个元素
    //并把元素累加到sum当中
    sum = sum + arr[i];
}
System.out.println("数组中所有数据的和为:" + sum);


//2)求所有数据的平均数
int avg = sum / arr.length;
System.out.println("数组中平均数为:" + avg);



//3)统计有多少个数据比平均值小
int count = 0;
for (int i = 0; i < arr.length; i++) {
    if(arr[i] < avg){
        count++;
    }
}

//当循环结束之后,就表示我已经找到了所有的比平均数小的数据
System.out.println("在数组中,一共有" + count + "个数据,比平均数小");



//遍历数组,验证答案
for (int i = 0; i < arr.length; i++) {
    System.out.print(arr[i] + " ");
}

练习 6:交换数据

需求:定义一个数组,存入 1,2,3,4,5。按照要求交换索引对应的元素。

交换前:1,2,3,4,5

交换后:5,2,3,4,1

代码示例:

//1.定义数组存储数据
int[] arr = {1,2,3,4,5};
//2.利用循环去交换数据
for(int i = 0,j = arr.length - 1; i < j; i++,j--){
    //交换变量i和变量j指向的元素
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
//当循环结束之后,那么数组中的数据就实现了头尾交换
for (int i = 0; i < arr.length; i++) {
    System.out.print(arr[i] + " ");
}

练习 7:打乱数据

需求:定义一个数组,存入 1~5。要求打乱数组中所有数据的顺序。

代码示例:

//1.定义数组存储1~5
int[] arr = {1, 2, 3, 4, 5};
//2.循环遍历数组,从0索引开始打乱数据的顺序
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
    //生成一个随机索引
    int randomIndex = r.nextInt(arr.length);
    //拿着随机索引指向的元素 跟 i 指向的元素进行交换
    int temp = arr[i];
    arr[i] = arr[randomIndex];
    arr[randomIndex] = temp;
}
//当循环结束之后,那么数组中所有的数据已经打乱顺序了
for (int i = 0; i < arr.length; i++) {
    System.out.print(arr[i] + " ");
}

本篇文章代码由黑马程序员提供

阅读全文

day04-流程控制语句

java 2024/12/12

第一章 流程控制语句

在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。所以,我们必须清楚每条语句的执行流程。而且,很多时候要通过控制语句的执行顺序来实现我们想要的功能。

1.1 流程控制语句分类

​ 顺序结构

​ 判断和选择结构(if, switch)

​ 循环结构(for, while, do…while)

1.2 顺序结构

顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。

顺序结构执行流程图:

1545615769372

第二章 判断语句:if 语句

2.1 if 语句格式 1

格式:
if (关系表达式) {
    语句体;
}

执行流程:

① 首先计算关系表达式的值

② 如果关系表达式的值为 true 就执行语句体

③ 如果关系表达式的值为 false 就不执行语句体

④ 继续执行后面的语句内容

1545616039363

示例:

public class IfDemo {
    public static void main(String[] args) {
        System.out.println("开始");
        //定义两个变量
        int a = 10;
        int b = 20;
        //需求:判断a和b的值是否相等,如果相等,就在控制台输出:a等于b
        if(a == b) {
            System.out.println("a等于b");
        }
        //需求:判断a和c的值是否相等,如果相等,就在控制台输出:a等于c
        int c = 10;
        if(a == c) {
            System.out.println("a等于c");
        }
        System.out.println("结束");
    }
}

练习 1:老丈人选女婿

需求:

​ 键盘录入女婿的酒量,如果大于 2 斤,老丈人给出回应,否则没有任何回应

代码示例:

//分析:
//1.键盘录入女婿的酒量
Scanner sc = new Scanner(System.in);
System.out.println("请输入女婿的酒量");
int wine = sc.nextInt();//5
//2.对酒量进行一个判断即可
if(wine > 2) {
    System.out.println("不错哟,小伙子!");
}

练习 2:考试奖励

需求:

​ 键盘录入一个整数,表示小明的考试名次,如果名次为 1,小红可以当小明的女朋有了。

代码示例:

//分析:
//1.键盘录入一个整数,表示小明的考试名次
Scanner sc = new Scanner(System.in);
System.out.println("请输入小明的名次");
int rank = sc.nextInt();
//2.对小明的考试成绩进行判断即可
if(rank == 1){
    System.out.println("小红成为了小明的女朋友");
}

第一种格式的细节:

  1. 如果我们要对一个布尔类型的变量进行判断,不要写==,直接把变量写在小括号中即可。

  2. 如果大括号中的语句体只有一条,那么大括号可以省略不写

    如果大括号省略了,那么 if 只能控制距离他最近的那一条语句。

    建议:自己不要去写,如果别人这么写了,你要能看懂即可。

2.2 if 语句格式 2

格式:
if (关系表达式) {
    语句体1;
} else {
    语句体2;
}

执行流程:

① 首先计算关系表达式的值

② 如果关系表达式的值为 true 就执行语句体 1

③ 如果关系表达式的值为 false 就执行语句体 2

④ 继续执行后面的语句内容

1545616221283

示例:

public class IfDemo02 {
    public static void main(String[] args) {
        System.out.println("开始");
        //定义两个变量
        int a = 10;
        int b = 20;
        //需求:判断a是否大于b,如果是,在控制台输出:a的值大于b,否则,在控制台输出:a的值不大于b
        if(a > b) {
            System.out.println("a的值大于b");
        } else {
            System.out.println("a的值不大于b");
        }
        System.out.println("结束");
    }
}

练习 1:吃饭

需求:

​ 键盘录入一个整数,表示身上的钱。

​ 如果大于等于 100 块,就是网红餐厅。

​ 否则,就吃经济实惠的沙县小吃。

代码示例:

//分析:
//1.键盘录入一个整数。表示身上的钱。
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数表示身上的钱");
int money = sc.nextInt();
//2.对钱进行判断
if(money >= 100){
    System.out.println("吃网红餐厅");
}else{
    System.out.println("福建大酒店");
}

练习 2:影院选座

需求:

​ 在实际开发中,电影院选座也会使用到 if 判断。

​ 假设某影院售卖了 100 张票,票的序号为 1~100。

​ 其中奇数票号坐左侧,偶数票号坐右侧。

​ 键盘录入一个整数表示电影票的票号。

​ 根据不同情况,给出不同的提示:

​ 如果票号为奇数,那么打印坐左边。

​ 如果票号为偶数,那么打印坐右边。

代码示例:

//分析:
//1.键盘录入票号
Scanner sc = new Scanner(System.in);
System.out.println("请输入票号");
int ticket = sc.nextInt();
if(ticket >= 1 && ticket <= 100){
    //合法
    //2.对票号进行判断
    if (ticket % 2 == 0) {
        //偶数
        System.out.println("坐右边");
    } else {
        //奇数
        System.out.println("坐左边");
    }
}else{
    //票号不合法
    System.out.println("票号不合法");
}

2.3 if 语句格式 3

格式:
if (关系表达式1) {
    语句体1;
} else if (关系表达式2) {
    语句体2;
}
…
else {
    语句体n+1;
}

执行流程:

① 首先计算关系表达式 1 的值

② 如果值为 true 就执行语句体 1;如果值为 false 就计算关系表达式 2 的值

③ 如果值为 true 就执行语句体 2;如果值为 false 就计算关系表达式 3 的值

④…

⑤ 如果没有任何关系表达式为 true,就执行语句体 n+1。

1545616667104

练习 1:考试奖励

需求:

​ 小明快要期末考试了,小明爸爸对他说,会根据他不同的考试成绩,送他不同的礼物,

假如你可以控制小明的得分,请用程序实现小明到底该获得什么样的礼物,并在控制台输出。

分析:

​ ① 小明的考试成绩未知,可以使用键盘录入的方式获取值

​ ② 由于奖励种类较多,属于多种判断,采用 if…else…if 格式实现

​ ③ 为每种判断设置对应的条件

​ ④ 为每种判断设置对应的奖励

代码示例:

//95~100 自行车一辆
//90~94   游乐场玩一天
//80 ~ 89 变形金刚一个
//80 以下  胖揍一顿

//1.键盘录入一个值表示小明的分数
Scanner sc = new Scanner(System.in);
System.out.println("请输入小明的成绩");
int score = sc.nextInt();
//2.对分数的有效性进行判断
if(score >= 0 && score <= 100){
    //有效的分数
    //3.对小明的分数进行判断,不同情况执行不同的代码
    if(score >= 95 && score <= 100){
        System.out.println("送自行车一辆");
    }else if(score >= 90 && score <= 94){
        System.out.println("游乐场玩一天");
    }else if(score >= 80 && score <= 89){
        System.out.println("变形金刚一个");
    }else{
        System.out.println("胖揍一顿");
    }
}else{
    //无效的分数
    System.out.println("分数不合法");
}

第三章 switch 语句

3.1 格式

switch (表达式) {
    case 1:
        语句体1;
        break;
    case 2:
        语句体2;
        break;
    ...
    default:
        语句体n+1;
        break;
}

3.2 执行流程:

  • 首先计算出表达式的值
  • 其次,和 case 依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到 break 就会结 束。
  • 最后,如果所有的 case 都和表达式的值不匹配,就会执行 default 语句体部分,然后程序结束掉。

练习:运动计划

  • 需求:键盘录入星期数,显示今天的减肥活动。

    周一:跑步

    周二:游泳

    周三:慢走

    周四:动感单车

    周五:拳击

    周六:爬山

    周日:好好吃一顿

  • 代码示例:

package a01switch选择语句;

import java.util.Scanner;

public class SwitchDemo2 {
    public static void main(String[] args) {
        //1.键盘录入一个整数表示星期
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个整数表示星期");
        int week = sc.nextInt();

        //2.书写一个switch语句去跟week进行匹配
        switch (week){
            case 1:
                System.out.println("跑步");
                break;
            case 2:
                System.out.println("游泳");
                break;
            case 3:
                System.out.println("慢走");
                break;
            case 4:
                System.out.println("动感单车");
                break;
            case 5:
                System.out.println("拳击");
                break;
            case 6:
                System.out.println("爬山");
                break;
            case 7:
                System.out.println("好好吃一顿");
                break;
            default:
                System.out.println("输入错误,没有这个星期");
                break;
        }
    }
}

3.3 switch 的扩展知识:

  • default 的位置和省略情况

    default 可以放在任意位置,也可以省略

  • case 穿透

    不写 break 会引发 case 穿透现象

  • switch 在 JDK12 的新特性

int number = 10;
switch (number) {
    case 1 -> System.out.println("一");
    case 2 -> System.out.println("二");
    case 3 -> System.out.println("三");
    default -> System.out.println("其他");
}
  • switch 和 if 第三种格式各自的使用场景

当我们需要对一个范围进行判断的时候,用 if 的第三种格式

当我们把有限个数据列举出来,选择其中一个执行的时候,用 switch 语句

比如:

​ 小明的考试成绩,如果用 switch,那么需要写 100 个 case,太麻烦了,所以用 if 简单。

​ 如果是星期,月份,客服电话中 0~9 的功能选择就可以用 switch

练习:休息日和工作日

需求:键盘录入星期数,输出工作日、休息日。

(1-5) 工作日,(6-7)休息日。

代码示例:

//分析:
//1.键盘录入星期数
Scanner sc = new Scanner(System.in);
System.out.println("请输入星期");
int week = sc.nextInt();//3
//2.利用switch进行匹配
----------------------------------------------------
利用case穿透简化代码
switch (week){
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        System.out.println("工作日");
        break;
    case 6:
    case 7:
        System.out.println("休息日");
        break;
    default:
        System.out.println("没有这个星期");
        break;
}
----------------------------------------------------
利用JDK12简化代码书写
switch (week) {
    case 1, 2, 3, 4, 5 -> System.out.println("工作日");
    case 6, 7 -> System.out.println("休息日");
    default -> System.out.println("没有这个星期");
}

第四章 循环结构

4.1 for 循环结构(掌握)

​ 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复 执行这个循环体时,需要在合适的时候把循环判断条件修改为 false,从而结束循环,否则循环将一直执行下去,形 成死循环。

4.1.1 for 循环格式:

for (初始化语句;条件判断语句;条件控制语句) {
    循环体语句;
}

格式解释:

  • 初始化语句: 用于表示循环开启时的起始状态,简单说就是循环开始的时候什么样
  • 条件判断语句:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行下去
  • 循环体语句: 用于表示循环反复执行的内容,简单说就是循环反复执行的事情
  • 条件控制语句:用于表示循环执行中每次变化的内容,简单说就是控制循环是否能执行下去

执行流程:

① 执行初始化语句

② 执行条件判断语句,看其结果是 true 还是 false

​ 如果是 false,循环结束

​ 如果是 true,继续执行

③ 执行循环体语句

④ 执行条件控制语句

⑤ 回到 ② 继续

for 循环书写技巧:

  • 确定循环的开始条件
  • 确定循环的结束条件
  • 确定循环要重复执行的代码

代码示例:

//1.确定循环的开始条件
//2.确定循环的结束条件
//3.确定要重复执行的代码

//需求:打印5次HelloWorld
//开始条件:1
//结束条件:5
//重复代码:打印语句

for (int i = 1; i <= 5; i++) {
    System.out.println("HelloWorld");
}
for 循环练习-输出数据
  • 需求:在控制台输出 1-5 和 5-1 的数据
  • 示例代码:
public class ForTest01 {
    public static void main(String[] args) {
        //需求:输出数据1-5
        for(int i=1; i<=5; i++) {
            System.out.println(i);
        }
        System.out.println("--------");
        //需求:输出数据5-1
        for(int i=5; i>=1; i--) {
            System.out.println(i);
        }
    }
}
for 循环练习-求和
  • 需求:求 1-5 之间的数据和,并把求和结果在控制台输出
  • 示例代码:
public class ForTest02 {
    public static void main(String[] args) {
        //求和的最终结果必须保存起来,需要定义一个变量,用于保存求和的结果,初始值为0
        int sum = 0;
        //从1开始到5结束的数据,使用循环结构完成
        for(int i=1; i<=5; i++) {
            //将反复进行的事情写入循环结构内部
             // 此处反复进行的事情是将数据 i 加到用于保存最终求和的变量 sum 中
            sum = sum + i;
            /*
                sum += i;	sum = sum + i;
                第一次:sum = sum + i = 0 + 1 = 1;
                第二次:sum = sum + i = 1 + 2 = 3;
                第三次:sum = sum + i = 3 + 3 = 6;
                第四次:sum = sum + i = 6 + 4 = 10;
                第五次:sum = sum + i = 10 + 5 = 15;
            */
        }
        //当循环执行完毕时,将最终数据打印出来
        System.out.println("1-5之间的数据和是:" + sum);
    }
}
  • 本题要点:
    • 今后遇到的需求中,如果带有求和二字,请立即联想到求和变量
    • 求和变量的定义位置,必须在循环外部,如果在循环内部则计算出的数据将是错误的
for 循环练习-求偶数和
  • 需求:求 1-100 之间的偶数和,并把求和结果在控制台输出 }
  • 示例代码:
public class ForTest03 {
    public static void main(String[] args) {
        //求和的最终结果必须保存起来,需要定义一个变量,用于保存求和的结果,初始值为0
        int sum = 0;
        //对1-100的数据求和与1-5的数据求和几乎完全一样,仅仅是结束条件不同
        for(int i=1; i<=100; i++) {
            //对1-100的偶数求和,需要对求和操作添加限制条件,判断是否是偶数
            if(i%2 == 0) {
                //sum += i;
                sum = sum + i;
            }
        }
        //当循环执行完毕时,将最终数据打印出来
        System.out.println("1-100之间的偶数和是:" + sum);
    }
}
for 循环练习-统计次数

需求:

​ 键盘录入两个数字,表示一个范围。

​ 统计这个范围中。

​ 既能被 3 整除,又能被 5 整除数字有多少个?

代码示例:


4.2 while 循环

4.2.1 格式:

初始化语句;
while(条件判断语句){
    循环体;
    条件控制语句;
}
练习 1:打印 5 次 HelloWorld
int i = 1;
while(i <= 5){
    System.out.println("HelloWorld");
    i++;
}
System.out.println(i);
练习 2:珠穆朗玛峰
//1.定义一个变量表示珠穆朗玛峰的高度
int height = 8844430;
//2.定义一个变量表示纸张的厚度
double paper = 0.1;

//定义一个计数器(变量),用来统计折叠的次数
int count = 0;

//3.循环折叠纸张
//只有纸张的厚度 < 穆朗玛峰的高度 循环才继续,否则循环就停止
//坑:只有判断为真,循环才会继续
while(paper < height){
    //折叠纸张
    paper = paper * 2;
    count++;
}

//4.打印一下纸张的厚度
System.out.println(count);//27

4.3 do…while 循环

本知识点了解即可

格式:

初始化语句;
do{
    循环体;
    条件控制语句;
}while(条件判断语句);

特点:

​ 先执行,再判断。

4.4 三种格式的区别:

​ for 和 while 循环,是先判断,再执行。

​ do…while 是先执行,再判断。

​ 当知道循环次数或者循环范围的时候,用 for 循环。

​ 当不知道循环次数,也不知道循环范围,但是知道循环的结束条件时,用 while 循环。

本篇文章代码由黑马程序员提供

阅读全文

day03-运算符

java 2024/12/12

1.运算符和表达式

运算符:

​ 就是对常量或者变量进行操作的符号。

​ 比如: + - * /

表达式:

​ 用运算符把常量或者变量连接起来的,符合 Java 语法的式子就是表达式。

​ 比如:a + b 这个整体就是表达式。

​ 而其中+是算术运算符的一种,所以这个表达式也称之为算术表达式。

2.算术运算符

分类:

+ - * / %

运算特点:

+ - * :跟小学数学中一模一样没有任何区别.
/:
1.整数相除结果只能得到整除,如果结果想要是小数,必须要有小数参数。
2.小数直接参与运算,得到的结果有可能是不精确的。
案例:
System.out.println( 10 / 3);//3
System.out.println(10.0 / 3);//3.3333333333333335
%:取模、取余。
   他做的也是除法运算,只不过获取的是余数而已。
案例:
System.out.println(10 % 2);//0
System.out.println(10 % 3);//1
应用场景:
//可以利用取模来判断一个数是奇数还是偶数
System.out.println(15 % 2);//1  奇数

练习:数值拆分

需求:键盘录入一个三位数,将其拆分为个位、十位、百位后,打印在控制台

代码示例:

//1.键盘录入一个三位数
//导包 --- 创建对象 --- 接收数据
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个三位数");
int number = sc.nextInt();//123

//2.获取这个三位数的个位、十位、百位并打印出来
//公式:
//针对于任意的一个数而言
//个位: 数字 % 10
int ones = number % 10;
//十位: 数字 / 10 % 10
int tens = number / 10 % 10;
//百位: 数字 / 100 % 10
int hundreds = number / 100  % 10;

//输出结果
System.out.println(ones);
System.out.println(tens);
System.out.println(hundreds);

公式:

​ 获取任意一个数上每一位数。

个位:数字 % 10

十位:数字 / 10 % 10

百位:数字 / 100 % 10

千位:数字 / 1000 % 10

。。。以此类推。。。

3.隐式转换

概念:

​ 也叫自动类型提升。

​ 就是把一个取值范围小的数据或者变量,赋值给另一个取值范围大的变量。此时不需要我们额外写代码单独实现,是程序自动帮我们完成的。

简单记忆:

​ 就是小的给大的,可以直接给。

两种提升规则:

  • 取值范围小的,和取值范围大的进行运算,小的会先提升为大的,再进行运算。
  • byte、short、char 三种类型的数据在运算的时候,都会直接先提升为 int,然后再进行运算。

取值范围从小到大的关系:

​ byte short int long float double

4.隐式转换的练习

请看下面案例是否有误,如果有问题,请说出原因,如果没有问题,请说出运算过程和运算结果

案例一:

double d = 10;
System.out.println(d);//10.0

解释:

​ 10 是整数,整数默认是 int 类型的。

​ 而在取值范围的顺序中:byte short int long float double

​ 在赋值的时候把一个 int 类型的赋值给了一个 double 类型的。把一个小的赋值给一个大的是可以直接给的。

案例二:

byte b = 100;
int i = b;//可以成功赋值

解释:

​ 因为 byte 的取值范围是小的,int 的取值范围是大的,在底层进行了隐式转换,不需要我们额外写代码单独实现,是可以直接赋值。

案例三:

int i = 10;
long n = 20L;
??? result = i + n;
问变量result是什么类型的?

解释:

​ 变量 i 是 int 类型的,变量 n 是 long 类型的。

​ 而在取值范围的顺序中:byte short int long float double

​ 变量 i 里面的值会自动提升为 long 类型的,最终的结果其实就是两个 long 相加,那么最终的 result 是 long 类型的。

案例四:

int i = 10;
long n = 100L;
double d = 20.0;
??? result = i + n + d;
问变量result是什么类型的?

解释:

​ 变量 i 是 int 类型,变量 n 是 long 类型,变量 d 是 double 类型。

​ 而在取值范围的顺序中:byte short int long float double

​ 所以变量 i 和变量 n 里面的值在参与运算的时候,都会进行类型提升,变成 double。

​ 最终其实就是三个 double 进行相加,那么最终的结果就是 double 类型的。

案例五:

byte b1 = 10;
byte b2 = 20;
??? result = b1 + b2;//int
问变量result是什么类型的?

解释:

​ 因为 b1 和 b2 都是 byte 类型的。所以在参与计算的时候,变量 b1 和变量 b2 里面的值都会自动提升为 int 类型的。最终其实就是两个 int 类型的相加,最终结果也是 int 类型的。

案例六:

byte b = 10;
short s = 20;
long n = 100L;
??? result = b + s + n;
问变量result是什么类型的?long

解释:

​ 变量 b 是 byte 类型的,变量 s 是 short 类型的,变量 n 是 long 类型的。

​ byte,short,char 类型的变量在参与运算的时候,变量里面的值会直接先提升为 int。

第一步:变量 b 和变量 s 里面的值会先提升为 int 参与运算。

​ int + int + long

第二步:而 long 类型的取值范围是大于 int 的取值范围的。

​ 所以变量 b 和变量 s 里面的值会再次提升为 long。

​ long + long + long。

所以最终结果是 long 类型的。

5.强制转换

概念:

​ 如果要把一个取值范围大的数据或者变量赋值给另一个取值范围小的变量。是不允许直接操作。

​ 如果一定要这么干,就需要加入强制转换。

书写格式:

​ 目标数据类型 变量名 = (目标数据类型)被强转的数据;

简单理解:

​ 要转成什么类型的,那么就在小括号中写什么类型就可以了。

案例:

public class OperatorDemo2 {
    public static void main(String[] args) {
        double a = 12.3;
        int b = (int) a;
        System.out.println(b);//12
    }
}

注意点:

​ 强制转换有可能会导致数据发生错误。(数据的精度丢失)

6.字符串的+操作

核心技巧:

  • 当+操作中出现字符串时,此时就是字符串的连接符,会将前后的数据进行拼接,并产生一个新的字符串。
  • 当连续进行+操作时,从左到右逐个执行的。

7.字符串相加的练习:

案例 1:

1 + "abc" + 1

结果:”1abc1”

解释:

​ 第一步: 1 + “abc”。在这个过程中,有字符串参与的,所以做的是拼接操作,产生一个新的字符串”1abc”

​ 第二步: “1abc” + 1。这个过程中,有字符串参与的,所以做的也是拼接操作,产生一个新的字符串”1abc1”

案例 2:

1 + 2 + "abc" + 2 + 1

结果:“3abc21”

解释:

​ 第一步:1 + 2 。在这个过程中,没有字符串参与的,所以做的是加法运算,结果为 3。

​ 第二步:3 + “abc”。在这个过程中,有字符串参与的,所以做的是拼接操作,产生一个新的字符串”3abc”。

​ 第三步:”3abc” + 2。在这个过程中,有字符串参与的,所以做的是拼接操作,产生一个新的字符串”3abc2”。

​ 第四步:”3abc2” + 1。在这个过程中,有字符串参与的,所以做的是拼接操作,产生一个新的字符串“3abc21”

案例 3:

String name = "黑默丁格";
System.out.println("我的名字是" + name);

结果: 我的名字是黑默丁格

解释:当字符串跟变量相加的时候,实际上是跟变量里面的值进行拼接。

8.字符的+操作

规则:

​ 当+操作中出现了字符,会拿着字符到计算机内置的 ASCII 码表中去查对应的数字,然后再进行计算。

案例:

char c = 'a';
int result = c + 0;
System.out.println(result);//97

ASCII 码表中:

​ ‘a’ —– 97

​ ‘A’ —– 65

9.算术运算符的总结

分类:

+ - * / %  这些操作跟小学数学几乎是一模一样的。

注意点:

  • / 和 % 的区别:他们两个都是做除法运算,/取结果的商。% 取结果的余数。
  • 整数操作只能得到整数,如果想要得到小数,必须有浮点数参与运算。

算术运算符的高级用法:

是以+为例进行的讲解,其余减法,乘法,除法的运算规则也是一样的。

特例:字符串只有+操作,没有其他操作。

10.自增自减运算符

分类:

++  自增运算符
--  自减运算符

++:就是把变量里面的值+1

–:就是把变量里面的值-1

使用方式:

  • 放在变量的前面,我们叫做先++。 比如:++a
  • 放在变量的后面,我们叫做后++。 比如:a++

注意点:

​ 不管是先++,还是后++。单独写在一行的时候,运算结果是一模一样的。

案例:

//++
int a = 10;
a++;//就是让变量a里面的值 + 1
System.out.println(a);//11
++a;//就是让变量a里面的值 + 1
System.out.println(a);//12

自增自减运算符的应用场景:

某些情况下,变量需要进行加 1 或者减 1 的时候使用。

比如:过生日多一岁,就用到了自增运算符。

比如:购物商场中,选择商品数量,也用到了自增或者自减运算符。

比如:统计很多数据中,有多少个数据满足要求,也用到了自增运算符。

11.赋值运算符

最为常用的: =

运算过程:就是把等号右边的结果赋值给左边的变量

案例:

public class OperatorDemo6 {
    public static void main(String[] args) {
        //1.最为简单的赋值运算符用法
        int a = 10;//就是把10赋值给变量a
        System.out.println(a);

        //2.如果等号右边需要进行计算。
        int b = 20;
        int c = a + b;//先计算等号右边的,把计算的结果赋值给左边的变量
        System.out.println(c);

        //3.特殊的用法
        a = a + 10;//先计算等号右边的,把计算的结果赋值给左边的变量
        System.out.println(a);//20
    }
}

12.扩展赋值运算符

分类:

​ +=、-=、*=、/=、%=

运算规则:

​ 就是把左边跟右边进行运算,把最终的结果赋值给左边,对右边没有任何影响。

案例:

public class OperatorDemo7 {
    public static void main(String[] args) {
        //扩展赋值运算符
        int a = 10;
        int b = 20;
        a += b;//把左边和右边相加,再把最终的结果赋值给左边,对右边没有任何影响
        // 相当于 a = a + b;
        System.out.println(a);//30
        System.out.println(b);//20
    }
}

注意点:

​ 扩展的赋值运算符中隐层还包含了一个强制转换。

以+=为例。

a += b ;实际上相当于 a = (byte)(a + b);

public class OperatorDemo8 {
    public static void main(String[] args) {
        byte a = 10;
        byte b = 20;
        //a += b;
        a = (byte)(a + b);
        System.out.println(a);//30
    }
}

13.关系运算符

又叫比较运算符,其实就是拿着左边跟右边进行了判断而已。

分类:

符号 解释
== 就是判断左边跟右边是否相等,如果成立就是 true,如果不成立就是 false
!= 就是判断左边跟右边是否不相等,如果成立就是 true,如果不成立就是 false
> 就是判断左边是否大于右边,如果成立就是 true,如果不成立就是 false
>= 就是判断左边是否大于等于右边,如果成立就是 true,如果不成立就是 false
< 就是判断左边是否小于右边,如果成立就是 true,如果不成立就是 false
<= 就是判断左边是否小于等于右边,如果成立就是 true,如果不成立就是 false

注意点:

  • 关系运算符最终的结果一定是布尔类型的。要么是 true,要么是 false
  • 在写==的时候,千万不要写成=

14.逻辑运算符

& 和 | 的使用:

&:逻辑与(而且)

​ 两边都为真,结果才是真,只要有一个为假,那么结果就是假。

|:逻辑或(或者)

​ 两边都为假,结果才是假,只要有一个为真,那么结果就是真。

代码示例:

// &  //两边都是真,结果才是真。
System.out.println(true & true);//true
System.out.println(false & false);//false
System.out.println(true & false);//false
System.out.println(false & true);//false

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

// | 或  //两边都是假,结果才是假,如果有一个为真,那么结果就是真。
System.out.println(true | true);//true
System.out.println(false | false);//false
System.out.println(true | false);//true
System.out.println(false | true);//true

使用场景:

​ 根据固定的场景,来选择使用&还是使用|

  • 用户登录。

    用户名输入正确 & 密码输入正确

    因为只有用户名和密码同时都正确了,那么才能成功登录,只要有一个失败了都不行。

    使用技巧:

    ​ 当我们需要同时满足左边和右边两种情况时,可以使用且

  • 丈母娘选女婿

    丈母娘:女婿啊,你要么买个房子,要么买辆车。就可以把我的小棉袄穿走了。

    买个房子 | 买辆车

    两个条件中,只要满足其中一个,就可以穿走小棉袄了。

    使用技巧:

    ​ 当两种条件只要满足其中一个的时候,可以使用或

^(异或)的使用:

​ 在以后用的不多,了解一下即可。

计算规则:如果两边相同,结果为 false,如果两边不同,结果为 true

代码示例:

//^   //左右不相同,结果才是true,左右相同结果就是false
System.out.println(true ^ true);//false
System.out.println(false ^ false);//false
System.out.println(true ^ false);//true
System.out.println(false ^ true);//true

!(取反)的使用:

​ 是取反,也叫做非。

计算规则:false 取反就是 true,true 取反就是 false

温馨提示:取反最多只用一个。

代码示例:

System.out.println(!false);//true
System.out.println(!true);//false

System.out.println(!!false);//注意点:取反最多只用一个。

15.短路逻辑运算符

分类: && ||

&&:

​ 运算结果跟&是一模一样的,只不过具有短路效果。

||:

​ 运算结果跟|是一模一样的。只不过具有短路效果。

逻辑核心:

​ 当左边不能确定整个表达式的结果,右边才会执行。

​ 当左边能确定整个表达式的结果,那么右边就不会执行了。从而提高了代码的运行效率。

举例:

  • 用户登录案例

    用户名正确 & 密码正确

    如果使用一个&,不管用户名是否正确都会去验证密码。

思考:

​ 如果用户名输入正确了,那么我们再判断密码是否正确,是符合业务逻辑的。

​ 但是如果用户名输入错误了,那么现在还有必要去比较密码吗?没有不要了。

​ 如果使用一个&,那么左边和右边不管什么情况下,都会执行。

​ 用户名正确 && 密码正确

​ 如果用户名输入正确了,那么才会验证密码是否输入正确。

​ 如果用户名输入错误了,那么就不会再去验证密码是否正确,最终的结果直接为 false。从而提高了程序运行的效率。

  • 丈母娘选女婿

    有房 | 有车

    首先先看看有没有房,发现有,然后再去看看有没有车。

思考:

​ 既然都有房子,干嘛还要去看车呢?多此一举。

​ 有房 || 有车

​ 首先先看看有没有房,如果有,那么右边就不执行了。最终的结果直接为 true。

​ 如果没有房子,才会去看右边有没有车。

总结:

​ && 和 & 、||和|的运行结果都是一模一样的。

​ 但是短路逻辑运算符可以提高程序的运行效率。

建议:

​ 最为常用: && || !

16.三元运算符

又叫做:三元表达式或者问号冒号表达式。

格式:

​ 关系表达式 ? 表达式 1 :表达式 2 ;

计算规则:

  • 计算关系表达式的值。
  • 如果关系表达式的值为真,那么执行表达式 1。
  • 如果关系表达式的值为假,那么执行表达式 2。

注意点:

​ 三元运算符的最终结果一定要被使用,要么赋值给一个变量,要么直接打印出来。

案例:

public class OperatorDemo12 {
    public static void main(String[] args) {
        //需求:求两个数的较大值
        int a = 10;
        int b = 20;

        //格式:关系表达式 ? 表达式1 : 表达式2 ;
        //注意点:
        //三元运算符的最终结果一定要被使用。
        //要么赋值给一个变量,要么直接输出。
       int max =  a > b ? a : b ;
        System.out.println(max);


        System.out.println(a > b ? a : b);
    }
}

17.练习 1-两只老虎

需求:

​ 动物园里有两只老虎,两只老虎的体重分别为通过键盘录入获得,

​ 请用程序实现判断两只老虎的体重是否相同。

代码示例:

//1.获取两只老虎的体重
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一只老虎的体重");
int weight1 = sc.nextInt();
System.out.println("请输入第二只老虎的体重");
int weight2 = sc.nextInt();

//2.利用三元运算符求出最终结果
String result = weight1 == weight2 ? "相同" : "不相同";
System.out.println(result);

18.练习 2-求三个数的最大值

需求:

​ 一座寺庙里住着三个和尚,已知他们的身高分别为 150cm、210cm、165cm。

​ 请用程序实现获取这三个和尚的最高身高。

代码示例:

//1.定义三个变量记录和尚的身高
int height1 = 150;
int height2 = 210;
int height3 = 165;

//2.利用三元运算符求出两个数中的较大值。
int temp = height1 > height2 ? height1 : height2;

//3.求出最终的结果
int max = temp > height3 ? temp : height3;

System.out.println(max);

19.运算符的优先级

在 Java 中涉及了很多的运算符,每一种运算符都有各自的优先级。但是这些优先级不需要记忆。

咱们只要知道其中一点:

​ 小括号优先于所有。

本篇文章代码由黑马程序员提供

阅读全文

day02-Java基础语法

java 2024/12/12

day02 - Java 基础语法

1. 注释

​ 注释是对代码的解释和说明文字。

Java 中的注释分为三种:

  • 单行注释:
// 这是单行注释文字
  • 多行注释:
/*
这是多行注释文字
这是多行注释文字
这是多行注释文字
*/
注意:多行注释不能嵌套使用。
  • 文档注释(暂时用不到):
/**
这是多行注释文字
这是多行注释文字
这是多行注释文字
*/

使用的技巧

​ 如果我们要对代码进行解释,那么就可以使用注释。

​ 当注释的内容比较少,一行就写完了,可以用单行注释。

​ 如果注释的内容比较多,需要写在多行,那么可以使用多行注释。

注意点

​ 注释的内容不会参与编译和运行的,仅仅是对代码的解释说明而已。

​ 所以,不管在注释当中写什么内容,都不会影响代码运行的结果。

2. 关键字

2.1 概念

​ 被 Java 赋予了特定含义的英文单词。

​ 当我们在代码中写了关键字之后,程序在运行的时候,就知道要做什么事情了。

注意:关键字很多,不用刻意去记。

abstract assert boolean break byte
case catch char class const
continue default do double else
enum extends final finally float
for goto if implements import
instanceof int interface long native
new package private protected public
return strictfp short static super
switch synchronized this throw throws
transient try void volatile while

2.2 第一个关键字 class

​ 表示定义一个类。创建一个类。

类:Java 项目最基本的组成单元,一个完整的 Java 项目有可能会有成千上万个类来组成的。

class 后面跟随的就是这个类的名字,简称:类名。

在类名后面会有一对大括号,表示这个类的内容。

举例:

public class HelloWorld{


}

解释:class 表示定义类。

​ 类名:HelloWorld

​ HelloWorld 后面的大括号表示这个类的范围。

3. 字面量

作用:告诉程序员,数据在程序中的书写格式。

字面量类型 说明 程序中的写法
整数 不带小数的数字 666,-88
小数 带小数的数字 13.14,-5.21
字符 必须使用单引号,有且仅能一个字符 ‘A’,‘0’, ‘我’
字符串 必须使用双引号,内容可有可无 “HelloWorld”,“黑马程序员”
布尔值 布尔值,表示真假,只有两个值:true,false true 、false
空值 一个特殊的值,空值 值是:null
public class Demo {
    public static void main(String[] args) {
        System.out.println(10); // 输出一个整数
        System.out.println(5.5); // 输出一个小数
        System.out.println('a'); // 输出一个字符
        System.out.println(true); // 输出boolean值true
        System.out.println("欢迎来到黑马程序员"); // 输出字符串
    }
}

区分技巧

  1. 不带小数点的数字都是整数类型的字面量。
  2. 只要带了小数点,那么就是小数类型的字面量。
  3. 只要用双引号引起来的,不管里面的内容是什么,不管里面有没有内容,都是字符串类型的字面量。
  4. 字符类型的字面量必须用单引号引起来,不管内容是什么,但是个数有且只能有一个。
  5. 字符类型的字面量只有两个值,true、false。
  6. 空类型的字面量只有一个值,null。

4. 变量

4.1 什么是变量?

​ 变量就在程序中临时存储数据的容器。但是这个容器中只能存一个值。

4.2 变量的定义格式

​ 数据类型 变量名 = 数据值;

4.2.1 格式详解

​ 数据类型:限定了变量当中能存储什么类型的数据。

​ 如果要存 10,那么数据类型就需要写整数类型。

​ 如果要存 10.0,那么数据类型就需要写小数类型。

​ 变量名:其实就是这个容器的名字。

​ 当以后想要使用变量里面的数据时,直接使用变量名就可以了。

​ 数据值:真正存储在容器中的数据。

​ 分号:表示语句的结束,就跟以前写作文时候的句号是一样的。

4.2.2 常用的数据类型

​ 整数:int

​ 小数:(浮点数)double

​ 其他数据类型稍后讲解

举例:

public class VariableDemo{
    public static void main(String[] args){
        //定义一个整数类型的变量
        //数据类型 变量名 = 数据值;
        int a = 16;
        System.out.println(a);//16

        //定义一个小数类型的变量
        double b = 10.1;
        System.out.println(b);//10.1
    }
}

4.2.3 变量的注意事项

  • 变量名不能重复
  • 在一条语句中,可以定义多个变量。但是这种方式影响代码的阅读,所以了解一下即可。
  • 变量在使用之前必须要赋值。

案例:

public class VariableDemo2{
    public static void main(String[] args){
        //1.变量名不允许重复
        //int a = 10;
        //int a = 20;
        //System.out.println(a);

        //2.一条语句可以定义多个变量
        //了解。
        //int a = 10, b = 20, c = 20,d = 20;
        //System.out.println(a);//?
        //System.out.println(b);//?


        //3.变量在使用之前必须要赋值
        int a = 30;
        System.out.println(a);
    }
}

4.3 变量的练习

​ 需求:说出公交车到终点站之后,车上一共有多少乘客?

​ 一开始没有乘客。

​ 第一站:上去一位乘客,没有下来乘客。

​ 第二站:上去两位乘客,下来一位乘客。

​ 第三站:上去两位乘客,下来一位乘客。

​ 第四站:没有上去乘客,下来一位乘客。

​ 第五站:上去一位乘客,没有下来乘客。

​ 问:到了终点站之后,车上一共多少乘客?

​ 代码解析:

public class VariableTest1{
    //主入口
    public static void main(String[] args){
        //一开始没有乘客。
        int count = 0;
        //第一站:上去一位乘客
        //在原有的基础上 + 1
        count = count + 1;
        //System.out.println(count);
        //第二站:上去两位乘客,下来一位乘客
        count = count + 2 - 1;
        //第三站:上去两位乘客,下来一位乘客
        count = count + 2 - 1;
        //第四站:下来一位乘客
        count = count - 1;
        //第五站:上去一位乘客
        count = count + 1;
        //请问:到了终点站,车上一共几位乘客。
        System.out.println(count);//3
    }
}

5. 数据类型

5.1 Java 语言数据类型的分类

  • 基本数据类型
  • 引用数据类型(面向对象的时候再深入学习)

5.2 基本数据类型的四类八种

数据类型 关键字 内存占用 取值范围
整数 byte 1 负的 2 的 7 次方 ~ 2 的 7 次方-1(-128~127)
short 2 负的 2 的 15 次方 ~ 2 的 15 次方-1(-32768~32767)
int 4 负的 2 的 31 次方 ~ 2 的 31 次方-1
long 8 负的 2 的 63 次方 ~ 2 的 63 次方-1
浮点数 float 4 1.401298e-45 ~ 3.402823e+38
double 8 4.9000000e-324 ~ 1.797693e+308
字符 char 2 0-65535
布尔 boolean 1 true,false

说明

​ e+38 表示是乘以 10 的 38 次方,同样,e-45 表示乘以 10 的负 45 次方。

​ 在 java 中整数默认是 int 类型,浮点数默认是 double 类型。

需要记忆以下几点

byte 类型的取值范围:

​ -128 ~ 127

int 类型的大概取值范围:

​ -21 亿多 ~ 21 亿多

整数类型和小数类型的取值范围大小关系:

​ double > float > long > int > short > byte

最为常用的数据类型选择:

  • 在定义变量的时候,要根据实际的情况来选择不同类型的变量。

    比如:人的年龄,可以选择 byte 类型。

    比如:地球的年龄,可以选择 long 类型。

  • 如果整数类型中,不太确定范围,那么默认使用 int 类型。

  • 如果小数类型中,不太确定范围,那么默认使用 double 类型。

  • 如果要定义字符类型的变量,那么使用 char

  • 如果要定义布尔类型的变量,那么使用 boolean

5.3 定义 8 种基本数据类型变量

public class VariableDemo3{
    public static void main(String[] args){
        //1.定义byte类型的变量
        //数据类型 变量名 = 数据值;
        byte a = 10;
        System.out.println(a);

        //2.定义short类型的变量
        short b = 20;
        System.out.println(b);

        //3.定义int类型的变量
        int c = 30;
        System.out.println(c);

        //4.定义long类型的变量
        long d = 123456789123456789L;
        System.out.println(d);

        //5.定义float类型的变量
        float e = 10.1F;
        System.out.println(e);

        //6.定义double类型的变量
        double f = 20.3;
        System.out.println(f);

        //7.定义char类型的变量
        char g = 'a';
        System.out.println(g);

        //8.定义boolean类型的变量
        boolean h = true;
        System.out.println(h);

    }
}

注意点

  • 如果要定义 一个整数类型的变量,不知道选择哪种数据类型了,默认使用 int。
  • 如果要定义 一个小数类型的变量,不知道选择哪种数据类型了,默认使用 double。
  • 如果要定义一个 long 类型的变量,那么在数据值的后面需要加上 L 后缀。(大小写都可以,建议大写。)
  • 如果要定义一个 float 类型的变量,那么在数据值的后面需要加上 F 后缀。(大小写都可以)

5.4 练习 1

需求:定义 5 个变量记录老师的信息并打印

代码示例:

public class VariableTest1{
    public static void main(String[] args){
        //1.定义字符串类型的变量记录老师的姓名
        String name = "黑马谢广坤";
        //2.定义整数类型的变量记录老师的年龄
        int age = 18;
        //3.定义字符类型的变量记录老师的性别
        char gender = '男';
        //4.定义小数类型的变量记录老师的身高
        double height = 180.1;
        //5.定义布尔类型的变量记录老师的婚姻状况
        boolean flag = true;

        //输出5个变量的值
        System.out.println(name);
        System.out.println(age);
        System.out.println(gender);
        System.out.println(height);
        System.out.println(flag);

    }
}

5.5 练习 2

需求:将(电影名称,主演,年份,评分)四个信息选择不同类型的变量,随后打印出来。

代码示例:

public class VariableTest2{
    public static void main(String[] args){
        //1.定义字符串变量记录电影的名称
        String movie = "送初恋回家";
        //2.定义三个变量记录主演的名字
        String name1 = "刘鑫";
        String name2 = "张雨提";
        String name3 = "高媛";
        //3. 定义整数类型的变量记录年龄的年份
        int year = 2020;
        //4.定义小数类型的变量记录电影的评分
        double score = 9.0;

        //打印变量的信息
        System.out.println(movie);
        System.out.println(name1);
        System.out.println(name2);
        System.out.println(name3);
        System.out.println(year);
        System.out.println(score);

    }
}

5.6 练习 3

需求:选择其中一部手机,将(手机价格,手机品牌)两个信息选择不同类型的变量,随后打印出来。

代码示例:

public class VariableTest3{
    public static void main(String[] args){
        //1.定义小数类型的变量记录手机的价格
        double price = 5299.0;

        //2.定义字符串类型的变量记录手机的品牌
        String brand = "华为";

        //输出变量记录的值
        System.out.println(price);
        System.out.println(brand);
    }
}

6. 标识符

业内大多数程序员都在遵守阿里巴巴的命名规则。

在 day02 的资料文件夹中有。

6.1 硬性要求:

​ 必须要这么做,否则代码会报错。

  • 必须由数字、字母、下划线_、美元符号$组成。
  • 数字不能开头
  • 不能是关键字
  • 区分大小写的。

6.2 软件建议:

​ 如果不这么做,代码不会报错,但是会让代码显得比较 low。

6.2.1 小驼峰命名法

适用于变量名和方法名

  • 如果是一个单词,那么全部小写,比如:name

  • 如果是多个单词,那么从第二个单词开始,首字母大写,比如:firstName、maxAge

6.2.2 大驼峰命名法

适用于类名

  • 如果是一个单词,那么首字母大写。比如:Demo、Test。

  • 如果是多个单词,那么每一个单词首字母都需要大写。比如:HelloWorld

不管起什么名字,都要做到见名知意。

阿里巴巴命名规范细节:

  1. 尽量不要用拼音。但是一些国际通用的拼音可视为英文单词。

    正确:alibaba、hangzhou、nanjing

    错误:jiage、dazhe

  2. 平时在给变量名、方法名、类名起名字的时候,不要使用下划线或美元符号。

    错误:_name

    正确:name

7. 键盘录入

​ 键盘录入的实际功能 Java 已经帮我们写好了,不需要我们自己再实现了,而 Java 写好的功能都放在了 Scanner 这个类中,所以,我们只要直接使用 Scanner 这个类就可以了。

使用步骤:

第一步:

​ 导包:其实就是表示先找到 Scanner 这个类在哪。

第二步:

​ 创建对象:其实就表示申明一下,我准备开始用 Scanner 这个类了。

第三步:

​ 接收数据:也是真正干活的代码。

代码示例:

//导包,其实就是先找到Scanner这个类在哪
import java.util.Scanner;
public class ScannerDemo1{
    public static void main(String[] args){
        //2.创建对象,其实就是申明一下,我准备开始用Scanner这个类了。
        Scanner sc = new Scanner(System.in);
        //3.接收数据
        //当程序运行之后,我们在键盘输入的数据就会被变量i给接收了
        System.out.println("请输入一个数字");
        int i = sc.nextInt();
        System.out.println(i);
    }
}

8. IDEA

8.1 IDEA 概述

​ IDEA 全称 IntelliJ IDEA,是用于 Java 语言开发的集成环境,它是业界公认的目前用于 Java 程序开发最好的工具。

集成环境:

​ 把代码编写,编译,执行,调试等多种功能综合到一起的开发工具。

8.2 IDEA 的下载和安装

8.2.1 下载

​ 可以到官方网站自行下载,网址为:https://www.jetbrains.com/idea

​ 今天的资料中,对应的安装包也提高给大家了。

8.2.2 安装

  • 到资料文件夹中,双击安装包。
  • 点击 next,准备安装

计算机发展

  • 点击 Browse 修改安装路径。

    修改完毕点击 next

计算机发展

  • 勾选 64-bit launcher。表示在桌面新建一个 64 位的快捷方式。

    其他的不要勾选。

    点击 next。

计算机发展

  • 点击 Install,准备安装。

计算机发展

  • 等进度条读取完毕之后,会有最终界面提示。

    点击 finish 即可。

计算机发展

  • 第一次启动会询问,是否导入一些设置。

    选择第二个不导入,保持默认设置,再点击 OK。

计算机发展

  • 选择背景主题

    左边是黑色背景。右边是白色背景。

    这个可以根据自己的喜好来选择。

    选择完毕点击右下角的 next

计算机发展

  • 在本界面让我们购买 idea。

    因为我们是学习阶段,所以可以使用免费使用 30 天。

    点击第一排第二个。Evaluate for free

计算机发展

  • 点击蓝色的 Evaluate,就可以开始免费试用 30 天了。

计算机发展

  • 当看到这个界面,就表示 idea 已经成功安装完毕

    可以点击右上角关闭。

计算机发展

8.3 IDEA 中层级结构介绍

8.3.1 结构分类

  • project(项目、工程)
  • module(模块)
  • package(包)
  • class(类)

8.3.2 结构介绍

​ 为了让大家更好的吸收,package 这一层级,我们后面再学习,先学习最基础的 project、module、class。

project(项目、工程)

​ 淘宝、京东、黑马程序员网站都属于一个个项目,IDEA 中就是一个个的 Project。

module(模块)

​ 在一个项目中,可以存放多个模块,不同的模块可以存放项目中不同的业务功能代码。在黑马程序员的官方网站中,至少包含了以下模块:

  • 论坛模块
  • 报名、咨询模块

为了更好的管理代码,我们会把代码分别放在两个模块中存放。

package(包)

​ 一个模块中又有很多的业务,以黑马程序员官方网站的论坛模块为例,至少包含了以下不同的业务。

  • 发帖
  • 评论

为了把这些业务区分的更加清楚,就会用包来管理这些不同的业务。

class(类)

​ 就是真正写代码的地方。

8.3.3 小结

  • 层级关系

    ​ project - module - package - class

  • 包含数量

    ​ project 中可以创建多个 module
    ​ module 中可以创建多个 package
    ​ package 中可以创建多个 class

    ​ 这些结构的划分,是为了方便管理类文件的。

8.4 IDEA 中的第一个代码

8.4.1 操作步骤
  • 创建 Project 项目
  • 创建 Module 模块
  • 创建 class 类
  • 在类中编写代码
  • 完成编译运行
8.4.2 分步图解
  • 双击启动图标

    计算机发展

  • 首先要新建一个项目

    点击 creat new project

    计算机发展

  • 我们要从 0 开始写代码,所以新建一个空的什么都没有的项目。

    点击左下方的 Empty Project

    再点击右下角的 next

计算机发展

  • 输入项目的名称

    输入项目的存放路径

计算机发展

  • 点击 ok。idea 会帮助我们在本地创建一个项目文件夹

计算机发展

  • 点击 Module,准备新建一个模块

计算机发展

  • 点击+

    再点击 New Module

计算机发展

  • 我们要编写 Java 代码,所以要新建一个 Java 模块。

    点击 Java

    再点击右下角的 next

计算机发展

  • 输入模块的名称

    再点击右下角的 Next

计算机发展

  • 成功新建一个模块之后,中间就会出现刚刚新建的模块

    点击右下角的 OK

计算机发展

  • 回到主界面

    展开刚刚新建的模块

    右键点击 src,选择 New,选择 Java Class

计算机发展

  • 输入类名

    再按回车

计算机发展

  • 由于字体比较小

    所以,我们要设置一下字体。

    点击 File,选择 Setting。

计算机发展

  • 搜索一下 font

    在右边可以输入 Size 的数值来调节代码字体的大小。

    设置完毕后点击右下角的 OK

计算机发展

  • 编写代码

计算机发展

  • 运行代码

    右键空白处,点击 Run

计算机发展

  • 最下面会弹出控制台。

    所有输出语句中的内容,都会在控制台上展示。

计算机发展

8.5 IDEA 中类的相关操作

8.5.1 类的相关操作

  • 新建类文件
  • 删除类文件
  • 修改类文件

8.5.2 新建类文件

  • 所有的 Java 代码都会写在 src 文件夹当中。

    所以,右键点击 src,选择 new,点击 Java Class

    计算机发展

  • 输入类名,再按回车

    计算机发展

  • 新建完毕

计算机发展

8.5.3 修改类名

  • 右键点击想要修改的文件

    点击 Refactor

    再点击 Rename

计算机发展

  • 输入想要修改的名字

    输入完毕点击下面的 Refactor

计算机发展

  • 文件名和类名均已修改成功

    计算机发展

8.5.4 删除类文件

  • 想要删除哪个文件,就右键点击该文件

    选择 Delete 即可

计算机发展

  • 在弹出的界面中点击 OK,确定删除

计算机发展

小贴士:

此时删除是不走回收站的,直接从硬盘中删掉了。

8.6 IDEA 中模块的相关操作

8.6.1 模块的相关操作

  • 新建模块
  • 删除模块
  • 修改模块
  • 导入模块

8.6.2 新建模块

  • 点击 File,选择 Project Structure

计算机发展

  • 选择 Module

计算机发展

  • 点击+

    选择 New Module

计算机发展

  • 要创建一个 Java 模块,所以选择第一个 Java

    点击右下角的 Next

计算机发展

  • 输入模块的名称

    点击右下角的 Finish

计算机发展

  • 成功新建完毕之后,在中间空白区域就出现了刚刚新建的模块

    点击右下角的 OK

计算机发展

  • 在主界面中,也会出现刚刚新建的模块

计算机发展

8.6.3 删除模块

  • 右键点击模块

    选择 Remove Module

计算机发展

  • 选择 Remove,表示确定删除

计算机发展

  • 此时发现,在 IDEA 列表页面,删除的模块已经不在了。

计算机发展

小贴士:

此时删除仅仅是从 IDEA 列表中的删除,在本地硬盘中还是存在的。

8.6.4 修改模块

  • 右键点击模块名

    选择 Refactor

    再选择 Rename

计算机发展

  • 选择第三个修改模块名和本地文件夹名

    点击 OK

计算机发展

  • 输入要修改的新的模块名

    输入完毕点击 Refactor

计算机发展

  • 回到主界面,就发现模块名和文件夹名都已经修改完毕

计算机发展

8.6.5 导入模块

  • 点击 File,选择 Project Structure

计算机发展

  • 选择 Module

    点击+

    选择 Import Module

计算机发展

  • 从本地硬盘中选择要导入的模块

    再点击 OK

计算机发展

  • 不断点击 Next

计算机发展

  • 如果中间出现提示框,则点击 Overwrite

    然后继续点击右下角的 Next

计算机发展

  • 一直点到 finish 为止

计算机发展

  • 成功导入后,在中间位置就会出现导入的模块信息

计算机发展

  • 在主界面中也会出现导入的模块信息

计算机发展

  • 展开模块点击模块中的 Java 文件,会发现代码报错。

    是因为导入模块跟 JDK 没有关联导致。

计算机发展

  • 可以点击右上角的 Setup SDK

    再选择已经安装的 JDK 版本即可

计算机发展

  • 导入完毕之后,代码就恢复正常不会报错了

计算机发展

8.7 IDEA 中项目的相关操作

8.7.1 项目的相关操作

  • 关闭项目
  • 打开项目
  • 修改项目
  • 新建项目

8.7.2 关闭项目

  • 点击 File,选择 Close Project 即可

计算机发展

  • 刚刚操作的项目就已经关闭了

    左侧是项目列表,如果要再次打开该项目,直接点击即可。

    右侧有 create new project,可以再建一个新的项目

计算机发展

  • 鼠标放在项目上,后面会出现一个叉。

    如果点击了这里的叉,会在 IDEA 的列表中删除。不会删除本地硬盘上的项目。

计算机发展

8.7.3 打开项目

  • 在本界面还可以打开本地已经存在的项目

    点击 Open or Import

计算机发展

  • 选择要打开的项目

    点击 OK

计算机发展

  • 项目就被打开了。

计算机发展

8.7.4 修改项目

  • 点击 File,选择 Project Structure

计算机发展

  • 在这个界面,默认是 Module

    所以,要先点击 Project

    在右侧页面中,输入新的项目名称

    修改 JDK 版本和编译版本都变成 JDK14

    再点击 OK

计算机发展

  • 此时发现,项目名称已经修改完毕

计算机发展

  • 但是本地文件夹的名字还没有修改

计算机发展

  • 需要先关闭当前项目

计算机发展

  • 点击项目后面的叉,从列表中移除项目

计算机发展

  • 到本地硬盘中手动修改文件夹的名称

计算机发展

  • 点击 Open or Import 重新打开项目

计算机发展

  • 选择修改之后的项目

    点击 OK

计算机发展

  • 此时会发现,项目名称和本地硬盘文件夹的名称都已经修改完毕了

计算机发展

8.7.5 新建项目

  • 点击 File

    选择 New

    点击 Project

计算机发展

  • 同样还是创建一个什么都没有的空项目

计算机发展

  • 输入项目的名称

    点击右下角的 finish

计算机发展

  • IDEA 循环是否需要帮我们在本地创建一个新的文件夹

    点击 OK

计算机发展

  • 询问是在本窗口打开还是在一个新的窗口打开。

    可以点击 New Window,在一个新的窗口打开。

计算机发展

  • 此时就出现了两个窗口,在一个新的窗口打开了新的项目

计算机发展

本篇文章代码由黑马程序员提供

阅读全文

day01-Java基础语法

java 2024/12/12

注意:

​ 用记事本打开本文档,格式较差。

​ 可安装 typora 软件后再次打开。

​ 安装包位于:day01\资料\其他软件\阅读笔记的软件\typora-setup-x64.exe

day01 - Java 基础语法

1. 人机交互

1.1 什么是 cmd?

就是在 windows 操作系统中,利用命令行的方式去操作计算机。

我们可以利用 cmd 命令去操作计算机,比如:打开文件,打开文件夹,创建文件夹等。

1.2 如何打开 CMD 窗口?

  1. 按下快捷键:win + R。

    此时会出现运行窗口。
    
  2. 在运行窗口中输出 cmd

  3. 输出回车。

解惑:

​ cmd 默认操作 C 盘下的 users 文件夹下的 XXX 文件夹。(XXX 就是计算机名)

image-20210923091350952

1.3 常用 CMD 命令

扩展一个小点:

​ 在很多资料中都说成是 DOS 命令,其实是不对的。真正的 DOS 命令是 1981 年微软和 IBM 出品的 MS-DOS 操作系统中的命令才叫做 DOS 命令。

​ 而在 Windows 中,win98 之前的操作系统是以非图形化的 DOS 为基础的,可以叫做 DOS 命令。到了 2000 年以后,windows 逐渐的以图形化界面为主了,这个时候就不能叫 DOS 命令了,他只是模拟了 DOS 环境而已,很多的原本的 DOS 命令已经无法使用了,所以这个时候叫做 CMD 命令会更准确一些。

常见的 CMD 命令如下:

操作 说明
盘符名称: 盘符切换。E:回车,表示切换到 E 盘。
dir 查看当前路径下的内容。
cd 目录 进入单级目录。cd itheima
cd .. 回退到上一级目录。
cd 目录 1\目录 2... 进入多级目录。cd itheima\JavaSE
cd \ 回退到盘符目录。
cls 清屏。
exit 退出命令提示符窗口。

1.4 CMD 练习

需求:

利用 cmd 命令打开自己电脑上的 QQ。

完成步骤:

1,确定自己电脑上的QQ安装在哪里
2,启动cmd
3,进入到启动程序QQ.exe所在的路径。
4,输出qq.exe加回车表示启动qq。

解惑:

​ 在 windows 操作系统当中,文件名或者文件夹名是忽略大小写的。

1.5 环境变量

作用:

​ 如果我想要在 CMD 的任意目录下,都可以启动某一个软件,那么就可以把这个软件的路径配置到环境变量中的 PATH 里面。

​ 在启动软件的时候,操作系统会先在当前路径下找,如果在当前录课没有再到环境变量的路径中去找。如果都找不到就提示无法启动。

步骤:

  • 右键我的电脑,选择属性。
  • 点击左侧的高级系统设置
  • 选择高级,再点击下面的环境变量。
  • 找系统变量里面的 PATH
  • 把软件的完整路径,配置到 PATH 当中就可以了。
  • (可做可不做)就是把自己配置的路径,移动到最上面。

图解示例如下:

第一步:右键点击我的电脑并选择属性。

(如果无法出现第二步界面,可以打开我的电脑之后右键点击空白处)

image-20210923091350952

第二步:点击高级系统设置。

image-20210923091350952

第三步:选择高级,再点击下面的环境变量。

image-20210923091350952

第四步:找系统变量里面的 PATH

image-20210923091350952

第五步:点击新建,把软件的完整路径,配置到 PATH 当中,再点击确定即可。

第六步:(可做可不做)点击上移,把当前配置的路径移动到最上面。

移动的好处:在 CMD 中打开软件时,会先找当前路径,再找环境变量,在环境变量中是从上往下依次查找的,如果路径放在最上面查找的速度比较快。

image-20210923091350952

2. Java 概述

1.1 Java 是什么?

语言:人与人交流沟通的表达方式

计算机语言:人与计算机之间进行信息交流沟通的一种特殊语言

Java 是一门非常火的计算机语言。(也叫做编程语言)

我们想要让计算机做一些事情,那么就可以通过 Java 语言告诉计算机就可以了

1.2 下载和安装

1.2.1 下载

通过官方网站获取 JDK

http://www.oracle.com

注意 1:针对不同的操作系统,需要下载对应版本的 JDK。

注意 2

​ 如果你的电脑是 windows32 位的,建议重装系统,重装成 64 位的操作系统。

​ 因为 Java 从 9 版本开始,就已经不提供 32 位版本的安装包了。

​ 如果自己不愿意下载,到今天 day01 资料文件中,也有对应的安装包。

1.2.2 安装

​ 傻瓜式安装,下一步即可。默认的安装路径是在 C:\Program Files 下。

建议:

  • 安装路径不要有中文,不要有空格等一些特殊的符号。
  • 以后跟开发相关的所有软件建议都安装在同一个文件夹中,方便管理。

1.2.3 JDK 的安装目录介绍

目录名称 说明
bin 该路径下存放了 JDK 的各种工具命令。javac 和 java 就放在这个目录。
conf 该路径下存放了 JDK 的相关配置文件。
include 该路径下存放了一些平台特定的头文件。
jmods 该路径下存放了 JDK 的各种模块。
legal 该路径下存放了 JDK 各模块的授权文档。
lib 该路径下存放了 JDK 工具的一些补充 JAR 包。

1.3 HelloWorld 小案例

​ HelloWorld 案例是指在计算机屏幕上输出“HelloWorld”这行文字。各种计算机语言都习惯使用该案例作为第一个演示案例。

2.3.1 Java 程序开发运行流程

开发 Java 程序,需要三个步骤:编写程序,编译程序,运行程序。

2.3.2 HelloWorld 案例的编写

  1. 新建文本文档文件,修改名称为 HelloWorld.java。

注意:后缀名为 java 的才是 java 文件。

  1. 用记事本打开 HelloWorld.java 文件,输写程序内容。

注意:代码要跟我编写的完全保持一致。

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("HelloWorld");
    }
}
  1. 保存

注意:未保存的文件在左上角会有*符号标记

  1. 编译文件。编译后会产生一个 class 文件。

    java 文件:程序员自己编写的代码。

    class 文件:交给计算机执行的文件。

  2. 运行代码

    注意:运行的是编译之后的 class 文件。

用到两个命令:

​ javac + 文件名 + 后缀名 (就是编译 java 文件)

​ java + 文件名(运行编译之后的 class 文件)

1.4 HelloWorld 案例常见问题

1.4.1 BUG

​ 在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题统称为 bug(漏洞)。

1.4.2 BUG 的解决

  1. 具备识别 BUG 的能力:多看
  2. 具备分析 BUG 的能力:多思考,多查资料
  3. 具备解决 BUG 的能力:多尝试,多总结

1.4.3 HelloWorld 常见问题

1、非法字符问题。Java 中的符号都是英文格式的。

2、大小写问题。Java 语言对大小写敏感(区分大小写)。

3、在系统中显示文件的扩展名,避免出现 HelloWorld.java.txt 文件。

4、编译命令后的 java 文件名需要带文件后缀.java

5、运行命令后的 class 文件名(类名)不带文件后缀.class

常见错误代码 1:

publicclass HelloWorld{
    public static void main(String[] args){
        System.out.println("HelloWorld");
    }
}

问题:

​ public 和 class 之间缺少一个空格。

技巧:一般来讲在单词之间的空格是不能省略的。

​ 如果是单词和符号之间的空格是可以省略的。

常见错误代码 2:

public class HelloWorld{
    public static void main(String[] args){
        system.out.println("HelloWorld");
    }
}

问题:

​ system 首字母必须大写。

技巧:

​ Java 代码中,是严格区分大小写的。

​ 所以该大写的地方一定要大写,该小写的地方一定要小写。多多练习。

常见错误代码 3:

public class HelloWorld{
    public static void main(String[] args){
        System.out.println(HelloWorld);
    }
}

问题:

​ 第三行代码中的 HelloWorld 必须用双引号引起来,否则就会出现问题。

常见错误代码 4:

public class HelloWorld{
    public static void main(String[] args){
        System.out.println("HelloWorld");
    }
}

问题:

​ 在以后代码当中,所有的标点符号必须是英文状态下的。

技巧:

​ 可以在输入法中进行对应的设置。

1.5 环境变量

1.5.1 为什么配置环境变量

​ 开发 Java 程序,需要使用 JDK 提供的开发工具(比如 javac.exe、java.exe 等命令),而这些工具在 JDK 的安装目录的 bin 目录下,如果不配置环境变量,那么这些命令只可以在 bin 目录下使用,而我们想要在任意目录下都能使用,所以就要配置环境变量。

注意:现在最新从官网上下载的 JDK 安装时会自动配置 javac、java 命令的路径到 Path 环境变量中去 ,所以 javac、java 可以直接使用。

1.5.2 配置方式

image-20210923091654365

以前下载的老版本的 JDK 是没有自动配置的,而且自动配置的也只包含了 4 个工具而已,所以我们需要删掉已经配置完毕的,再次重新配置 Path 环境变量。

JAVA_HOME:告诉操作系统 JDK 安装在了哪个位置(未来其他技术要通过这个找 JDK)

image-20210923091710450

Path:告诉操作系统 JDK 提供的 javac(编译)、java(执行)命令安装到了哪个位置

image-20210923091721035

1.5.3win10 的 bug

当电脑重启之后,环境变量失效了。表示操作系统不支持自定义的环境变量。

步骤:

  • 还是要配置 JAVA_HOME 给以后的相关软件去使用

  • 我们可以把 java 和 javac 的完整路径配置到 PATH 当中。

    E:\develop\JDK\bin

1.6 Notepad++

1.6.1 下载

​ 打开百度,搜索一下 notepad++就可以了。

​ day01 的资料文件夹里面也有对应的安装包。

1.6.2 安装

傻瓜式安装,直接点击下一步就可以了。

​ 对安装路径有两个小建议:

  • 路径不要有中文,不要有空格,不要有一些特殊符号
  • 建议最好把所有的跟开发相关的软件都放在一起,方便管理。

1.6.3 设置

​ 右键点击 java 文件,选择 edit with notepad++。

​ 点击设置,再点击首选项。在弹出的页面当中,左侧选择新建,中间选择 Java,右侧选择 ANSI。

1.6.4 练习

​ 利用 notepad++去编写一个 HelloWorld 并能成功编译和运行。

1.7 Java 语言的发展

三个版本:

  • Java5.0:这是 Java 的第一个大版本更新。
  • Java8.0:这个是目前绝大数公司正在使用的版本。因为这个版本最为稳定。
  • Java15.0:这个是我们课程中学习的版本。

解惑:

​ 我们学的跟工作中使用的版本不太一样啊。会不会影响以后工作呢?

向下兼容。新的版本只是在原有的基础上添加了一些新的功能而已。

举例:

用 8 版本开发的代码,用 11 版本能运行吗?必须可以的。

用 11 版本开发的代码,用 8 版本能运行吗?不一定。

如果 11 版本开发的代码,没有用到 9~11 的新特性,那么用 8 是可以运行的。

如果 11 版本开发的代码,用到了 9~11 的新特性,那么用 8 就无法运行了。

1.8 Java 的三大平台

​ JavaSE、JavaME、JavaEE

1.8.1 JavaSE

​ 是其他两个版本的基础。

1.8.2 JavaME

​ Java 语言的小型版,用于嵌入式消费类电子设备或者小型移动设备的开发。

​ 其中最为主要的还是小型移动设备的开发(手机)。渐渐的没落了,已经被安卓和 IOS 给替代了。

​ 但是,安卓也是可以用 Java 来开发的。

1.8.3 JavaEE

​ 用于 Web 方向的网站开发。(主要从事后台服务器的开发)

​ 在服务器领域,Java 是当之无愧的龙头老大。

1.9 Java 的主要特性

  • 面向对象
  • 安全性
  • 多线程
  • 简单易用
  • 开源
  • 跨平台

1.9.1 Java 语言跨平台的原理

  • 操作系统本身其实是不认识 Java 语言的。
  • 但是针对于不同的操作系统,Java 提供了不同的虚拟机。

虚拟机会把 Java 语言翻译成操作系统能看得懂的语言。

image-20210923091350952

1.10 JRE 和 JDK

image-20210923091544110

JVM(Java Virtual Machine),Java 虚拟机

JRE(Java Runtime Environment),Java 运行环境,包含了 JVM 和 Java 的核心类库(Java API)

JDK(Java Development Kit)称为 Java 开发工具,包含了 JRE 和开发工具

总结:我们只需安装 JDK 即可,它包含了 java 的运行环境和虚拟机。

本篇文章代码由黑马程序员提供

阅读全文

2024-11-27-蓝桥杯:查找最大元素

算法 2024/12/11

查找最大元素

问题与代码

思路

//读取字符串并转换为字符数组:
String str = scan.next();
char[] chars = str.toCharArray();
//找出ASCII码值最大的字符:
char max = 'a';
for(int j=0;j<chars.length;j++){
  if(chars[j]>max){
    max=chars[j];
  }
}
//替换最大字符:
String result = str.replaceAll(max+"",max+"(max)");
阅读全文

2024-11-16-蓝桥杯:回文判定

算法 2024/12/11

回文判定

问题与代码

思路

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String S = scan.next(); // 从标准输入读取一个字符串
        char[] c = S.toCharArray(); // 将字符串转换为字符数组
        StringBuilder sb = new StringBuilder(); // 创建一个StringBuilder对象,用于构建字符串
        double a = Math.pow(10, 6); // 定义一个变量a,值为10的6次方,但这里实际上用不上,因为字符串长度是int类型

        // 检查字符串长度是否在1到10^6之间(虽然a是double类型,但这里只是形式上的检查,因为字符串长度不会超过Integer.MAX_VALUE)
        
            for (int i = 0; i < c.length; i++) {
                char str = c[i]; // 获取当前字符

                // 检查字符是否为字母(ASCII码65-90为大写字母A-Z,97-122为小写字母a-z)
                if (str >= 65 && str <= 90 || str >= 97 && str <= 122) {
                    // 这里开始出现问题:每次遇到字母时,都会重新遍历整个字符串并反转,这是不必要的
                    for (int i1 = c.length - 1; i1 >= 0; i1--) {
                        char str2 = c[i1]; // 获取反转后的字符
                        sb.append(str2); // 将字符添加到StringBuilder中
                    }
                    String str3 = sb.toString(); // 将StringBuilder转换为字符串

                    // 检查反转后的字符串是否与原字符串相同
                    if (str3.equals(S)) {
                        System.out.println("Y"); // 如果是,输出Y
                    } else {
                        System.out.println("N"); // 如果不是,输出N
                    }
                    break; // 一旦完成比较,就退出循环,这意味着只要第一个字符是字母,就会立即判断

                } else {
                    System.out.println("N"); // 如果当前字符不是字母,直接输出N并退出循环
                    break;
                }

                // 注意:这里的逻辑存在问题,因为无论是否找到字母,都会立即退出循环,
                // 这意味着代码只能检查字符串的第一个字符是否为字母以及它是否构成回文。
            }
        }
        scan.close(); // 关闭Scanner对象
    }
}

// 存在的问题和改进建议:
// 1. 不需要每次遇到字母都重新反转整个字符串,只需在循环结束后进行一次反转检查。
// 2. 可以先过滤掉非字母字符,再检查剩余部分是否为回文。
// 3. 变量a的声明和使用是多余的,因为字符串长度是int类型,不会超过Integer.MAX_VALUE。
// 4. 可以使用更高效的算法,如双指针法,来检查回文。
阅读全文
1 ... 4 5
avatar
SakuraKy

Genius is an infinite capacity for taking pains.