黑马程序员Java基础学习(一)

目录

注释

字面量

字面量的分类

变量

使用变量的几点注意事项

变量里数据的存储原理(进制)

二进制

十进制转二进制的算法: 除二取余法

ASCII码表

二进制转十进制

二进制如何计算成八进制

Java的数据类型

基本数据类型

关键字、标识符

Java程序的基本语法

方法

方法如何使用

方法的一些注意事项

类型转换

自动类型转换

强制类型转换

表达式的自动类型提升

输入输出

运算符

基本的算术运算符

+符号在Java中的特殊用途

自增自减运算符

自增自减运算符

自增自减拓展案例

分步分析:

赋值运算符

关系运算符、三元运算符

三元运算符

逻辑运算符

阶段小案例

健康计算器

程序说明:

System.out.println和System.out.print和System.out.printf的区别详解

 总结

程序流程控制执行

顺序结构-自上而下的执行程序

If分支结构-根据条件的真或假,来决定执行某段代码。

分支结构-根据条件,选择对应的代码执行

switch分支结构-是通过比较值是否相等,来决定执行哪条分支。

循环结构-控制某段代码重复的执行

for循环-控制一段代码反复执行很多次

While循环

do-while循环

三种循环的使用小结

死循环

循环嵌套-

break、continue

Random生成随机数

Random生成随机数需要几步?

阶段小案例

简单计算器

程序说明

猜数字小游戏

开发一个验证码

1、随机验证码的核心实现逻辑是如何进行的?

数组

数组的定义方式二:动态初始化数组

数组的遍历

二维数组

面向对象编程

类的基本语法

类的成分:构造器

this关键字

封装

JavaBean——实体类

static

static修饰成员变量

static修饰方法

静态方法的应用

静态方法,实例方法访问相关的几点注意事项

案例-简易版电影信息展示系统


注释

字面量

就是程序中能直接书写的数据,学这个知识的重点是:搞清楚Java程序中数据的书写格式

字面量的分类

变量

变量就是内存中的一块区域,可以理解成一个盒子,用来装程序要处理的数据的。

变量特点和应用场景

使用变量的几点注意事项

变量里数据的存储原理(进制)

二进制

只有0、1,按照逢2进1的方式表示数据

十进制转二进制的算法: 除二取余法

ASCII码表

二进制转十进制

八进制、十六进制

二进制如何计算成八进制

Java的数据类型

基本数据类型

4大类8种

数据类型

内存占用(字节数)

数据范围

整型

byte

1

-128~127

short

2

-32768~32767

int(默认)

4

-2147483648~2147483647 (10位数,大概21亿多)

long

8

-9223372036854775808 ~ 9223372036854775807 (19位数)

浮点型(小数)

float

4

1.401298 E -45 到 3.4028235 E +38 

double(默认)

8

4.9000000 E -324 到1.797693 E +308

字符型

char

2

0-65535

布尔型

boolean

1

true,false

引用数据类型:String

23 ,默认是int类型 , 加上L/l就是long类型的数据了。
23.8,默认是double类型,加上F/f就是float类型了。

关键字、标识符

关键字是java用了的,我们就不能用来为做为自己的:类名、变量名,否则会报错!

标志符就是名字(如类名、变量名…都是标识符)。

注意:取名字是有规则的

Java程序的基本语法

方法

方法是一种用于执行特定任务或操作的代码块,代表一个功能,它可以接收数据进行处理,并返回一个处理后的结果。

方法如何使用

定义满足需求的方法格式,主要考虑哪两方面?
方法是否需要接收数据,方法是否需要返回数据。

如果方法不需要返回数据,返回值类型必须声明成void(无返回值声明)方法内部不可以使用return返回数据

方法的一些注意事项

类型转换

为什么要进行类型转换?
存在不同类型的变量赋值给其他类型的变量

自动类型转换

byte < short < int < float < double

强制类型转换

表达式的自动类型提升

输入输出

使用Scanner接收用户键盘输入的数据,需要三个步骤:

运算符

基本的算术运算符

+符号在Java中的特殊用途

自增自减运算符

注意:
++ 、-- 只能操作变量,不能操作字面量的。

自增自减运算符

总结:

自增、自减运算符放在变量前后有区别吗?
如果单独使用放前放后是没有区别的。
非单独使用:在变量前 ,先进行变量自增/自减,再使用变量。
非单独使用:在变量后 ,先使用变量,再进行变量自增/自减。

自增自减拓展案例

解答:

分步分析:
  1. c++ - 使用 c 的当前值 10,然后 c 增加 1。

    • c++ 的值为 10
    • c 变为 11
  2. ++c - c 增加 1,然后使用新值。

    • ++c 的值为 12
    • c 变为 12
  3. --d - d 减少 1,然后使用新值。

    • --d 的值为 4
    • d 变为 4
  4. ++d - d 增加 1,然后使用新值。

    • ++d 的值为 5
    • d 变为 5
  5. 1 - 保持不变。

    • 值为 1

赋值运算符

+=可以实现数据的累加,把别人的数据加给自己。

关系运算符、三元运算符

判断数据是否满足条件,最终会返回一个判断的结果,这个结果是布尔类型的值:true或者false。

注意:在java中判断是否相等一定是“== ” ,千万不要把  “== ”误写成 “=”。   

三元运算符

逻辑运算符

总结:

逻辑运算符有哪些,有什么特点?
& : 有一个为false、结果是false
&&: 一个为false、结果是false,但前一个为false,后一个条件不执行了
| : 有一个为true、结果是true
|| :一个为true、结果是true,但前一个为true,后一个条件不执行了
! :!false=true、 !true=false
^  :相同是false、不同是true。
注意:实际开发中、常用的逻辑运算符还是:&& 、 || 、 !

阶段小案例

健康计算器

代码解答:

根据题目要求,我们需要开发一个Java程序,用来计算用户的BMI(身体质量指数)和BMR(基础代谢率)。根据题目中提供的公式,我们可以编写以下Java代码:

  1. BMR公式:
    • 对于男性:

      BMR=88.362+(13.397×体重(kg))+(4.799×身高(cm))−(5.677×年龄(岁))BMR=88.362+(13.397×体重(kg))+(4.799×身高(cm))−(5.677×年龄(岁))

    • 对于女性:

      BMR=447.593+(9.247×体重(kg))+(3.098×身高(cm))−(4.330×年龄(岁))BMR=447.593+(9.247×体重(kg))+(3.098×身高(cm))−(4.330×年龄(岁))

  2. BMI 计算公式
    BMI = 体重 (kg) / (身高 (m))²

    • 体重单位为千克,身高单位为米。
  3. BMI 分类

    • BMI < 18.5:体重过轻
    • 18.5 ≤ BMI < 24.9:正常范围
    • 25 ≤ BMI < 29.9:超重
    • BMI ≥ 30:肥胖

程序说明:

  1. BMI计算:根据用户输入的体重和身高,调用calculateBMI方法计算BMI。
  2. BMR计算:根据用户的性别、年龄、体重和身高,调用相应的calculateBMRForMencalculateBMRForWomen方法来计算BMR。
  3. 输入输出:程序首先让用户输入性别、年龄、体重和身高,然后分别输出BMI和BMR的结果。
// 方法用于计算BMI
        public static double calculateBMI(double weight, double height) {
            return weight / (height * height);  // height is in meters
        }

        // 方法用于计算男性的BMR
        public static double calculateBMRForMen(double weight, double height, int age) {
            return 88.362 + (13.397 * weight) + (4.799 * height) - (5.677 * age);
        }

        // 方法用于计算女性的BMR
        public static double calculateBMRForWomen(double weight, double height, int age) {
            return 447.593 + (9.247 * weight) + (3.098 * height) - (4.330 * age);
        }

        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);

            // 获取用户输入
            System.out.print("请输入您的性别(男/女):");
            String gender = scanner.nextLine();

            System.out.print("请输入您的年龄(岁):");
            int age = scanner.nextInt();

            System.out.print("请输入您的体重(kg):");
            double weight = scanner.nextDouble();

            System.out.print("请输入您的身高(cm):");
            double heightInCm = scanner.nextDouble();

            // 将身高从厘米转换为米
            double heightInMeters = heightInCm / 100;

            // 计算BMI
            double bmi = calculateBMI(weight, heightInMeters);
            System.out.printf("您的BMI是:%.2f\n", bmi);

            // 根据性别计算BMR
            double bmr;
            if (gender.equals("男")) {
                bmr = calculateBMRForMen(weight, heightInCm, age);
            } else if (gender.equals("女")) {
                bmr = calculateBMRForWomen(weight, heightInCm, age);
            } else {
                System.out.println("性别输入错误!");
                scanner.close();
                return;
            }

            // 输出BMR
            System.out.printf("您的BMR是:%.2f\n", bmr);

            // 关闭扫描器
            scanner.close();
        }

System.out.println和System.out.print和System.out.printf的区别详解

在Java中,`System.out.println()`, `System.out.print()`, 和 `System.out.printf()` 都是用来向标准输出流(通常是控制台)打印信息的方法。它们各自有不同的特点和使用场景:

 System.out.println()

- 功能:这个方法会将指定的内容打印到控制台上,并且在内容的末尾自动添加一个换行符。
- 用法:

System.out.println("Hello, world!");

结果:这会在控制台上显示 "Hello, world!" 并跳转到下一行。

 System.out.print()

- 功能:与 `println` 类似,但不会在内容的末尾添加换行符。这意味着后续的输出将会紧跟在这个输出之后,而不是新起一行。
- 用法:

System.out.print("Hello, ");
  System.out.print("world!");

结果:这会在同一行上连续显示 "Hello, world!"。

System.out.printf()

- 功能:这是一个更强大的格式化输出方法,它允许你按照特定的格式来输出数据。它类似于C语言中的`printf`函数。
- 用法:

  int age = 25;
  double height = 1.75;
  System.out.printf("Age: %d, Height: %.2f\n", age, height);

- 格式说明符:
  - `%d` 用于整数
  - `%f` 用于浮点数
  - `%s` 用于字符串
  - `%c` 用于字符
  - `%b` 用于布尔值
  - `%.nf` 中的 `.n` 指定小数点后的位数
 结果:这会在控制台上显示 "Age: 25, Height: 1.75",并且每个数值都按照给定的格式进行显示。

 总结

- 如果你需要简单的输出一些文本并且希望每条输出都在新的一行开始,那么使用 `System.out.println()`。
- 如果你不希望每次输出后都换行,而是想让输出紧跟着前一条输出,那么使用 `System.out.print()`。
- 如果你需要对输出进行格式化,比如控制数字的小数点位数、对齐方式等,那么应该使用 `System.out.printf()`。

这三个方法都是 `PrintStream` 类的一部分,而 `System.out` 是 `PrintStream` 的一个实例,专门用来处理标准输出。

程序流程控制执行

顺序结构-自上而下的执行程序

If分支结构-根据条件的真或假,来决定执行某段代码。

if分支有三种形式

分支结构-根据条件,选择对应的代码执行

switch分支结构-是通过比较值是否相等,来决定执行哪条分支。

switch分支结构的几点注意事项

循环结构-控制某段代码重复的执行

for循环-控制一段代码反复执行很多次

for循环案例:求和

for循环案例:求奇数和

for循环案例:求奇数和-方式二

for循环案例:求水仙花数

如果还要知道水仙花数的个数怎么办?
在循环外定义一个变量count用于记录水仙花数。
每输出水仙花数时,让count++。

While循环

什么时候用for,什么时候用while?

功能上是完全一样的,for能解决的while也能解决,反之亦然。
使用规范:知道循环几次:使用for;不知道循环几次建议使用:while。

复利的力量

While的应用案例

do-while循环

三种循环的使用小结

死循环

可以一直执行下去的一种循环,如果没有干预不会停下来。

循环嵌套-

break、continue

Random生成随机数

Random生成随机数需要几步?

导包:import java.util.Random;
Random r = new Random();
int number = r.nextInt(10);

如何生成 65 – 91之间的随机数?
65 – 91  =>  -65 => (0 - 26)+ 65
int number = r.nextInt(27) + 65;

阶段小案例

简单计算器


    public static void main(String[] args) {
        // 创建Scanner对象以获取用户输入
        Scanner scanner = new Scanner(System.in);

        // 提示用户输入第一个数字
        System.out.print("请输入第一个数字: ");
        double num1 = scanner.nextDouble();

        // 提示用户输入第二个数字
        System.out.print("请输入第二个数字: ");
        double num2 = scanner.nextDouble();

        // 提示用户输入运算符
        System.out.print("请输入运算符 (+, -, *, /): ");
        char operator = scanner.next().charAt(0);

        // 计算并输出结果
        double result;
        switch (operator) {
            case '+':
                result = num1 + num2;
                break;
            case '-':
                result = num1 - num2;
                break;
            case '*':
                result = num1 * num2;
                break;
            case '/':
                if (num2 != 0) {
                    result = num1 / num2;
                } else {
                    System.out.println("错误:除数不能为零。");
                    return; // 结束程序
                }
                break;
            default:
                System.out.println("无效的运算符,请使用 +, -, * 或 /.");
                return; // 结束程序
        }

        // 显示结果
        System.out.printf("%.2f %c %.2f = %.2f\n", num1, operator, num2, result);
    
}

程序说明

  1. 导入Scanner类:用于读取用户的输入。
  2. 创建Scanner对象scanner对象用来从标准输入流中读取数据。
  3. 读取用户输入:分别读取两个数字和一个运算符。
  4. switch语句:根据运算符进行相应的计算。如果运算符是'/'并且第二个数字是0,则会打印一条错误消息并结束程序。
  5. 格式化输出:使用System.out.printf()方法来格式化输出结果,保留两位小数。

猜数字小游戏

 public static void main(String[] args) {
        // 创建一个Random对象来生成随机数
        Random random = new Random();
        // 生成1-100之间的随机整数(包括1和100)
        int targetNumber = random.nextInt(100) + 1;
        
        // 创建Scanner对象以获取用户输入
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("猜数字游戏开始!我已经想好了一个1到100之间的数字。");
        
        // 死循环,直到用户猜中为止
        while (true) {
            // 提示用户输入猜测的数字
            System.out.print("请输入你的猜测:");
            int guess = scanner.nextInt();
            
            // 检查用户输入是否与目标数字匹配
            if (guess < targetNumber) {
                System.out.println("太小了!");
            } else if (guess > targetNumber) {
                System.out.println("太大了!");
            } else {
                // 如果猜中,打印恭喜信息并退出循环
                System.out.println("恭喜你!你猜对了数字 " + targetNumber + "!");
                break; // 结束循环
            }
        }
        
        // 关闭scanner
        scanner.close();
        System.out.println("游戏结束。感谢参与!");
    
}
  • 使用Random类生成了一个1至100之间(含)的随机整数。
  • 通过Scanner类来接收用户的输入。
  • 通过无限循环让玩家可以持续猜测,直到他们正确地猜出那个随机数。
  • 根据玩家的猜测给出相应的反馈:“太大了”或“太小了”,并在玩家猜中后打印祝贺信息并退出循环。

开发一个验证码

1、随机验证码的核心实现逻辑是如何进行的?

定义一个for循环,循环5次。
随机生成0|1|2的数据,依次代表当前要生成的字符是:数字、大写字母、小写字母。
把0、1、2交给switch生成对应类型的随机字符。
在循环外定义一个String类型的变量用来连接生成的随机字符。
循环结束后,返回String类型的变量即是生成的随机验证码。



    // 定义可用字符集:数字 + 大写字母 + 小写字母
    private static final String CHARACTERS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    
    public static void main(String[] args) {
        int length = 6; // 这里设置验证码长度为6位,可以根据需要更改
        String code = generateVerificationCode(length);
        System.out.println("生成的验证码是: " + code);
    }

    /**
     * 生成指定长度的验证码。
     *
     * @param length 验证码长度
     * @return 生成的验证码字符串
     */
    public static String generateVerificationCode(int length) {
        if (length <= 0) {
            throw new IllegalArgumentException("验证码长度必须大于0");
        }
        
        Random random = new Random();
        StringBuilder sb = new StringBuilder(length);

        for (int i = 0; i < length; i++) {
            // 随机选择一个字符
            int index = random.nextInt(CHARACTERS.length());
            char c = CHARACTERS.charAt(index);
            sb.append(c);
        }

        return sb.toString();
    
}
  • CHARACTERS 字符串包含了所有的数字、大写字母和小写字母。
  • generateVerificationCode 方法接收一个整数参数 length 来指定验证码的长度,并返回一个由随机字符组成的字符串。
  • 在主函数中,我们设置了验证码的长度为6个字符,你可以根据实际需求修改这个值。
  • 如果传入的长度小于等于0,则会抛出异常,以确保验证码长度合理。

数组

数组的定义方式二:动态初始化数组

数组的遍历

二维数组

二维数组的访问

二维数组的遍历

面向对象编程

对象本质上是一种特殊的数据结构(可以理解成一张表)。

class也就是类,也称为对象的设计图(或者对象的模板)。

类的基本语法

类的成分:构造器

this关键字

this主要用来解决:变量名称冲突问题的。

在这段代码中,this 是一个关键字,它引用了当前对象实例。在Java中,当你在一个方法内部需要访问当前对象的属性或方法时,可以使用 this 关键字来指代这个对象。

封装

总结:

1、什么是封装?
就是用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去。
面向对象的三大特征:封装、继承、多态。
2、封装的设计规范是什么样的?
合理隐藏,合理暴露。
3、代码层面如何控对象的成员公开或隐藏?
公开成员,可以使用public(公开)进行修饰。
隐藏成员,使用private(私有,隐藏) 进行修饰。

JavaBean——实体类

static

static修饰成员变量

static关键字

总结:

1、static是什么?
叫静态,可以修饰成员变量、成员方法。
2、static修饰的成员变量叫什么? 怎么使用?有啥特点 ?
类变量(静态成员变量)

类名.静态变量(推荐)
对象名.静态变量(不推荐)

属于类,与类一起加载一次,在内存中只有一份,会被类的所有对象共享。
3、无static修饰的成员变量叫什么? 怎么使用?有啥特点 ?
实例变量(对象变量)

属于对象,每个对象中都有一份。     

静态变量的应用场景

1、成员变量有几种?各自在什么情况下定义?
静态变量:数据只需要一份,且需要被共享时(访问,修改)
实例变量:每个对象都要有一份,数据各不同(如:name、score、age)
 
2、访问自己类中的类变量,是否可以省略类名不写?
可以的
注意:在某个类中访问其他类里的类变量,必须带类名访问

static修饰方法

补充知识:搞懂main方法

静态方法的应用

为什么工具类中的方法要用静态方法,而不用实例方法?

1.实例方法需要创建对象来调用,此时对象只是为了调用方法,对象占内存,这样会浪费内存。

2.静态方法,直接用类名调用即可,调用方便,也能节省内存。

多学一招:
工具类没有创建对象的需求,建议将工具类的构造器进行私有。

静态方法,实例方法访问相关的几点注意事项

1.静态方法中可以直接访问静态成员,不可以直接访问实例成员。
2.实例方法中既可以直接访问静态成员,也可以直接访问实例成员。
3.实例方法中可以出现this关键字,静态方法中不可以出现this关键字的。

案例-简易版电影信息展示系统

package com.itheima.demo;

public class Movie {
    private int id; // 编号
    private String name;
    private double price;
    private String actor;

    public Movie() {
    }

    // 定义一个有参数构造器
    public Movie(int id, String name, double price, String actor) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.actor = actor;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getActor() {
        return actor;
    }

    public void setActor(String actor) {
        this.actor = actor;
    }
}
package com.itheima.demo;

import java.util.Scanner;

// 电影操作类
public class MovieOperator {
    private Movie[] movies; // 记住一个电影对象的数组。
    public MovieOperator(Movie[] movies) {
        this.movies = movies;
    }

    // 打印全部电影信息
    public void printAllMovies() {
        System.out.println("================全部电影信息如下===============");
        for (int i = 0; i < movies.length; i++) {
            // i = 0 1 2 3 4 5
            Movie m = movies[i];
            System.out.println( m.getId() + "\t" + m.getName() + "\t" + m.getPrice() + "\t" + m.getActor() + "\t" );
        }
    }

    // 根据id查询电影
    public void searchMovieById() {
        System.out.println("请输入要查询的电影id:");
        Scanner sc = new Scanner(System.in);
        int id = sc.nextInt();
        // 遍历每个电影对象
        for (int i = 0; i < movies.length; i++) {
            // 拿到当前遍历到的电影对象
            Movie m = movies[i];
            // 判断当前电影对象的id是否是我们正在找的电影id,是则打印出该电影信息并立即结束方法
            if (m.getId() == id) {
                System.out.println(m.getId() + "\t" + m.getName() + "\t" + m.getPrice() + "\t" + m.getActor() + "\t" );
                return;
            }
        }
        System.out.println("没有找到该电影");
    }
}
package com.itheima.demo;

public class Test {
    public static void main(String[] args) {
        // 目标:完成面向对象的综合小案例。
        // 1、设计电影类Movie,以便创建电影对象,封装电影数据。
        // 2、封装系统中的全部电影数据。(自己造一些数据)
        Movie[] movies = new Movie[6];
        // movies = [null, null, null, null, null, null]
        //            0     1     2     3     4      5
        movies[0] = new Movie(1, "星际穿越", 9.6, "安妮海瑟薇");
        movies[1] = new Movie(2, "速度与激情8", 9.2, "瑞秋·费尔南多");
        movies[2] = new Movie(3, "夏洛特烦恼", 9.2, "沈腾");
        movies[3] = new Movie(4, "战狼2", 9.2, "吴京");
        movies[4] = new Movie(5, "让子弹飞", 9.2, "姜文");
        movies[5] = new Movie(6, "暗战", 9.2, "王大陆、渣渣辉");

        // 3、创建电影操作对象出来,专门负责电影数据的业务操作。
        MovieOperator mo = new MovieOperator(movies);
        mo.printAllMovies(); // ALT + ENTER
        mo.searchMovieById();
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值