当前位置: 首页 > news >正文

Java—继承性与多态性

目录

一、this关键字

1. 理解this

2. this练习

二、继承性

2.1 继承性的理解

2.1.1 多层继承

2.2 继承性的使用练习

2.2.1 练习1

2.2.2 练习2

2.3 方法的重写

2.4 super关键字

2.4.1 子类对象实例化

三、多态性

3.1 多态性的理解

3.2 向下转型与多态练习

四、Object类

4.1 clone()

4.2 equals()

4.3 toString()


一、this关键字

1. 理解this

在声明一个属性对应的 setXxx 方法时,如果形参名与属性名相同,可以使用 this 来区分它们。使用 this 修饰的变量表示属性,而不带 this 的变量表示形参。

this可调用的结构:成员变量、方法、构造器

理解: 当前对象(在方法中调用时)或当前正在创建的对象(在构造器中调用时)

注意:如果方法的形参与对象的属性同名了,我们必须使用"this. "进行区分。使用this.修饰的变量即为属性(或成员变量)没有使用this.修饰的变量,即为局部变量。

this调用构造器

  • 格式: "this (形参列表)"
  • 我们可以在类的构造器中,调用当前类中指定的其它构造器
  • 要求:"this (形参列表) "必须声明在当前构造器的首行
  • 结论: "this (形参列表) "在构造器中最多声明一个
  • 如果一个类中声明了n个构造器,则最多有n- 1个构造器可以声明有" this (形参列表) "的结构

2. this练习

Account-Customer-Bank 练手

UML类图:

  

//Account类
public class Account {private double balance;public Account(double init_balance){this.balance = init_balance;}public double getBlance(){return balance;}//存钱public void deposit(double amt){if (amt > 0) {balance += amt;System.out.println("成功存入" + amt);}}//取钱public void withdraw(double amt){if (amt >= amt && amt > 0) {balance -= amt;System.out.println("成功取出" + amt);}else{System.out.println("余额不足");}}}//Customer类
public class Customer {private String firstname;private String lastname;private Account account;public Customer(){}public  Customer(String f,String l){this.firstname = f;this.lastname = l;}public String getFirstname(){return firstname;}public String getLastname(){return lastname;}public Account getAccount(){return account;}public void setAccount(Account acctount){this.account = acctount;}
}
//Bank类
public class Bank {private Customer[] customers;private int numberOfCustomer;public Bank(){customers = new Customer[10];}public void addCustomer(String f,String l) {Customer cust = new Customer(f,l);customers[numberOfCustomer++] = cust;}public int getNumberOfCustomer() {return numberOfCustomer;}public Customer getCustomer(int index){if (index < 0 || index >= numberOfCustomer) {return null;}return customers[index];}
}
//测试
public class BankTest {public static void main(String[] args) {Bank bank = new Bank();bank.addCustomer("备","刘");bank.addCustomer("权","孙");bank.getCustomer(0).setAccount(new Account(1000));bank.getCustomer(0).getAccount().withdraw(900);System.out.println("账户余额为: " + bank.getCustomer(0).getAccount().getBlance());}
}

二、继承性

2.1 继承性的理解

图示:

代码角度:

  • 自上而下:定义一个类A,在定义另一个类B时,功能上两者相似,则考虑B继承于A。
  • 自下而上:定义了类B,C,D,且类B,C,D有类似的属性和方法,则将相同的属性与方法抽取,封装到类A中,让B,C,D继承于类A。类B,C,D中相似的功能删除。

基本概念:

  • 继承(Inheritance):Java通过 extends 关键字实现类之间的继承关系。子类(Subclass)可以继承父类(Superclass)的字段和方法。

基本格式:

class A{

       //属性、方法

}

class B extends A{

}

继承性的好处:

  • 继承的出现减少了代码冗余,提高了代码的复用性。
  • 继承的出现,更有利于功能的扩展。
  • 继承的出现让类与类之间产生了‘is-a’的关系,为多态的使用提供了前提。
  • 继承描述事物之间的所属关系,这种关系是: is-a 的关系。可见,父类更通用、更一般,子类更具体。

图示:

代码:

// 子类:Cat
// 父类:Animal
class Animal {// 属性protected String name;protected int age;// 构造函数public Animal(String name, int age) {this.name = name;this.age = age;}// 方法:获取动物信息public void info() {System.out.println("宠物名: " + name + ", 年龄: " + age);}
}class Cat extends Animal {public Cat(String name, int age) {super(name, age); // 调用父类构造函数}// 子类特有方法:抓老鼠public void catchMouse() {System.out.println(name + "抓老鼠 ");}
}// 子类:Dog
class Dog extends Animal {public Dog(String name, int age) {super(name, age); // 调用父类构造函数}// 子类特有方法:看家public void guardHome() {System.out.println(name + "看家护院 ");}
}public class Test {public static void main(String[] args) {// 创建 Cat 对象Cat cat = new Cat("汤姆", 3);cat.info();         // 输出: Name: Whiskers, Age: 3cat.catchMouse();   // 输出: Whiskers is catching a mouse.// 创建 Dog 对象Dog dog = new Dog("杰森", 5);dog.info();         // 输出: Name: Buddy, Age: 5dog.guardHome();    // 输出: Buddy is guarding the home.}
}

结果:

解释:

  • 由于继承性,子类获取父类中声明的所有属性和方法,但封装性影响,子类并不能直接调用父类中声明的属性或方法。
  • 子类不是父类的子集,而是对父类的 “扩展”
  • 不要为了继承而继承,要判断是否有is a的关键。

默认的父类:没有直接说明其父类,则默认继承java.lang.Object

2.1.1 多层继承

图示:

概念:直接父类,间接父类

格式:

class A{}

class B extends A{}

class C extends B{}

补充:

  • java中子父类的概念是相对的
  • java中一个父类可以声明多个子类,但一个子类只能有一个父类。

2.2 继承性的使用练习

2.2.1 练习1

代码:

//定义子父类
public class ManKind {private int sex;private int salary;public ManKind(){}public ManKind(int salary,int sex ){this.salary = salary;this.sex = sex;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}public void setSex(int sex) {this.sex = sex;}public int getSex() {return sex;}public void manOrWoman() {if (sex == 1) {System.out.println("I am man");}else if (sex == 0) {System.out.println("I am woman");}}public void employed(){if (salary == 0) {System.out.println("I no job");}if (salary != 0) {System.out.println("I have a job");}}
}class Kids extends ManKind{private int yearsOld;public Kids(){}public Kids(int yearsOld){this.yearsOld = yearsOld;}public Kids(int salary,int sex){setSex(sex);setSalary(salary);}public void setYearsOld(int yearsOld) {this.yearsOld = yearsOld;}public int getYearsOld() {return yearsOld;}public void printAge(){System.out.println("I am" +yearsOld +"years old");}
}//代码测试
public class KidsTest {public static void main(String[] args) {Kids kid = new Kids();kid.setSalary(100);kid.setSex(1);kid.setYearsOld(10);kid.employed();kid.manOrWoman();kid.printAge();}
}

结果:

2.2.2 练习2

代码:

public class Circle {private double radius;public Circle(){this.radius = 1;}public void setRadius(double radius) {this.radius = radius;}public double getRadius() {return radius;}public double findArea(){return  3.14 * radius * radius;}
}public class Cylinder extends Circle {private double length;public Cylinder(){this.length = 1;}public void setLength(double length) {this.length = length;}public double getLength() {return length;}public double findVolume(){return findArea() * getLength();}
}
//测试
public class Test {public static void main(String[] args) {Cylinder cy = new Cylinder();cy.setRadius(2.3);cy.setLength(1.4);System.out.println("圆的面积:" + cy.findArea());System.out.println("圆柱的体积:" + cy.findVolume());}
}

结果:

2.3 方法的重写

1 为什么需要方法的重写

  • 子类继承父类后,获取父类中声明的所有方法。但父类中的方法不太适用于子类,此时,子类要对从父类中继承的方法进行覆盖。

2.方法重写是什么?

  • 子类对父类继承过来的方法进行覆盖,覆写的操作。

3.方法重写遵循的规则

  • 父类被重写的方法与子类重写的方法的方法名和形参列表必须相同。
  • 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符。(父类中private类的方法不能被子类重写)

关于返回值类型

  • 父类被重写的方法的返回值为void,子类重写的方法的返回值也要是void
  • 父类被重写的方法的返回值为基本数据类型 / 引用数据类型,子类重写的方法的返回值也必须与被重写的方法的返回值相同 或 是被重写的方法的返回值的子类。

4.使用举例

// 父类:Animal
class Animal {public void sound() {System.out.println("Animal makes a sound");}
}// 子类:Dog
class Dog extends Animal {@Overridepublic void sound() { // 重写父类的 sound 方法System.out.println("狗 汪汪叫");}
}// 子类:Cat
class Cat extends Animal {@Overridepublic void sound() { // 重写父类的 sound 方法System.out.println("猫 喵喵叫");}
}public class Main {public static void main(String[] args) {Animal myDog = new Dog(); // 父类引用指向子类对象Animal myCat = new Cat(); // 父类引用指向子类对象myDog.sound(); // 输出: Dog barksmyCat.sound(); // 输出: Cat meows}
}

方法的重载与重写的区别

重载:“两同一不同”->编译时多态

重写:继承以后,子类覆盖父类中同名同参数的方法->运行时多态

2.4 super关键字

super关键字用于引用父类的属性、方法以及构造函数。

1.当子类重写了父类的方法时,可以使用super来调用父类中的被重写的方法。

class Parent {void display() {System.out.println("This is the Parent class.");}
}class Child extends Parent {void display() {System.out.println("This is the Child class.");}void show() {super.display();  // 调用父类的display方法display();        // 调用子类的display方法}
}public class Main {public static void main(String[] args) {Child child = new Child();child.show();}
}

2.super调用属性,尤其是在子类中有同名属性的情况下。

class Parent {String name = "Parent";void show() {System.out.println("Name: " + name);}
}class Child extends Parent {String name = "Child";void show() {System.out.println("Name: " + name);System.out.println("Parent Name: " + super.name);  // 访问父类的属性}
}public class Main {public static void main(String[] args) {Child child = new Child();child.show();}
}

3.调用父类的构造器,以及方法和属性

// 定义一个父类 Parent
class Parent {String name;// 父类构造函数Parent(String name) {this.name = name;System.out.println("调用父类,父类名称: " + this.name);}// 父类方法void display() {System.out.println("调用父类的display()方法");}
}// 定义一个子类 Child 继承 Parent
class Child extends Parent {String name; // 子类中也有一个同名属性// 子类构造函数Child(String childName) {super("张良"); // 调用父类构造函数this.name = childName; // 初始化子类的属性System.out.println("子类的名称:" + this.name);}// 重写父类方法@Overridevoid display() {super.display(); // 调用父类的 display 方法System.out.println("现在是子类覆盖后自己的display()方法");}// 显示父类和子类的名字void showNames() {System.out.println("子类名: " + this.name);System.out.println("父类名: " + super.name); // 访问父类属性}
}// 主类
public class Test {public static void main(String[] args) {Child child = new Child("张三"); // 创建 Child 类的实例child.display(); // 调用子类的 display 方法child.showNames(); // 调用显示名字的方法}
}

结果:

2.4.1 子类对象实例化

图解:

三、多态性

3.1 多态性的理解

1.理解:一种事物的多种形态。

例:女朋友说“我想养一个宠物”,则宠物就可以理解为:猫,狗,仓鼠,兔子等等。

多态性的使用前提:

  • 要有类的继承关系
  • 要有方法的重写 

多态的适用性:适用于方法,不适用于属性。

2. Java中 多态性的体现:

子类对象的多态性:父类的引用指向子类的对象。( 或子类的对象赋给父类的引用)比如:Person p2 = new Man();

// 定义一个父类 Animal
class Animal {public void sound() {System.out.println("Animal makes a sound");}
}// 定义一个子类 Dog 继承 Animal
class Dog extends Animal {@Overridepublic void sound() {System.out.println("Dog barks");}
}// 定义另一个子类 Cat 继承 Animal
class Cat extends Animal {@Overridepublic void sound() {System.out.println("Cat meows");}
}public class Main {public static void main(String[] args) {// 创建 Animal 类型的引用,指向 Dog 对象Animal myDog = new Dog();myDog.sound(); // 输出:Dog barks// 创建 Animal 类型的引用,指向 Cat 对象Animal myCat = new Cat();myCat.sound(); // 输出:Cat meows}
}

多态性的应用:

  • 虚拟方法调用
  • 在多态的场景下,调用方法时。 编译时,认为方法是左边声明的父类的类型的方法(即被重写的方法)执行式,实际执行的是子类重写父类的方法。
  • 简称为:编译看左边,运行看右边。

多态性的好处与弊端

  • 好处: 极大的减少了代码的冗余,不需要定义多个重载的方法。
  • 弊端: 在多态的场景下,我们创建了子类的对象,也加载了子类特有的属性和方法。但是由于声明为父类的引用,导致我们没有办法直接调用子类特有的属性和方法。

3.2 向下转型与多态练习

图示:

向下转型,其实就是使用:强转符

代码体现:

// 定义一个父类
class Animal {void makeSound() {System.out.println("动物的叫声");}
}// 定义一个子类
class Dog extends Animal {void makeSound() {System.out.println("汪汪汪");}
}// 另一个子类
class Cat extends Animal {void makeSound() {System.out.println("喵喵喵");}
}public class Test {public static void main(String[] args) {// 父类引用指向子类对象Animal myDog = new Dog();Animal myCat = new Cat();// 运行时多态性myDog.makeSound();  // 输出: 汪汪汪myCat.makeSound();  // 输出: 喵喵喵// 向下转型if (myDog instanceof Dog) {Dog dog = (Dog) myDog; // 安全的向下转型dog.makeSound(); // 输出: 汪汪汪}if (myCat instanceof Cat) {Cat cat = (Cat) myCat; // 安全的向下转型cat.makeSound(); // 输出: 喵喵喵}// 尝试错误的向下转型(会抛出 ClassCastException)try {Dog dog = (Dog) myCat; // 错误的向下转型dog.makeSound();} catch (ClassCastException e) {System.out.println("使用错误的向下转型,报错: " + e.getMessage());}}
}

结果:

实战练习

场景:假设我们正在开发一个图形处理系统,需要绘制不同的形状(圆形、矩形等),同时实现对这些形状的面积计算。

// 抽象类 Shape
abstract class Shape {public abstract double area(); // 抽象方法,计算面积
}// 圆形类
class Circle extends Shape {private double radius;public Circle(double radius) {this.radius = radius;}@Overridepublic double area() {return Math.PI * radius * radius;}
}// 矩形类
class Rectangle extends Shape {private double width;private double height;public Rectangle(double width, double height) {this.width = width;this.height = height;}@Overridepublic double area() {return width * height;}
}// 形状处理类
class ShapeProcessor {public void printArea(Shape shape) {System.out.println("面积: " + shape.area());}public void identifyShape(Shape shape) {if (shape instanceof Circle) {Circle circle = (Circle) shape; // 向下转型System.out.println("这是一个圆形,半径为: " + circle.radius);} else if (shape instanceof Rectangle) {Rectangle rectangle = (Rectangle) shape; // 向下转型System.out.println("这是一个矩形,宽度为: " + rectangle.width + " and height: " + rectangle.height);} else {System.out.println("Unknown shape");}}
}// 主类
public class PolymorphismExample {public static void main(String[] args) {Shape circle = new Circle(5);Shape rectangle = new Rectangle(4, 6);ShapeProcessor processor = new ShapeProcessor();processor.printArea(circle); // 计算并打印圆的面积processor.identifyShape(circle); // 识别圆的类型processor.printArea(rectangle); // 计算并打印矩形的面积processor.identifyShape(rectangle); // 识别矩形的类型}
}

结果:

四、Object类

要明确:java.lang.Object  (因为可以自己命名一个叫Object的类)

任何一个java类(不包括Object类 )都直接或间接的继承于Object类,Object类称为java类的根父类。

Object类声明的结构:

  • 没有声明属性
  • 提供一个空参的构造器
  • 重点关注:Object类中声明的方法

图示:

4.1 clone()

clone() 方法用于创建一个对象的副本。

为了使用此方法,类必须实现 Cloneable 接口,并重写 clone() 方法。默认情况下,Object的 clone() 方法是浅拷贝。

class Person implements Cloneable {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}// Getter和Setter方法public String getName() {return name;}public int getAge() {return age;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone(); // 浅拷贝}
}public class CloneExample {public static void main(String[] args) {try {Person person1 = new Person("Alice", 30);Person person2 = (Person) person1.clone(); // 克隆person1// 修改person2的属性System.out.println("Before change:");System.out.println("person1: " + person1.getName() + ", " + person1.getAge());System.out.println("person2: " + person2.getName() + ", " + person2.getAge());person2.age = 31; // 这里是为了示例,实际应提供set方法System.out.println("After change:");System.out.println("person1: " + person1.getName() + ", " + person1.getAge());System.out.println("person2: " + person2.getName() + ", " + person2.getAge());} catch (CloneNotSupportedException e) {e.printStackTrace();}}
}

4.2 equals()

任何数据范围都可以使用

子类说明情况:

  • 自定义的类在没有重写Object中equals()方法的情况下,调用的就是Object类中声明的equals(),比较两个对象的引用地址是否相等,(或是否指向了堆空间中同一个对象实例)
  • 对于String、File、Date和包装类等,都重写了Object类中的equals()方法,用于比较两个对象的实体内容是否相等。

如何重写:

  • 手动实现
  • 调用IDEA自动实现

IDEA使用快捷键:Alt+Inest即可

代码实现:

class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object obj) {if (this == obj) return true; // 引用相等if (obj == null || getClass() != obj.getClass()) return false; // 类型检查Person person = (Person) obj; // 类型转换return age == person.age && name.equals(person.name); // 属性比较}}public class Test {public static void main(String[] args) {Person person1 = new Person("张三", 30);Person person2 = new Person("张三", 30);Person person3 = new Person("李四", 25);// 比较内容System.out.println(person1.equals(person2)); // 输出 trueSystem.out.println(person1.equals(person3)); // 输出 false}
}

结果:

问题:“==”和equals()方法的区别

1.==操作符

  • ==比较的是两个对象的引用(内存地址),即它们是否指向同一个对象。对于基本数据类型,==比较的是它们的值。
  • 使用场景:
    • 对于基本数据类型,==比较它们的实际值。
    • 对于对象类型,==比较它们的引用是否相同。

2. equals() 方法

  • equals()方法用于比较两个对象的内容是否相等,通常会覆盖 Object 类中的 equals() 方法来实现自定义的比较逻辑。
  • 使用场景:
    • equals()适用于需要内容比较的场景。尤其是在处理自定义对象时,通常会重写 equals()方法以提供自定义的比较逻辑。
    • 默认的 equals() 方法(来自 Object 类)与 == 的行为相同,比较的是对象的引用。

注意事项:

  1. 对称性:如果 a.equals(b) 为 true,那么 b.equals(a) 也必须为 true。
  2. 传递性:如果 a.equals(b) 和 b.equals(c) 都为 true,那么 a.equals(c) 也必须为 true。
  3. 一致性:如果没有修改对象的内容,多次调用 a.equals(b) 必须返回相同的结果。
  4. 非空性:对于任何非空引用 aa.equals(null) 应该返回 false。

4.3 toString()

toString()方法返回对象的字符串表示,通常是类名后跟"@"符号和对象的哈希码(十六进制表示)

基本格式:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

IDEA使用快捷键:Alt+Inest即可

代码举例:

public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + "}";}
}

相关文章:

Java—继承性与多态性

目录 一、this关键字 1. 理解this 2. this练习 二、继承性 2.1 继承性的理解 2.1.1 多层继承 2.2 继承性的使用练习 2.2.1 练习1 2.2.2 练习2 2.3 方法的重写 2.4 super关键字 2.4.1 子类对象实例化 三、多态性 3.1 多态性的理解 3.2 向下转型与多态练习 四、Ob…...

打通华为认证实验考试“痛点”:备考指南全解析

华为认证体系中的实验考试环节&#xff0c;尤其是针对高端的HCIE认证&#xff0c;是评估考生实践技能的关键部分。这一环节的核心目标是检验考生对华为设备和解决方案的操作熟练度、技术实施技能以及面对现实工作挑战时的问题解决能力。通过在真实环境中进行的实践操作&#xf…...

【软考】子系统划分

目录 1. 子系统划分的原则1.1 子系统要具有相对独立性1.2 子系统之间数据的依赖性尽量小1.3 子系统划分的结果应使数据几余较小1.4 子系统的设置应考虑今后管理发展的需要1.5 子系统的划分应便于系统分阶段实现1.6 子系统的划分应考虑到各类资源的充分利用 2. 子系统结构设计3.…...

【Python】selenium获取鼠标在网页上的位置,并定位到网页位置模拟点击的方法

在使用Selenium写自动化爬虫时&#xff0c;遇到验证码是常事了。我在写爬取测试的时候&#xff0c;遇到了点击型的验证码&#xff0c;例如下图这种&#xff1a; 这种看似很简单&#xff0c;但是它居然卡爬虫&#xff1f;用简单的点触验证码的方法来做也没法实现 平常的点触的方…...

【C++ 真题】B2078 含 k 个 3 的数

含 k 个 3 的数 题目描述 输入两个正整数 m m m 和 k k k&#xff0c;其中 1 < m ≤ 1 0 15 1 \lt m \leq 10^{15} 1<m≤1015&#xff0c; 1 < k ≤ 15 1 \lt k \leq 15 1<k≤15 &#xff0c;判断 m m m 是否恰好含有 k k k 个 3 3 3&#xff0c;如果满足条…...

蓝桥杯省赛真题——冶炼金属

问题描述 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V&#xff0c;V 是一个正整数&#xff0c;这意味着消耗 V 个普通金属 O 恰好可以冶炼出一个特殊金属 X&#xff0c;当普通金属 O 的数目不足 V 时&#xff0c;无法继续…...

【Mac苹果电脑安装】DBeaverEE for Mac 数据库管理工具软件教程【保姆级教程】

Mac分享吧 文章目录 DBeaverEE 数据库管理工具 软件安装完成&#xff0c;打开效果图片Mac电脑 DBeaverEE 数据库管理工具 软件安装——v24.21️⃣&#xff1a;下载软件2️⃣&#xff1a;安装JDK&#xff0c;根据下图操作步骤提示完成安装3️⃣&#xff1a;安装DBeaverEE&#…...

数据仓库中的维度建模:深入理解与案例分析

数据仓库中的维度建模&#xff1a;深入理解与案例分析 维度建模是数据仓库设计中最常用的一种方法&#xff0c;旨在简化数据访问、提高查询效率&#xff0c;特别适用于需要对数据进行多维分析的场景。本文将深入探讨维度建模的核心概念、设计步骤以及如何将其应用于实际案例中…...

前端打印功能(vue +springboot)

后端 后端依赖生成pdf的方法pdf转图片使用(用的打印模版是带参数的 ,参数是aaa)总结 前端页面 效果 后端 依赖 依赖 一个是用模版生成对应的pdf,一个是用来将pdf转成图片需要的 <!--打印的--><dependency><groupId>net.sf.jasperreports</groupId>&l…...

中间件有哪些分类?

中间件的分类 中间件是位于操作系统和应用程序之间的软件&#xff0c;它提供了一系列服务来简化分布式系统中的应用程序开发和集成。中间件可以根据其功能和用途被分为不同的类别。以下是中间件的一些主要分类&#xff1a; 1. 通信处理&#xff08;消息&#xff09;中间件&am…...

开始新征程__10.13

好久没有更新 csdn 了&#xff0c;身边的人都说 csdn 水&#xff0c;但是在我看来&#xff0c;它在我大一这一年里对我的帮助很大&#xff0c;最近上账号看看&#xff0c;看见了网友评论&#xff0c;哈哈&#xff0c;决定以后还是继续更新&#xff0c;分享自己的学习心得。...

SAP 联合创始人谈Home Office

软件公司 SAP 的家庭办公室规定继续引发激烈争论&#xff0c;其联合创始人哈索-普拉特纳&#xff08;Hasso Plattner&#xff09;对此也有明确看法。 沃尔多夫--年初&#xff0c;SAP 首席执行官克里斯蒂安-克莱因&#xff08;Christian Klein&#xff09;向员工宣誓 "努力…...

基于Jenkins+K8S构建DevOps自动化运维管理平台

目录 1.k8s助力DevOps在企业落地实践 1.1 传统方式部署项目为什么发布慢&#xff0c;效率低&#xff1f; 1.2 上线一个功能&#xff0c;有多少时间被浪费了&#xff1f; 1.3 如何解决发布慢&#xff0c;效率低的问题呢&#xff1f; 1.5 什么是DevOps&#xff1f; 1.5.1 敏…...

【OpenCV】(一)—— 安装opencv环境

【OpenCV】&#xff08;一&#xff09;—— 安装opencv环境 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。OpenCV 是用 C 编写的&#xff0c;但它也有 Python、Java 和 MATLAB 接口&#xff0c;并支持 Windows…...

MybatisPlus操作符和运算值

好久没有更新了&#xff0c;这次更新一个当前端需要对运算符和运算值都需要前端传递给后端&#xff0c;动态拼接运算条件时的处理方法。 1、踩雷 查询年龄 >20&#xff0c;其中>前端下拉框选择&#xff0c;20值前端下拉框选择 1&#xff09;用户表&#xff1a; CREAT…...

Index-1.9B模型部署教程

一、介绍 Index-1.9B 系列是 Index 系列型号的轻量级版本&#xff0c;包含以下型号&#xff1a; Index-1.9B 基础&#xff1a;具有 19 亿个非嵌入参数的基础模型&#xff0c;在 2.8T 主要为中文和英文的语料上进行预训练&#xff0c;在多个评测基准上与同级别模型相比领先。I…...

C语言 | Leetcode C语言题解之第468题验证IP地址

题目&#xff1a; 题解&#xff1a; char * validIPAddress(char * queryIP) {int len strlen(queryIP);if (strchr(queryIP, .)) {// IPv4int last -1;for (int i 0; i < 4; i) {int cur -1;if (i 3) {cur len;} else {char * p strchr(queryIP last 1, .);if (p…...

Qt自定义一个圆角对话框

如何得到一个圆角对话框&#xff1f; 步骤&#xff1a; 1、继承自QDiaglog 2、去掉系统自带的边框 3、设置背景透明,不设置4个角会有多余的部分出现颜色 4、对话框内部添加1个QWidget&#xff0c;给这个widget设置圆角&#xff0c;并添加到布局中让他充满对话框 5、后续对…...

C++ 中的自旋锁应用:SpinLockManual、SpinLockGuard 和 SpinLockTryGuard

在多线程编程中,同步机制是确保线程安全的关键。自旋锁(Spin Lock)是一种常见的同步机制,它通过忙等待(busy-waiting)的方式来实现线程间的互斥访问。在 C++ 中,我们可以使用 std::atomic_flag 来实现自旋锁。本文将介绍如何使用 SpinLockManual、SpinLockGuard 和 Spin…...

计算机网络 tcp和udp

目录 一、TCP 建立连接-TCP 三次握手 1&#xff09; 什么是半连接队列和全连接队列&#xff1f; 2&#xff09; 为什么要三次握手? 3&#xff09; 三次握手过程中可以携带数据吗&#xff1f; 断开连接-TCP 四次挥手 1&#xff09; 为什么要四次挥手&#xff1f; 2&…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...