[Java]类和对象

1. 什么是类?

类(Class)是蓝图或者模板。它定义了对象的属性和行为

  • 类就是一种抽象的模板,你可以通过它创建多个对象。
  • 类定义了对象的属性(变量)和行为(方法)。
  • 我们可以把类理解成是一种文字一种方法,通过将这个方法具体应用可以完成很多同类型的具体的事件。这个方法我们叫做类,将这个方法具体应用的过程我们叫做类的实例化,着一个个具体的同类型的按照这个方法操作的事件我们叫做对象。注意:(不是Java里的那个方法,就是我们生活中用来解决问题的方法,此处只是打比方,便于理解)
类的结构:
// 类的定义
class Animal{
//     属性(成员变量)String name;int age;public Animal(String name){this.name = name;}// 行为(方法)void bark() {System.out.println(name + " says woof!");}void eat(){System.out.println(name + "is eating food~");}void sleep(){System.out.println(name + "is sleeping~");}}class Main{public static void main(String args[]){Animal dog = new Animal("dog");dog.bark();dog.eat();dog.sleep();}
}

在这个例子中:

  • Dog 是类的名称。
  • nameage 是属性(变量)。
  • bark() 是方法,它定义了 Dog 对象能做的事情。

2. 什么是对象?

对象是类的实例。你可以把类当做工厂或模板,使用它来生产对象。

猫爪冰棍模具 = 猫爪冰棍类;

用猫爪冰棍模具做出来的冰棍 = 猫爪冰棍对象。

模具只有一个,但是可以做出很多个冰棍,即一个类可以产生很多对象。

  • 对象就是通过类创建出来的具体实体,它拥有类中定义的属性和行为。
  • 是一个模板,它描述了所有同类型对象共有的属性和行为。
  • 对象是类的实例,它具体化了类中定义的属性和行为。
创建对象的方式:
public class Main {public static void main(String[] args) {// 创建一个 Dog 类的对象Dog myDog = new Dog();// 赋值给对象的属性myDog.name = "Buddy";myDog.age = 3;// 调用对象的方法myDog.bark();  // 输出:Buddy says woof!}
}

在这个例子中:

  • myDog 是一个 对象,它是 Dog 类的一个实例。
  • myDog.namemyDog.age 是对象的属性。
  • myDog.bark() 是对象的行为。

3. 如何创建对象?

(类的实例化就是创建对象,把猫爪冰棍模具变成能吃的猫爪冰棍)

3.1 创建对象的语法格式:

  • new 关键字在 Java 中用于创建对象,创建对象时会调用类的构造方法(Constructor)。
  • 每次创建对象时,new 会在内存中分配一块空间给对象。
Dog myDog = new Dog();  // 创建一个 Dog 类型的对象无需向类的构造函数传参的时候的定义格式
类名 对象名 = new 类名();需要通过类的构造函数传递参数的时候给实例对象的成员传参的时候的定义格式
类名 对象名 = new 类名(参数列表);

3.2 创建对象的具体过程:

3.2.1 声明类类型的变量:

声明一个类类型的变量,就是告诉编译器你要使用该类的对象。例如,假设有一个 Dog 类:

class Dog {String name;// 构造方法public Dog(String name) {this.name = name;}// 方法public void bark() {System.out.println(name + " says Woof!");}
}

 声明一个Dog类型的变量:

Dog myDog;

 此时,myDog 只是一个变量,指向 Dog 类型的对象,但并没有指向具体的实例。

3.2.2 使用new关键字创建对象

为了实际创建一个 Dog 类的对象,并让 myDog 变量指向这个对象,你需要使用 new 关键字:

myDog = new Dog("Buddy");

这行代码的作用是:

  • new Dog("Buddy") 创建了一个新的 Dog 类的实例,并调用了构造方法 Dog(String name) 来为这个新对象的 name 属性赋值为 "Buddy"
  • myDog 变量被指向了新创建的 Dog 对象。

3.2.3 调用构造方法

new 关键字不仅创建对象,还会调用类的构造方法来初始化对象。构造方法通常用于设置对象的初始状态,比如给属性赋值。

完整的创建对象过程(示例)

class Dog {String name;// 构造方法public Dog(String name) {this.name = name;}// 方法public void bark() {System.out.println(name + " says Woof!");}
}public class Main {public static void main(String[] args) {// 创建 Dog 类的一个对象,并将其赋值给 myDogDog myDog = new Dog("Buddy");// 调用对象的方法myDog.bark();  // 输出: Buddy says Woof!}
}

关键点总结:

  1. 声明变量Dog myDog; 声明了一个 Dog 类型的变量 myDog,但是它还没有指向任何对象。
  2. 使用 new 创建对象new Dog("Buddy") 创建了一个新的 Dog 对象,并通过构造方法初始化了对象的属性。
  3. 调用构造方法:构造方法 Dog(String name) 设置了 name 属性的初始值。
  4. 通过对象调用方法myDog.bark() 调用了 Dog 类的 bark() 方法。

4. 对象的属性(成员变量)

属性是定义在类中的变量,它描述了对象的状态。每个对象都有自己的属性值。

class Dog {String name;  // name 是属性int age;      // age 是属性
}

在创建对象时,我们可以赋值给这些属性:

Dog myDog = new Dog();
myDog.name = "Buddy";
//通过 对象名.成员变量名 可以用对象里的共有成员变量,给成员变量赋值或者初始化或者改变其值
myDog.age = 3;//也可以通过 对象名.成员方法名(有参数需要传递的话就写,没参数就不用写)  来使用成员方法

5. 对象的方法(成员方法)

方法是定义在类中的函数,描述了对象的行为。方法可以操作对象的属性,也可以执行某些操作。

class Dog {String name;int age;// 方法:行为void bark() {System.out.println(name + " says woof!");}
}

调用方法时,可以通过对象来访问它:

Dog myDog = new Dog();
myDog.name = "Buddy";
myDog.bark();  // 输出:Buddy says woof!    通过 对象名.成员方法名 调用对象的成员方法

6. 构造方法

6.1 定义:

构造方法(Constructor)是 Java 中一种特殊的方法,用于在创建对象时对对象进行初始化。构造方法的主要作用是确保对象在创建时的正确初始化,并且可以为对象设置初始状态。它在创建对象时被自动调用,用于传入参数,用来初始化对象的状态构造方法的名称必须与类名相同。


6.2 构造方法的特点:

  • 名称与类名相同:构造方法的名称必须与类名相同。
  • 没有返回类型:构造方法没有返回值类型(也不需要写 void)。
  • 自动调用:当你创建对象时,构造方法会自动调用。
  • 自动提供默认构造方法:如果你不定义构造方法,Java 会自动提供一个默认的隐式的无参构造方法。
  • 构造方法没有返回类型,并且是对象在创建的时候会被自动调用,且是先于对象中的类的任何方法的。

6.3 构造方法的分类:

6.3.1 默认构造方法:

如果你没有显式定义构造方法,Java 会自动提供一个默认构造方法。默认构造方法没有参数,它什么也不做,仅仅是初始化一个空对象。如果你定义了一个带参数的构造方法,Java 将不再自动提供默认构造方法。

class Dog {String name;int age;// void Dog(){//    //}
//这里有一个什么都没有的构造方法的,系统自己给这个类的,
//但是它是隐式的,平时我们写代码的时候如果不特意写出来的话,
//系统也会默认我们有这个,只是没有显示出来而已
}// 默认构造方法:没有参数
Dog myDog = new Dog();  // 创建对象时,会调用默认构造方法
class Dog {String name;// 定义带参数的构造方法public Dog(String name) {this.name = name;}
}public class Main {public static void main(String[] args) {// Dog dog = new Dog();  // 编译错误,默认构造方法没有提供Dog dog = new Dog("Buddy");  // 正确,调用带参数的构造方法System.out.println(dog.name);  // 输出: Buddy}
}
解释:
  • 因为 Dog 类中已经显式定义了带参数的构造方法 Dog(String name),Java 不会自动生成默认构造方法。
  • 如果没有显式定义任何构造方法,Java 会自动生成一个无参的默认构造方法。

6.3.2 自定义构造方法:

你也可以定义带参数的构造方法来初始化对象:

class Dog {String name;// 构造方法public Dog(String name) {this.name = name;  // 初始化对象的实例变量}
}public class Main {public static void main(String[] args) {Dog dog = new Dog("Buddy");  // 创建对象时调用构造方法System.out.println(dog.name);  // 输出: Buddy}
}

6.4 构造方法重载: (有多个自定义的构造方法)

构造方法是可以重载的,即在同一个类中,可以定义多个构造方法,只要它们的参数列表不同。重载的构造方法允许用不同的参数来初始化对象。

class Dog {String name;int age;// 默认构造方法public Dog() {this.name = "Unknown";this.age = 0;}// 带参数的构造方法public Dog(String name, int age) {this.name = name;this.age = age;}public void displayInfo() {System.out.println("Name: " + name + ", Age: " + age);}
}public class Main {public static void main(String[] args) {Dog dog1 = new Dog();  // 调用默认构造方法dog1.displayInfo();  // 输出: Name: Unknown, Age: 0Dog dog2 = new Dog("Buddy", 3);  // 调用带参数的构造方法dog2.displayInfo();  // 输出: Name: Buddy, Age: 3}
}
解释:
  • Dog() 是一个默认构造方法,没有参数,默认将 name 设置为 "Unknown"age 设置为 0
  • Dog(String name, int age) 是一个带参数的构造方法,用来通过外部提供的值来初始化 nameage
  • main 方法中,创建了两个 Dog 对象,分别调用了不同的构造方法。

构造方法的重载可以让你为对象提供不同的初始化方式,增强代码的灵活性和可重用性。


6.5 构造方法的调用规则:

  • 自动调用:每次通过 new 关键字创建对象时,构造方法会被自动调用。
// 类的定义
class Animal{
//     属性(成员变量)String name;int age;public Animal(String name){this.name = name;System.out.println("构造方法被调用");}void bark(){System.out.println(name + "can bark");}
}class Main{public static void main(String args[]){Animal dog = new Animal("dog");
//在创建对象的时候就会第一时间调用构造方法,
//如果有多个构造方法则程序会根据传入的参数的情况确定要调用哪个构造方法,
//反正只要创建对象就一定会调用构造方法dog.bark();}
}/*
输出:
构造方法被调用
dog can bark
*/

7. 对象初始化:

输出结果:

  • 默认初始化:当对象创建时,实例变量会被自动初始化为默认值,比如 int 类型的变量默认为 0boolean 默认为 false,引用类型的变量默认为 null
  • 显式初始化:在构造方法中,可以显式地初始化实例变量。
  • 就地初始化:在实例变量声明时直接进行初始化。
    class Dog {// 1. 就地初始化(直接在声明时赋值)String name = "Unknown";  // 默认值为 "Unknown"// 2. 默认初始化(没有赋值的实例变量会自动初始化)int age;  // 默认值为 0// 3. 显式初始化(在构造方法中初始化实例变量)boolean isAdopted;// 构造方法:显式初始化实例变量public Dog(String name, int age, boolean isAdopted) {this.name = name;  // 显式初始化this.age = age;    // 显式初始化this.isAdopted = isAdopted;  // 显式初始化}// 打印信息public void displayInfo() {System.out.println("Name: " + name);System.out.println("Age: " + age);System.out.println("Adopted: " + isAdopted);}
    }public class Main {public static void main(String[] args) {// 使用构造方法初始化Dog dog1 = new Dog("Buddy", 3, true);dog1.displayInfo();// 输出:// Name: Buddy// Age: 3// Adopted: true// 使用默认构造方法,name 使用就地初始化,age 使用默认初始化,isAdopted 使用默认初始化Dog dog2 = new Dog("Max", 0, false);dog2.displayInfo();// 输出:// Name: Max// Age: 0// Adopted: false}
    }
    

    解释:

  • 就地初始化

    • String name = "Unknown"; 这是在实例变量声明时直接赋值,称为就地初始化。即在定义变量时就给它一个初始值。
  • 默认初始化

    • int age; 这行代码声明了一个 int 类型的变量,但没有给它显式赋值。在 Java 中,所有的实例变量都会有默认值。对于 int 类型,默认值是 0。因此,即使没有给 age 赋值,它在对象创建时也会自动初始化为 0
  • 当我们创建 dog1 对象时,构造方法会显式初始化实例变量,因此会使用传入的值 "Buddy", 3, true 来初始化 nameageisAdopted
  • 当我们创建 dog2 对象时,由于构造方法中为 age 传入了 0,而 name 使用了就地初始化的值 "Max"isAdopted 使用默认初始化值 false
  • 显式初始化

    • 在构造方法中,使用 this.name = name;, this.age = age;, this.isAdopted = isAdopted; 进行了显式初始化。这种初始化方式通常在构造方法中进行,通过外部传入的值来设置实例变量的值。

8. this 关键字

8.1 定义:

在 Java 中,this 关键字是一个引用,指向当前对象的实例。this 可以用在类的实例方法、构造方法以及内部类中,它有许多用途,主要是区分局部变量和实例变量、引用当前对象、调用构造方法等。

8.2 理解:

8.2.1 区分实例变量和局部变量(或参数)

有时,在方法中,局部变量(或方法参数)和类的实例变量同名,导致代码中看起来不清楚到底是操作局部变量还是实例变量。此时,this 关键字就可以帮助我们区分。

class Dog {String name;  // 实例变量1// 构造方法,参数和实例变量名相同public Dog(String name) {this.name = name;  // this.name 表示实例变量,name 表示构造方法参数
// this.name 指的是当前对象的实例变量,也就是Dog类中注释实例变量1处的变量name,
//而this.name = name;等号右边的name是传参进来的变量name,
//当传入的参数的名字和类中原本定义的变量名字一样的时候我们就会使用到this来区分传入的参数和类本身就有的参数,否则有两个name将会无法区分,代码会报错​}public void displayName() {System.out.println("The dog's name is: " + this.name);  // this.name 引用的是实例变量}
}public class Main {public static void main(String[] args) {Dog dog = new Dog("Buddy");dog.displayName();  // 输出: The dog's name is: Buddy}
}
解释:
  • Dog 类的构造方法中,name 既是构造方法的参数,也是实例变量。
  • this.name 指的是类中的实例变量 name,而 name 单独写时指的是构造方法的参数。
  • 使用 this 可以明确地告诉编译器我们要修改的是实例变量。

8.2.2 引用当前对象

this 关键字还可以用于引用当前对象。也就是说,它表示当前类的对象实例。这对于在实例方法中传递当前对象或返回当前对象时非常有用。

示例:
class Dog {String name;public Dog(String name) {this.name = name;}public Dog getCurrentObject() {
//getCurrentObject() 方法返回的是当前对象,即 this 关键字所代表的对象return this;  // 返回当前对象}public void displayName() {System.out.println("The dog's name is: " + name);}
}public class Main {public static void main(String[] args) {Dog dog = new Dog("Buddy");dog.displayName();  // 输出: The dog's name is: BuddyDog anotherDog = dog.getCurrentObject();  // 获取当前对象anotherDog.displayName();  // 输出: The dog's name is: Buddy}
}
解释:
  • 在上述代码中,thisgetCurrentObject() 方法中返回的是当前对象的引用。当你调用 dog.getCurrentObject() 时,实际上 this 返回的是 dog 本身,并且将其赋值给 anotherDog。这两者 doganotherDog 指向同一个对象

8.2.3 在构造方法中调用其他构造方法(构造方法的链式调用)

this 关键字还可以在构造方法中调用同一个类的其他构造方法。这称为构造方法链式调用。通过这种方式,我们可以在多个构造方法中复用代码,避免重复代码。

示例:
class Dog {String name;int age;// 默认构造方法public Dog() {this("Unknown", 0);  // 调用另一个构造方法,如果还有其他的构造方法,会根据参数确定在中国默认的构造方法中使用this去再调用哪个方法}// 带参数的构造方法public Dog(String name, int age) {this.name = name;this.age = age;}public void displayInfo() {System.out.println("Name: " + name + ", Age: " + age);}
}public class Main {public static void main(String[] args) {Dog dog1 = new Dog();  // 调用默认构造方法dog1.displayInfo();  // 输出: Name: Unknown, Age: 0Dog dog2 = new Dog("Buddy", 3);  // 调用带参数的构造方法dog2.displayInfo();  // 输出: Name: Buddy, Age: 3}
}
解释:
  • Dog 类的默认构造方法 Dog() 中,使用 this("Unknown", 0) 调用了另一个带参数的构造方法。
  • 这就避免了重复的代码:nameage 的赋值只需要写在带参数的构造方法中,其他构造方法可以通过 this() 调用进行复用。

8.2.4 作为内部类引用外部类的实例

在 Java 中,内部类如果需要访问外部类的实例变量或方法时,可以使用 this 来引用外部类的实例。

示例:
class OuterClass {String name = "OuterClass";class InnerClass {String name = "InnerClass";public void printNames() {System.out.println("Outer class name: " + OuterClass.this.name);  // 访问外部类的变量System.out.println("Inner class name: " + this.name);  // 访问内部类的变量}}public static void main(String[] args) {OuterClass outer = new OuterClass();OuterClass.InnerClass inner = outer.new InnerClass();inner.printNames();}
}
解释:
  • OuterClass.this.name 用来引用外部类 OuterClassname 变量。
  • this.name 直接引用内部类 InnerClassname 变量。
  • OuterClass.this 是引用外部类实例的方式,通过它可以访问外部类的成员。

9. 类和对象的生命周期

9.1 类的生命周期

类的生命周期从它的加载开始,到它的卸载结束。在 Java 中,类是由 JVM(Java 虚拟机)加载、管理和卸载的。类的卸载指的是类从 JVM(Java Virtual Machine) 内存中被移除的过程。这是一个由 JVM 类加载器(ClassLoader) 管理的过程,当类不再被使用时,JVM 会将它从内存中卸载,以释放资源。这个过程和类的加载一样,通常是自动管理的,程序员无法直接控制。

类加载(Class Loading)

  • 当一个类首次被使用时,JVM 会加载它。
  • 类的加载由 类加载器(ClassLoader) 负责。类加载的过程包括:
    1. 加载:JVM 查找并加载类的字节码文件(.class 文件)。
    2. 链接:类加载后的字节码会被链接到 JVM 内存中。链接包括验证、准备和解析。
    3. 初始化:类的静态变量和静态代码块会被初始化。

类的卸载

  • 类的生命周期结束时,JVM 会卸载它。
  • 一般情况下,类会在类加载器不再使用时被卸载,但类的卸载通常由 JVM 自动管理,开发者无需手动干预。

9.2 对象的生命周期

对象的生命周期是指对象从创建到销毁的过程。Java 中的对象生命周期由 堆内存(Heap Memory)垃圾回收机制(Garbage Collection) 控制。

对象的创建(Instantiation)

  • 当你使用 new 关键字时,会在 堆内存 中分配空间来创建对象。每次调用 new 都会创建一个新的对象实例。
  • 对象的构造方法会在创建时自动调用,以初始化对象的字段。
示例:对象的创建
class Dog {String name;// 构造方法Dog(String name) {this.name = name;}
}public class Main {public static void main(String[] args) {// 创建一个对象Dog dog = new Dog("Buddy");  // Dog 类的对象在堆内存中创建}
}

对象的使用(Reference)

  • 创建对象后,你可以通过引用变量(如 dog)来访问对象的属性和方法。对象的生命周期管理是由引用变量控制的。
  • 如果有多个引用指向同一个对象,那么该对象仍然存在,直到没有任何引用指向它为止。

对象的销毁(Garbage Collection)

  • 在 Java 中,垃圾回收(GC)负责回收不再使用的对象。对象会在以下情况下被销毁:
    1. 没有引用指向它:当对象不再被任何引用变量引用时,GC 会自动回收它。
    2. 垃圾回收器:Java 会自动运行垃圾回收器来清理没有引用的对象,这个过程是自动的,开发者不需要手动销毁对象。
示例:对象的销毁
public class Main {public static void main(String[] args) {Dog dog = new Dog("Buddy");  // 创建对象// 当 dog 变量不再引用该对象时,Buddy 对象将变成垃圾等待被回收dog = null;  // 取消引用对象,垃圾回收器会销毁该对象}
}

垃圾回收(GC)详细描述

  • 在 Java 中,垃圾回收器(GC)会自动查找和回收无用的对象,释放内存空间。
  • 当对象不再有任何引用指向它时,JVM 会标记该对象为 垃圾,并在下一次垃圾回收时销毁它。

9.3 类和对象生命周期的对比

生命周期阶段对象
加载/创建类在第一次使用时加载到内存使用 new 创建对象,分配内存
使用类在内存中一直存在,直到程序结束对象在内存中存在,直到没有引用指向它
销毁类在程序结束时卸载对象通过垃圾回收机制被销毁

9.4 总结

  • 类的生命周期:从类加载开始,到类卸载结束。类的生命周期由类加载器控制,类的静态变量和静态方法在内存中存在,直到类卸载。

  • 对象的生命周期:从对象创建开始,到对象被垃圾回收结束。对象的生命周期由引用变量控制,垃圾回收机制负责销毁不再使用的对象。

10. 类和对象的区别总结

  • 是一个模板,用来创建对象,它描述了对象的属性和行为。
  • 对象是类的实例,是通过类创建出来的具体实体。

总结

  • 是描述一组对象共有特征的模板。
  • 对象是通过类创建出来的实例,拥有类中定义的属性和行为。
  • 创建对象时,使用 new 关键字,调用构造方法。
  • 对象的属性描述它的状态,方法描述它的行为。
  • 通过构造方法初始化对象的状态,可以用 this 关键字来区分实例变量和局部变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/66404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win32汇编环境,窗口程序中基础列表框的应用举例

;运行效果 ;win32汇编环境,窗口程序中基础列表框的应用举例 ;比如在窗口程序中生成列表框,增加子项,删除某项,取得指定项内容等 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;以下是ASM文件 ;>>>>>>>>>>>…

【机器学习实战入门】使用LSTM机器学习预测股票价格

机器学习在股票价格预测中有重要的应用。在这个机器学习项目中,我们将讨论如何预测股票的收益。这是一个非常复杂的任务,充满了不确定性。我们将会把这个项目分成两部分进行开发: 首先,我们将学习如何使用 LSTM 神经网络预测股票…

使用C语言实现栈的插入、删除和排序操作

栈是一种后进先出(LIFO, Last In First Out)的数据结构,这意味着最后插入的元素最先被删除。在C语言中,我们可以通过数组或链表来实现栈。本文将使用数组来实现一个简单的栈,并提供插入(push)、删除(pop)以及排序(这里采用一种简单的排序方法,例如冒泡排序)的操作示…

wx030基于springboot+vue+uniapp的养老院系统小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

计算机网络常见协议

目录 OSPF(Open Shortest Path First) NAT(Network Address Translation) ICMP (Internet Control Message Protocol) HTTPS(SSL/TLS加密) HTTPS协议 1. 对称加密 2. 非对称加密 3. 证书验证 4. 回顾https协议传输流程 HTTP TCP UDP 1. TCP&a…

静态综合路由实验

实验拓扑 实验要求 1.除R5的环回地址外,整个其他所有网段基于192.168.1.0/24进行合理的IP地址划分 2.R1-R4每个路由器存在两个环回接口,用于模拟pc网段;地址也在192.168.1.0/24这个网络范围内 3.R1-R4上不能直接编写到达5.5.5.0/24的静态路由…

左神算法基础提升--4

文章目录 树形dp问题Morris遍历 树形dp问题 求解这个问题需要用到我们在基础班上学到的从节点的左子树和右子树上拿信息的方法。 求最大距离主要分为两种情况:1.当前节点参与最大距离的求解;2.当前节点不参与最大距离的求解; 1.当前节点参与最…

[计算机网络]一. 计算机网络概论第一部分

作者申明&#xff1a;作者所有文章借助了各个渠道的图片视频以及资料&#xff0c;在此致谢。作者所有文章不用于盈利&#xff0c;只是用于个人学习。 1.0推荐动画 【网络】半小时看懂<计算机网络>_哔哩哔哩_bilibili 1.1计算机网络在信息时代的作用 在当今信息时代&…

【C++】如何从源代码编译红色警戒2地图编辑器

【C】如何从源代码编译红色警戒2地图编辑器 操作视频视频中的代码不需要下载三方库&#xff0c;已经包含三方库。 一、运行效果&#xff1a;二、源代码来源及编程语言&#xff1a;三、环境搭建&#xff1a;安装红警2安装VS2022下载代码&#xff0c;源代码其实不太多&#xff0c…

SSM课设-酒店管理系统功能设计

【课设者】SSM课设-酒店管理系统 分为用户端管理员端 技术栈: 后端: Spring Spring MVC MyBatis Mysql JSP 前端: HtmlCssJavaScriptAjax 功能: 用户端主要功能包括&#xff1a; 登录注册 客房预订 客房评论 首页 管理员端主要功能包括&#xff1a; 会员信息管理 客房信息…

游戏引擎学习第80天

Blackboard&#xff1a;增强碰撞循环&#xff0c;循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改&#xff0c;以便实现一些新的功能。具体来说&#xff0c;是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏&#xff0c;目标是构建一些更丰富…

cuda从零开始手搓PB神经网络

cuda实现PB神经网络 基于上一篇的矩阵点乘&#xff0c;实现了矩阵的加减乘除、函数调用等。并且复用之前元编程里面写的梯度下降、Adam、NAdam优化方法。实现PB神经网络如下&#xff1a; #ifndef __BP_NETWORK_HPP__ #define __BP_NETWORK_HPP__ #include "matrix.hpp&quo…

我的世界-与门、或门、非门等基本门电路实现

一、红石比较器 (1) 红石比较器结构 红石比较器有前端单火把、后端双火把以及两个侧端 其中后端和侧端是输入信号,前端是输出信号 (2) 红石比较器的两种模式 比较模式 前端火把未点亮时处于比较模式 侧端>后端 → 0 当任一侧端强度大于后端强度时,输出…

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(七)

文章目录 一、题库管理模块实现1、新增题目功能实现1.1 页面设计1.2 前端功能实现1.3 后端功能实现1.4 效果展示2、题目列表功能实现2.1 页面设计2.2 前端功能实现2.3 后端功能实现2.3.1 后端查询题目列表接口实现2.3.2 后端编辑试题接口实现2.4 效果展示二、代码下载一、题库管…

打破编程“鄙视链”:探索行业发展新路径

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 打破…

【统计的思想】假设检验(一)

假设检验是统计学里的重要方法&#xff0c;同时也是一种“在理想与现实之间观察求索”的测试活动。假设检验从概率的角度去考察理想与现实之间的关系&#xff0c;籍此来缓解测试可信性问题。 我们先来看一个例子。民航旅客服务系统&#xff0c;简称PSS系统&#xff0c;有一种业…

SpringBoot2 + Flowable(UI)

文章目录 引言I 技术栈软件架构基于 Vue.js 和 Element UI 的后台管理系统工程结构II 依赖rest,logic,conf 的依赖工作流flowable jar包flowable-ui所需jar包III 配置jdbc 配置 nullCatalogMeansCurrent = true引言 I 技术栈 软件架构 前端基于vue 、element-ui框架分模块设…

Linux探秘坊-------3.开发工具详解(1)

1 初识vim编辑器 创建第一个vim编辑的代码 1.新建文件 2.使用vim打开 3.打开默认是命令模式&#xff0c;写代码需要在屏幕上输出“i”字符 1.写完代码后要按Esc键退出到指令模式2.再按shift:wq即可保存并退出vim &#xff08;因为不支持鼠标&#xff0c;通常 使用键盘上的箭…

基于海思soc的智能产品开发(高、中、低soc、以及和fpga的搭配)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 市场上关于图像、音频的soc其实非常多&#xff0c;这里面有高、中、低档&#xff0c;开发方式也不相同。之所以会这样&#xff0c;有价格的因素&am…

51单片机——DS18B20温度传感器

由于DS18B20数字温度传感器是单总线接口&#xff0c;所以需要使用51单片机的一个IO口模拟单总线时序与DS18B20通信&#xff0c;将检测的环境温度读取出来 1、DS18B20模块电路 传感器接口的单总线管脚接至单片机P3.7IO口上 2、DS18B20介绍 2.1 DS18B20外观实物图 管脚1为GN…