yuqi的学习日志

/2026-4-28

equals方法的用法

与== 的区别

用于判断 int 等类型是否相等
判断 引用类型时是判断两者的内存地址是否相等
equals 只能判断引用类型,且判断的是引用的内容
用法

str1.equals(ste2)

this关键字

使用变量有就近原则(局部变量,成员变量,谁近用谁)
用于当局部变量和成员变量重名时进行区分
用法:
this.成员变量

构造方法

作用:在创建对象的时候给成员进行初始化

特点:

  1. 方法名与类名相同,大小写也要一致

  2. 没有返回值类型,连void都没有

  3. 没有具体的返回值(不能由retrun带回结果数据)

执行时机:
4. 创建对象的时候由虚拟机调用,不能手动调用构造方法
5. 每创建一次对象,就会调用一次构造方法

习惯:无论是否使用,都手动书写无参数构造方法,和带全部参数的构造方法

public class Student {
private String name;
private int age;
//构造空参方法
public Student() {
···
}
//
带全部参数构造方法
public Student(String name, int age) {
···
}


Student s1 = new Student();
Student s2 = new Student("3₭E", 23);

英雄VS怪兽

import java.util.Random;  
  
public class fightgame {  
    //设置角色属性  
    public static void main(String[] args) {  
        int heroblood = 500 ;  
        int monsterblood = 300 ;  
        Random r = new Random();  
        int heroattack = r.nextInt(101);  
        int monsterttack = r.nextInt(151);  
          while (true){  
              //怪兽先攻击  
              if (heroblood!= 0){  
                  heroblood= Math.max(heroblood - monsterttack, 0);//英雄剩余血量=原来血量-怪兽攻击力,最小值为0  
                  System.out.println("怪兽攻击英雄"+monsterttack+"点伤害"+",英雄剩余"+heroblood+"点血");  
              }  
              else {  
                  System.out.println("英雄被打败");  
                  break;              }  
              if (monsterblood != 0 ){  
                  monsterblood= Math.max(monsterblood - heroattack, 0);//怪兽剩余血量=原来血量-英雄攻击力,最小值为0  
                  System.out.println("英雄攻击怪兽"+monsterttack+"点伤害"+",怪兽剩余"+heroblood+"点血");  
              }  
              else {  
                  System.out.println("怪兽被打败");  
                  break;              }  
          }  
    }  
}

图书馆借还书
1.定义图书的属性

//定义图书类  
public class Book {  
    //属性  
    private String title ;  
    private String author ;  
    private boolean isBrowwered;//是否被借走  
    //构造方法  
    public Book(String title, String author) {  
        this.title = title;  
        this.author = author;  
        this.isBrowwered = false;  
    }  
    public String getTitle() {  
        return title;  
    }  
    public void setTitle(String title) {  
        this.title = title;  
    }  
    public String getAuthor() {  
        return author;  
    }  
    public void setAuthor(String author) {  
        this.author = author;  
    }  
    public boolean isBrowwered() {  
        return isBrowwered;  
    }  
    public void setBrowwered(boolean browwered) {  
        isBrowwered = browwered;  
    }  
}

2.定义显示图书状态,借书,还书的方法

import java.util.Scanner;  
public class Browwer {//借书  
    private static  Book [] books ;  
    static {  
        //静态变量初始化  
        books  = new Book[10]; //10, null  
        for (int i = 0; i <books.length ; i++) {  
            books[i] = new Book("图书" + (i+1), "作者"+(i+1));  
        }  
    }  
    //定义展示图书状态的方法  
    public  void  displayBooks(){  
        System.out.println("编号\t图书名称\t作者\t状态\t");  
        for (int i = 0; i < books.length; i++) {  
            Book book = books[i];  
            System.out.println((i+1) + book.getTitle() + "\t" + book.getAuthor()+ "\t" + (book.isBrowwered() ? "已借" : "未借"));  
        }  
    }  
    Scanner scanner = new Scanner(System.in);  
    //借书的方法  
    public void dorrowBook (){  
        System.out.println("请输入你要借书的名称");  
        String title = scanner.next();  
        for (Book book : books){  
            if (book.getTitle().equals(title) ) {  
                if (!book.isBrowwered()) {  
                    book.setBrowwered(true);  
                    System.out.println("借书成功");  
                } else {  
                    System.out.println("书已经被接走,你不能借了");  
                }  
                return;  
                }  
            }  
        }  
        //还书的方法  
    public  void  returnBook(){  
        System.out.println("请输入你要还的书");  
        String title = scanner.next();  
        for (Book book : books){  
            if (book.getTitle().equals(title)){  
                if (book.isBrowwered()){  
                    book.setBrowwered(false);  
                    System.out.println("还书成功");  
                }else {  
                    System.out.println("书未被借走,你不能还");  
                }  
             
 }  
        }  
    }  
    }

3.main方法

import java.util.Scanner;  
public class Main {  
    public static void main(String[] args) {  
        Browwer browwer = new Browwer();  
        while (true){  
            System.out.println("本系统的功能为:"+"1.成列所有图书"+"2.借阅图书"+"3.归还图书"+ "4.退出系统");  
            Scanner scanner = new Scanner(System.in);  
            System.out.println("请输入你要的功能");  
            int no = scanner.nextInt();  
            switch (no){  
                case 1 :  
                    browwer.displayBooks();  
                    break;                case 2 :  
                    browwer.dorrowBook();  
                    break;                case 3 :  
                    browwer.returnBook();  
                    break;                default:  
                    System.out.println("结束系统");  
                    break ;        }  
        if (no == 4) break;  
        }  
    }  
}

2026-4-29

Generate tab*2+enter 简历空参方法

对象在内存中的样子
Student stu=new Student();创建对象的七步:
1 加载class字节码文件
2 申明等号左边的局部变量
3 在堆里面开辟一个空间(对象)
4 给对象中的属性进行默认初始化
5 给对象中的属性进行显示初始化
6 给对象中的属性利用构造方法进行初识化
7 把对象的内存地址赋值给等号左边的变量

方法出栈之后,方法里面的变量全部消失//
如果没有任何地方使用堆里面的对象,那么对象也会从堆里面消失
方法区里面字节码信息一般不会消失,除非关闭虚拟机

把一个对象传递给方法,实际传递的是什么?
传递的是对象的内存地址

当多个变量指向同一个对象的时候,会发生什么?
只要有一个变量修改了对象中的属性
其他变量再次访问就是修改之后的结果了

2026-4-30

static 关键字
static:表示静态,是Java的修饰符,用来修饰(成员变量/成员

static修饰成员变量,叫做静态变量,被该类的所有对象共享

关于static需要重点掌握的内容:
静态变量,被当前类所有的对象共享
共享:
赋值只要赋值一次
只要有一个对象修改了静态变量,其他对象再次访问的时候就是修改之后的结果
调用方法:类加方法名
静态对象是在堆内存中单独开辟了一片空间
静态变量是随着类的加载而加载的,优先于对象出现的

public class test {  
    public static void main(String[] args) {  
        Student s2 = new Student();  
        s2.name = "小王";  
        s2.age = 18;  
        Student.teachername = "罗翔"; //两个对象共享 
  
        Student s1 = new Student();  
        s1.name = "小厉";  
        s1.age = 17;  
  
        System.out.println(s1.name + " " + s1.age + " " + Student.teachername);  
        System.out.println(s2.name + " " + s2.age + " " + Student.teachername);  
    }  
}

2026-5-1

定义静态方法
与静态对象相似,
可以被类中的所有对象调用,
调用的方法:类名+方法名or对象名+方法名

工具类的书写方式
不是用来描述一类事物的,也没有main方法,而是帮我们做一些事情的类
01:类名见名知意
02:私有化构造方法
03:方法定义为静态

屏幕截图 2026-05-01 211222.png
静态的注意事项
1.静态方法只能访问静态变量和其他的静态方法
2.非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态的成员方法
3.静态方法中是没有this关键字

总结:静态只能调用静态,非静态可以调用所有,静态方法无this(原因:静态的变量和方法是随着类建立的,此时对象可能还没有被创建,所以不能访问,非静态是随着对象被建立)

fanal关键字
final:表示最终,不可变。可以修饰变量、类、方法
特点1:只能赋值一次,数据不可变
特点2:名字大写,多个单词下划线隔开
fanal 修饰基本变量,变量变成常量,内容不能修改
fanal修饰引用变量,内存地址不能改变,其中的内容可以改变

2025-5-2

枚举
什么是枚举:枚举是一个特殊的Javabean类,这个类的对象是有限个
所以的枚举项都默认使用 pubilc static fanal 修饰

使用场景:订单的状态、月份、星期、游戏角色职业、会议室预约状态、设备状态 ...


枚举使用的注意事项
1.每一个枚举项,都是该枚举类的对象,每一个对象都是通过构造方法创建出来的
2.枚举项在底层其实就是常量,默认用public static final修饰
3.枚举类的第一行上必须是枚举项,枚举项之间用逗号隔开,以分号作为结尾
4.枚举类的构造方法必须是private修饰,不让外界创建本类的对象
5.编译器会给枚举类新增两个默认存在的方法:values(),valueOf()
values():表示获取本类所有的枚举项
valueOf():表示获取一个指定的枚举项

继承


继承 是类与类之间的一种父子关系,Java中提供关键字extends,用于建立类与类之间的关系

继承的好处
1.可以把多个子类中重复的代码抽取到父类中了,提高代码的复用性
2.子类可以在父类的基础上,增加其他的功能,使子类更强大

2026-5-3

**继承

  1. 什么是继承?
    面向对象三大特征之一,可以让类跟类之间产生父子的关系。

  2. 继承的作用是什么?
    操作:多个子类中重复的代码抽取到父类,子类可以直接使用。
    好处:减少代码冗余,提高代码复用性。

  3. 继承的格式?
    public class 子类 extends 父类{}

  4. 继承后子类的好处?
    好处一:子类可以得到父类的属性和行为,子类可以使用。
    好处二:子类可以在父类的基础上新增其他功能,子类更强大。


    设计类的继承结构时,采取从下往上的顺序,提取类中相同的属性和行为
    Java只支持单继承,不支持多继承,但支持多层继承
    细节一:直接父类和间接父类
    细节二:顶级父类Object

继承中成员的特点
找本类:this
找父类:super

继承中成员方法的特点
同样是抽取共性
同样的就近原则

构造方法

方法的重写
方法的重写:在子类中,把父类的方法再写一遍,方法申明保持一致
使用场景:如果父类的方法不能满足子类的要求了,子类中可以把该方法再重写一遍

方法重写的要注意:
1.如果父类里面的代码,我一行都不想用,此时把子类中的方法体重新完整写一遍即
2.如果父类里面的代码我还想用,此时我只是在父类的基础上再加其他的逻辑,则可以用super调用父类得到一个结果,再去处理


final修饰类为最终类,里面所有的方法不能被重写,也不能被调用
private私有方法、static静态方法、final最终方法不能被重写
final修饰变量、修饰类、修饰方法
final修饰类:这个类现在就是最终类,不能被继承。

2026-5-4

继承结构当中构造方法的小细节:
1.子类构造方法第一行,有一个默认的super(),如果我们没有书写,JVM也会自动加上
2.如果想要访问父类的带参构造,super(参数)必须手动写上,不能省略
3.在创建对象的时候,先执行父类的构造方法,再执行子类的构造方法

public class person {  
    //属性  
    String name;  
    int age;  
    //构造方法  
    public person() {  
        System.out.println("父类的空参构造方法被调用");  
    }  
  
    public person(String name, int age) {  
        this.name = name;  
        this.age = age;  
        System.out.println("父类的有参构造方法被调用");  
    }  
}


this(...); //访问本类中的构造方法

public class student extends  person{  
    int grade;  
    //构造方法  
    public  student(){  
    //在老版本this()要放在第一行,用于设定一个初始值,空参和有参构造不能互相调用,要留给super调用父类
        this(1,"同学",18);  
        System.out.println("子类的空参构造方法被调用");  
    }

2026-5-6

构造方法:不能被子类继承,可以利用super关键字调用

成员变量:可以被子类继承,private私有的也可以,但是私有的无法直接调用

class fu {  
    String name;  
}  
class zi extends fu {  
    String name;  
    public void show() {  
        System.out.println(name+" "+super.name);  
    }  
}  
public class test {  
    public static void main(String[] args) {  
        zi z1 = new zi();  
        z1.name = "张三";  
        z1.show();  
    }  
}//结果是张三 null

成员方法:
1 .虚方法可以被继承(虚方法:就是普通的成员方法,非final、非static、非private修饰的方法。)
2 .final修饰的最终方法不能被继承,可以被调用
3 .static修饰的静态方法不能被继承,可以被调用
4 .private修饰的私有方法不能被继承,不能被调用

方法重写:替换虚方法中的地址

权限修饰符


作用范围由小到大
(private<空着不写<protected<public)

2026-5-7

多态:事物的多种状态
多态的表现形式 父类类型 对象名称 = 子类对象;
多态的前提:
1.有继承/实现关系(?)
2.有父类的引用指向子类的对象
3.有方法的重写 (可选的)

public class StudentManager {  
    //建立一个方法来注册  
    public void register(Person person){  
    
        System.out.println("姓名为" + person.getName() + "的用户注册成功,账号" + person.getUsername() + ",密码" + person.getPassword());  
        
        person.work();  
    }  
}

多态的好处
好处一:方法中使用父类型作为参数,可接收父类对象+所有子类对象
好处二:如果进行方法重写,利用多态调用方法,
可以调用不同子类中重写的方法

多态调用成员的特点
变量调用: 编译看左边,运行也看左边
方法调用: 编译看左边,运行看右边
多态的弊端:多态下不能使用子类独有的功能


解决这种弊端的方法
类型转换
自动类型转换(从子到父):子类对象赋值给父类类型的变量

强制类型转换(从父到子):子类 对象变量=(子类)父类类型的变量

Person p = new Student();
Student s = (Student)p;
// 注意点:
// 爷爷 爸爸 
// 创建了爸爸的对象,赋值给了爷爷类型
//在进行强制类型转换的时候,只能转到爸爸类型,不能转成儿子类型
Ye y = new Fu();
// 判断一下,y是不是父类类型的
if(y instanceof Fu){
Fu ff = (Fu)y;
ff.fuShow();
ff.show();
}else{
System.out.println("请确定好类型,再进行转换”);
}

2026-5-8

多态的练习题

// 行为:行驶交通工具(能使用所有交通工具)

public void drive( @NotNull Vehicle vehicle){ no usages
// 表示当前的交通工具正在行驶
vehicle.move();
// 响铃,鸣笛
// 判断一下传递过来是不是自行车
if(vehicle instanceof Bicycle){
Bicycle b = (Bicycle)vehicle;
b.ringBell();
}else if(vehicle instanceof Car){
Car c = (Car)vehicle;
c.honk();
}else{
System.out.println("没有这个类型”);
}
  1. 什么是多态?
    事物的多种形态

  2. 多态的好处?
    好处一:方法中,使用父类型作为参数,可以接收所有子类对象
    好处二:根据传递不同的对象,调用子类不同的方法

  3. 多态的弊端是什么?
    不能使用子类的特有功能

  4. 引用数据类型的类型转换,有几种方式?
    自动类型转换、强制类型转换

  5. 强制类型转换能解决什么问题?强制类型转换需要注意什么?
    ● 可以转换成真正的子类类型,从而调用子类独有功能
    ● 转换类型与真实对象类型不一致会报错
    ● 转换的时候用instanceof关键字进行判断

抽象类和抽象方法
抽象方法:
将共性的行为(方法)抽取到父类之后。因为每一个子类的方法体是不一样,所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。
public abstract 返回值类型 方法名(参数列表);

抽象类: 如果一个类中存在抽象方法,那么该类就必须声明为抽象类
public abstract class 类名{ .. }

public abstract class Animal {  
    //属性  
    private String name;  
    private String color;  
    //抽象方法  
    public abstract void eat();  
    //行为  
    public void drink(){  
        System.out.println("喝水");  
    }

注意点:1. 抽象类不能实例化
2. 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
3. 抽象类中可以有构造方法
4. 抽象类的子类,要么重写抽象类中的所有抽象方法,要么子类也是抽象类

2026-5-9

接口
接口就是一个规则,而且是独立于继承体系以外的规则。(可以理解为干爹)
格式:关键字interface来定义
使用:接口和类之间的是实现关系,通过implements关键字表示

public class 类名implements 接口{ .. }

public interface 接口名{ .. }

注意点1:接口不能实例化
注意点2:接口的子类(实现类),要么重写接口中所有的抽象方法,要么实现类是一个抽象类
注意点3:一个类可以实现多个接口,也可以在继承一个类的同时,实现多个接口
public class 类名implements接口1,接口2{ ... }

public class 类名extends 父类implements 接口1,接口2{ .. }


接口中成员的特点
成员变量:只能是常量。默认修饰符:public static final
构造方法:没有
成员方法:只能是抽象方法。默认修饰符:public abstract

JDK7以前:接口中只能定义抽象方法
JDK8的新特性:接口中可以定义有方法体的方法
JDK9的新特性:接口中可以定义私有方法


接口与类的关系
类和类的关系
继承关系,只能单继承,不能多继承,但是可以多层继承

类和接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口

接口和接口的关系
继承关系,可以单继承,也可以多继承

如果一个类实现了多个接口,那么就要重写多个接口中所有的抽象方法
注意点:
1.如果父类Person也是一个抽象类的话,那么在子类当中,需要把所有的抽象方向进行抽象,要么子类本身也是一个抽象类
2.如果多个接口中出现了重复的抽象方法,此时我们只要重写一次就可以了

接口和接口的关系
继承关系,可以单继承,也可以多继承
注意点:

  1. 如果有一个接口A继承了多个挖口,此时相当于是把多个接口中的抽象方法全部继承下来了,在以后,实现类实现接口A的时候,就要把所有的抽象方法进行重写

2026-5-10

JDK7及以前:
接口中只能定义抽象方法


JDK8新特性:
为了接口升级时向下兼容,接口中可以定义有方法体的方法(默认、静态)
● 允许在接口中定义默认方法,需要使用关键字default修饰
作用:为了接口升级时,代码不报错

接口中默认方法的定义格式:
● 格式:public default 返回值类型 方法名(参数列表){}
● 范例:public default void show(){ }

// 新增默认的方法
// public default 返回值类型 方法名(形参){方法体

public default void function(){ no usages
System.out.println(“接口中新增的默认方法~”);

}

接口中默认方法的注意事项:
● 默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字

@Override no usages
public void method2() {
System.out.println("实现类重写的method2方法~”);
}

● public可以省略,default不能省略
● 如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写

接口中静态方法的定义格式:
● 格式:public static 返回值类型 方法名(参数列表){}
● 范例:public static void show(){ }

接口中静态方法的注意事项:
虚方法表
非static 非final 非private
只有虚方法表里面的方法才能够被重写,方法重写的实际意义就是替换了虚方法表中记录方法的内存地址

● 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用,

● public可以省略,static不能省略


JDK9新特性:
为了抽取默认方法和静态方法中重复代码而出现的

● 格式1:private返回值类型 方法名(参数列表){
● 范例1 :private void show(){ }
}

● 格式2:private static 返回值类型 方法名(参数列表){}
● 范例2:private static void method(){
}

2026-5-11

  1. 什么是内部类?
    写在一个类里面的类就叫做内部类

  2. 什么时候用到内部类?
    一个类表示的事物是另一个类的一部分,且单独存在没有意义
    比如:汽车的发动机,人的心脑等等

  3. 内部类的分类?
    成员内部类,静态内部类,局部内部类,匿名内部类。

public class Carr{
	String carBrand;//汽车的品牌
	int carAge; // 车龄 
	String carColor;// 颜色 
	class Engine{ no usages
		String engineBrand;// 发动机的品牌 
			nt engineAge;// 使用年限 
	}
}

成员内部类(了解)
写在成员位置的,属于外部类的成员
成员内部类可以被一些修饰符所修饰,比如:private,默认,protected,public,static等

在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量

获取成员内部类对象的两种方式?
方式一:当成员内部类被private修饰时。
在外部类编写方法,对外提供内部类对象

public class Outer {
	String name;
	private class Inner{
	static int a = 10;
	}

	public Inner getInstance(){
	return new Inner();
}

方式二:当成员内部类被非私有修饰时,直接创建对象。

格式:外部类名.内部类名 对象名=外部类对象.内部类对象;
范例:Outer.Inner oi = new Outer().new Inner();

当外部类和内部类重名的时候怎么办

public class Outer {
	private int a = 10;

	class Inner {
		private int a = 20;

		public void show() {
		int a = 30;
		System.out.println(a); //30
		System.out.println(this.a); //20
		//Outher.this 获取了外部类对象的地址值
		System.out.println(Outer.this.a);//10
		}
	}
}

屏幕截图 2026-05-11 174546.png


静态内部类
一种特殊的成员内部类

  1. 静态内部类只能访问外部类中的静态变量和静态方法

  2. 如果在静态内部类中,想要访问外部类非静态的内容,需要创建外部类的对象

创建静态内部类的对象:
外部类名.内部类名 对象名=new 外部类名.内部类名();

Outer. Inner oi = new Outer. Inner();

调用静态内部类中非静态方法的格式:
先创建对象,用对象调用

调用静态内部类中静态方法的格式:
外部类名.内部类名.方法名();


局部内部类

  1. 将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。

  2. 外界是无法直接使用,需要在方法内部创建对象并使用。

  3. 该类可以直接访问外部类的成员,也可以访问方法内的局部变量。


匿名内部类
隐藏了名字的内部类,可以写在成员位置,也可以写在局部位置

作用:在继承一个类或者实现一个接口的时候少写一个文件,也是lambda的前置知识点

使用场景
如果实现类只要使用一次,就可以用匿名内部类简化代码

匿名内部类的定义格式=没有名字的java类+继承/实现+重写方法+创建对象
最终格式可以理解为:是一个没有名字的java类的对象

//new 类名或者接口名(){
//重写方法;
//}; 

new Inter() {
public void show() { ... };
};
public static void main(String[] args) {  
    //在测试类中调用  
     Swim s = new Swim(){  
        @Override  
        public void swim() {  
            System.out.println("匿名内部类实现接口");  
        }  
    };  
    goswimming(s);  
}

2026-5-12

{  
    public static void main(String[] args) {  
  
        CheckOrder order1 = new CheckOrder(0001,"待派送");  
        CheckOrder order2 = new CheckOrder(0002,"待派送");  
        CheckOrder order3 = new CheckOrder(0003,"待派送");  
  
        CheckOrder [] orders =  {order1,order2,order3} ;  
        Deliver delivery1 = new Deliver("丽水","外卖员") ;  
        Deliver delivery2 = new Deliver("装三","外卖员") ;  
        Waiter waiter1 = new Waiter("王五","服务员");  
        Scanner scanner = new Scanner(System.in);  
        System.out.println("----外卖配送系统-------");  
        System.out.println("1.查询订单");  
        System.out.println("2.配送订单");  
  
        int count = orders.length;  
        while (true){  
            System.out.println("请输入你要的功能");  
           int input = scanner.nextInt();  
           switch (input){  
               case  1 :  
                   for (int i = 0 ; i < orders.length ; i++){  
                       CheckOrder order = orders[i];//获取订单  
                       order.show();  
                       if (order.getState().equals("配送中")){  
                           System.out.println("配送员信息:");  
                           // 调用配送员信息  
                           order.getPerson().show();  
                       }  
                   }  
                   break;  
                   case  2 :  
                       if (count == 0){  
                           System.out.println("没有订单了");  
                       }  
                       else {  
                           delivery1.deliver(orders[0]);//调用配送  
                           count--;  
                           delivery2.deliver(orders[1]);  
                           count--;  
                           waiter1.deliver(orders[2]);  
                           count--;  
                           break;                       }  
                       case 3 :  
                           System.out.println("退出系统");  
                           System.exit(0);  
                           break;  
                       default:  
                               System.out.println("输入错误");  
                               break;           }  
        }  
        }  
    }
public class Waiter extends Person implements Delverable{  
    public Waiter() {  
    }  
  
    public Waiter(String name, String job) {  
        super(name, job);  
    }  
  
    @Override  
    public void deliver(CheckOrder order){  
        order.setState("配送中");  
        order.setPerson(this);  
        System.out.println(getJob()+getName()+ "正在配送订单编号为:"+ order.getId()+"的订单");  
    }  
  
    @Override  
    public void show() {  
        System.out.println(getJob()+ getName());  
    }  
}

2026-5-13

API:就是JDK提供的各种功能的Java类,即应用程序编程接口
API帮助文档:帮助开发人员更好的使用API和查询API的一个工具。
如何使用API帮助文档
1 打开API帮助文档
2 点击显示,并找到索引下面的输入
3 在输入框中输入类名并点击显示
4 查看类所在的包
5 查看类的描述
6 查看构造方法
7 查看成员方法

package APIdemo;  
//引入Random类,导包  
//扩展:在什么情况下,我不需要导包?  
//情况一:如果使用本包中的类  
//情况二:如果使用java.lang(核心)包下的类  
import java.util.Random;  
  
public class Test {  
    public static void main(String[] args) {  
        //查看api帮助文档,使用Random类获取随机小数的方法  
        Random random = new Random();  
        Double d = random.nextDouble();  
    }  
}

2026-5-14

#String概述

String类,定义在java.lang包下,无需导包。Java中的所有字符串文字(例如“abc")都为此类的对象
注意点:
字符串的内容是不可变的,它的对象在创建后不能被更改

创建String对象的方法

//第一种:直接赋值  
//第二种:new关键字  
//public String()  //空白字符串,不含任何内容  
//        //public String(String original)   //根据传入的字符串,创建新的字符串对象  
//        //public String(char[] chs)    //根据字符数组,创建字符串对象  
//        //public String(byte[] chs)     //根据字节数组,创建字符串对象  
  
//第一种:直接赋值  
String s1 = "hello";  
System.out.println(s1);  
//第二种:new + 空参数构造  
String s2 = new String();  
System.out.println("--"+ s2 + "@@");  
//第三种:new + 字符数组参数构造  
char[] chs = {'a', 'b', 'c'};  
String s3 = new String(chs);  
System.out.println(s3);  
//第四种:new + 字节数组参数构造  
byte[] bytes = {97, 98, 99};  
String s4 = new String(bytes);  
//Ascii码表 97--a 98--b 99--cSystem.out.println(s4);

2025-5-15

字符串比较
● boolean equals方法(要比较的字符串)
完全一样结果才是true,否则为false,比较的是内容

// 字符串比较的两个方法
// 第一个方法:equals方法完全一致
String username = "zhangsan";
String rightUsername = "Zhangsan";
boolean b1 = username.equals(rightUsername);
System.out.print1n(b1);

● boolean equalsIgnoreCase(要比较的字符串)
忽略大小写的比较

// 字符串比较的两个方法
	// 第二个方法:equalsIgnoreCase忽略大小写的比较 
String username = "zhangsan";
String rightUsername = "Zhangsan";//改变了大小写
boolean b1 = username.equalsIgnoreCase(rightUsername);
System.out.print1n(b1);

== 对引用类型比较的是其内存地址

//已知正确的用户名和密码  
String rightName = "张三";  
String rightPwd = "123456";  
  
Scanner sc = new Scanner(System.in);  
  
//总共给三次机会  
for (int i = 1; i <= 3; i++) {  
    //用程序实现模拟用户登录  
    System.out.println("请输入用户名");  
    String name = sc.next();  
    System.out.println("请输入密码");  
    String pwd = sc.next();  
    //判断用户输入的用户名和密码是否正确  
    boolean flag = rightName.equals(name)&&rightPwd.equals(pwd);  
    if (flag){  
        System.out.println("登录成功");  
        break;    }  
    else{  
        if (i <= 2){  
            System.out.println("登录失败,还剩"+ (3-i)+"次机会");  
        }  
        else{  
            System.out.println("登录失败,已无登录机会");  
        }  
    }

遍历字符串
● public char charAt(int index):根据索引返回字符

// 1. charAt
String str ="你好你好123";
char c = str.charAt(7);
System.out.println(c);

● public int length():返回此字符串的长度
● 数组的长度:数组名.length
● 字符串的长度:字符串对象.length()

// 2. length
int len = str.length();
System.out.println(len);

练习

Scanner sc = new Scanner(System. in);
System.out.println("请输入一个字符串:”);
String s = sc.next();
// 字符串遍历中循环的快速生成方式 s.length().fori
for (int i = 0; i < s.length(); i++) {
char cc = s.charAt(i);
System.out.println(cc);

}

2026-5-16

String substring(int beginIndex, int endIndex)
注意点:包头不包尾,包左不包右
只有返回值才是截取的小串

//定义一个字符串
String str = "abcdefg";
// 截取
// 第一个参数:截取的开始索引
// 第二个参数:截取的末尾索引
// 包头不包尾,包左不包右 ---- >包含1索引,但是不包含5索引 1234
// 字符串本身一旦创建之后,是无法发现改变的,截取的时候不会影响调用者的字符串,切记:只有返回值才是截取之后的结果
String res = str.substring(1,5);
System.out.println(res);// bcde

String substring(int beginlndex)
截取到末尾

// 参数:截取的开始索引,默认是截取到字符串的末尾
// 字符串本身一旦创建之后,是无法发现改变的,截取的时候不会影响调用者的字符串,切记:只有返回值才是截取之后的结果
String res2 = str.substring( beginlndex: 1);
System.out.println(res2);// bcdefg
//练习:保留用户名的第一个字符,剩余字符用*代替  
String name = "张三丰";  
//charAt(int index)  
char fristchar = name.charAt(0) ;  
String newName = fristchar +  "***" ;  
System.out.println(newName);  
//substring(int start,int end)  
String substring = name.substring(0, 1);  
String newName2 = substring + "***" ;  
System.out.println(newName2);

敏感词过滤
● String replace(旧值,新值)替换
注意点:只有返回值才是替换之后的结果

● subString截取:截取固定位置的数据
●replac替换:位置不确定,替换指定内容

// 定义字符串
String str=“你玩的好菜呀,TMD";

// 替换
// 第一个参数:被替换的数据
// 第二个参数:用来替换的数据
//只有返回值才会替换之后的结果
String res = str.replace( target: "TMD", replacement: " *** ");

System.out.println(res);

练习

//1. 定义一个敏感词库
String[] arr = {"TMD", "SB", "NMD","LJ"};

//2. 键盘录入你说的话
System.out.println(“请输入你想说的话:”);
String msg = sc.next();

// 3. 替换敏感词
for (int i = 0; i < arr.length; i++) {
// arr[i]:依次表示数组当中每一个敏感词
msg = msg.replace(arr[i], replacement: " *** ");
}
Svstem.out.println(msg)

其他常用Sting API

String str = "abcdefg";
//是否包含
boolean b = str.contains("abd");
System.out.println(b);

// 判断开头、结尾
// 判断文件的后缀名
// 判断str是否以bc作为开头
boolean b2 = str.startsWith("bc");
// 判断str从1索引开始,是否以bc开头
boolean b3 = str.startsWith( prefix: "bc", toffset: 1);
System.out.print1n(b2);
boolean b4 = str.endsWith(".txt");
System.out.println(b4);

lastIndexOf(int ch)
//查找当前字符/字符串 第一次出现的索引,如果当前要查找的内容不存在,方法会返回-1
int i1 = str.index0f(97);
System.out.println(i1);// 0
int i2 = str.lastIndexOf( ch: 97);
System.out.print1n(i2);// 4

int i3 = str.indexOf("A");
System.out.print1n(i3);// -1

// 判断是否为空
boolean empty1 = str.isEmpty();
System.out.print1n(empty1);// false

String str2 = "";
boolean empty2 = str2.isEmpty();
System.out.print1n(empty2); //ture

lastIndexOf(int ch)
//查找当前字符/字符串 第一次出现的索引,如果当前要查找的内容不存在,方法会返回-1
int i1 = str.index0f(97);
System.out.println(i1);// 0
int i2 = str.lastIndexOf( ch: 97);
System.out.print1n(i2);// 4

int i3 = str.indexOf("A");
System.out.print1n(i3);// -1

// 判断是否为空
boolean empty1 = str.isEmpty();
System.out.print1n(empty1);// false

String str2 = "";
boolean empty2 = str2.isEmpty();
System.out.print1n(empty2); //

// 转字符数组  toCharArray()
//"abc" -- >0索引 改为A
// "abcdaefg" ---- > ['a', 'b', 'c','d','a','e','f','g']
char[] array = str. toCharArray();
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}

//大小写转换 toUpperCase(),toLowerCase()
// abcde ...
String upperCase = str.toUpperCase();
System.out.println(upperCase); // ABCDAEFG

//去除头尾空格 tim()
// 登录注册
String str3 = " a b c ";
String trim = str3.trim();
System.out.println(trim);//a b c
/

2026-5-17

StringBuilder:是字符串的一个工具类,可以让我们拼接字符串的时候效率更高


//正常方式,需要的实践太长了,大概要三分钟
String s = "";
for (int i = 0; i < 1000000 i++) {
s = s + "abc";
System.out.println(s);

//StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000000; i++) {
sb.append("abc");
System.out.println(sb);
}

StringBuilder的构造方法:
public StringBuilder() 空参构造
public StringBuilder(String str) 带参构造

// 1. 创建 StringBuilder的对象(容器)空参构造
StringBuilder sb1 = new StringBuilder();
System.out.println(" --- " + sb1 + "@e@");
int len = sb1.length();//获取长度
System.out.println(len);

//2. 创建 StringBuilder的对象(容器) 带参构造
StringBuilder sp2 = new StringBuilder("abc");
System.out.println(sb2);

StringBuilder的常见成员方法:
append(任意类型) 添加数据
reverse() 反转
int length() 获取长度
toString 变回字符串

StringBuilder sb2 = new StringBuilder("abc");
sb2.reverse();//反转
sb2.append("aaa");//添加
	String res = sb2.toString();//变回String
System.out.println(res);

2025-5-18

数据库多表查询
join 内查询
join + 表名 on 表名.字段名 = 表名.字段名
left join 左查询
left join + 表名 on 表名.字段名 = 表名.字段名
cross join 交叉查询 用的不多

2025-5-19

字符串反转

Scanner sc = new Scanner(System. in);
while (true) {
// 1.键盘录入字符串
System.out.println("请输入一个字符串:”);
String str = sc.next(); // 123

// 2.判断
if(str.equals("拜拜")){
// 程序停止运行
System.out.println("欢迎使用本系统,期待与您的下次见面~”);
break;
}else{
// 反转
StringBuilder sb = new StringBuilder(str);
sb.reverse();
String res = sb.toString();
System.out.println(res);

截取

// 1. 键盘录入任意字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入任意字符串:”);
String str = sc.next();

// 2. 直接在str的后面补0
// abcdabcda
// 计算最后一行有多少个字符
int lastLineCount = str.length() % 8; // 9 % 8 = 1
// 计算最后一行补多少个0
int count = 8 - lastLineCount; // 8 - 1 = 7
// 补0
if(count != 0){
// 获取最后一行补的0
String line = "00000000".substring(0, count);
// 把最后一行补的0拼接到字符串的后面
str = std + line;
}
// System.out.println(str);
// 3. 每8个打印一行
// abcdabcd
// i+=8:第一行:0索引开始
第二行:8索引开始
for (int i = 0; i < str.length(); i += 8) {
// 每8个截取一次
String res = str.substring(i, i + 8);
// 打印
System.out.println(res);
}

打乱字符串

//1.定义一个字符串
String str = "abcd";

// 2.把字符串str变成字符数组
char[] arr = str. toCharArray();

// 3.打乱字符数组arr中的内容
Random r = new Random();

for (int i = 0; i < arr.length; i++) {
// 获取一个随机的索引
int index = r.nextInt(arr.length);
// 依次得到数组中的每一个字符,跟随机索引上的字符进行位置交换
char temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}

// 4.把打乱之后的字符数组转回字符串
String result = new String(arr);

System.out.println(result);


yuqi的学习日志
https://wlw301.top//archives/KsJeexXK
作者
yu'qi
发布于
2026年04月29日
更新于
2026年05月19日
许可协议