模块十 面向对象

news2025/1/25 4:33:07

模块十 重点

  1. 知道继承的好处
  2. 会使用继承
  3. 知道继承之后成员变量以及成员方法的访问特点
  4. 会方法重写以及知道方法重写的使用场景
  5. 会使用 this 关键字调用当前对象中的成员
  6. 会使用super关键字调用父类中的成员
  7. 会定义抽象类方法以及抽象类
  8. 会重写抽象方法

第一章 继承

1.1 什么是继承

  1. 父类怎么形成的

    我们定义了多个类,发现这些类中有很多重复性的代码,我们就定义了一个父类,将相同的代码抽取出来放到父类中,其他的类直接继承这个父类,就可以直接使用父类中的内容了

  2. 怎么去继承:extends

    子类 extends 父类
    
  3. 注意:

    a. 子类可以继承父类中私有和非私有成员,但是不能使用父类中私有成员

    b. 构造方法不能继承

  4. 继承怎么学

    a. 继承不要从是否“拥有”方面来学习

    ​ 要从是否能“使用”方面来学习

image-20240329140644221

1.2 继承的基本使用

  1. 定义一个父类,在其中定义重复性代码

  2. 定义一个子类继承父类 → extends

    子类 extends 父类
    
  3. 创建子类对象,直接使用父类中非私有成员

public class Employee {
    String name;
    int age;

    public void work() {
        System.out.println("工作");
    }

    private void eat() {
        System.out.println("员工要干饭");
    }
}
public class Teacher extends Employee {

}
public class Manager extends Employee {

}
public class Test01 {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        teacher.name = "涛哥";
        teacher.age = 18;
        System.out.println(teacher.name+"..."+teacher.age);
        teacher.work();
        // teacher.eat(); // 子类继承父类之后不能使用父类私有成员,只能使用父类非私有成员

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

        Manager manager = new Manager();
        manager.name = "金莲";
        manager.age = 26;
        System.out.println(manager.name+"..."+manager.age);
        manager.work();
    }
}

1.3 继承中成员(成员变量和成员方法)访问特点

1.3.1 成员变量

1.3.1.1 子类和父类中成员变量不重名
public class Fu {
    int numFu = 100;
}
public class Zi extends Fu {
    int numZi = 10;
}
public class Test01 {
    public static void main(String[] args) {
        // 创建父类对象
        Fu fu = new Fu();
        System.out.println(fu.numFu); // 父类中的numFu
        // System.out.println(fu.numZi); // 父类中不能直接调用子类特有(子类有父类没有)的成员

        System.out.println("============================");
        // 创建子类
        Zi zi = new Zi();
        System.out.println(zi.numZi);
        System.out.println(zi.numFu); // 继承了父类,可以使用父类中非私有成员
    }
}

总结:看等号左边是谁,先调用谁中的成员

​ 如果等号左边是父类类型,只能调用父类中的成员变量,如果等号左边是子类类型,既能调用子类的,还能调用父类中继承过来的非私有成员。

1.3.1.2 子类和父类中的成员变量重名
public class Fu {
    int numFu = 100;
    int num = 10000;
}
public class Zi extends Fu {
    int numZi = 10;
    int num = 1000;
}
public class Test01 {
    public static void main(String[] args) {
        // 创建父类对象
        Fu fu = new Fu();
        System.out.println(fu.numFu); // 父类中的numFu
        // System.out.println(fu.numZi); // 父类中不能直接调用子类特有(子类有父类没有)的成员
        System.out.println(fu.num); // 父类的 10000

        System.out.println("============================");
        // 创建子类
        Zi zi = new Zi();
        System.out.println(zi.numZi);
        System.out.println(zi.numFu); // 继承了父类,可以使用父类中非私有成员
        System.out.println(zi.num); // 子类的 1000
    }
}

总结:继承前提下,成员变量访问特点口诀:

​ 看等号左边是谁,先调用谁中的成员,子类没有找父类。(同样适用与多态)

1.3.2 成员方法

1.3.2.1 子类和父类中的成员方法不重名
public class Fu {
    public void methodFu() {
        System.out.println("我是父类中的methodFu");
    }
}
public class Zi extends Fu {
    public void methodZi() {
        System.out.println("我是子类中的methodZi");
    }
}
public class Test01 {
    public static void main(String[] args) {
        Fu fu = new Fu();
        fu.methodFu();
        // fu.methodZi(); // 不能调用子类特有的方法

        System.out.println("============================");
        Zi zi = new Zi();
        zi.methodZi();
        zi.methodFu(); // 继承过来之后,能调用父类的非私有成员
    }
}
1.3.2.2 子类和父类中的成员方法重名
public class Fu {
    public void methodFu() {
        System.out.println("我是父类中的methodFu");
    }
    public void method() {
        System.out.println("我是父类中的method");
    }
}
public class Zi extends Fu {
    public void methodZi() {
        System.out.println("我是子类中的methodZi");
    }
    public void method() {
        System.out.println("我是子类中的method");
    }
}
public class Test01 {
    public static void main(String[] args) {
        Fu fu = new Fu();
        fu.methodFu();
        // fu.methodZi(); // 不能调用子类特有的方法
        fu.method(); // 父类中的method方法

        System.out.println("============================");
        Zi zi = new Zi();
        zi.methodZi();
        zi.methodFu(); // 继承过来之后,能调用父类的非私有成员
        zi.method(); // 子类中的method方法

        System.out.println("============================");
        Fu fu1 = new Zi();
        fu1.method(); // 调用的是子类中的method方法
    }
}

成员方法:看new的是谁,先调用谁中的方法,子类没有,找父类。

继承中,成员变量访问特点:看等号左边是谁,先调用谁中的变量。

​ 成员方法访问特点:看new的是谁,先调用谁中的方法。

1.4 方法的重写

  1. 概述:子类中有一个和父类方法名以及参数列表相同的方法
  2. 前提:继承
  3. 访问:看new的是谁,先调用谁中的,如果new的是子类,调用子类重写的方法,子类没有,找父类。
  4. 检测是否为重写方法,在该方法上写@override
public class Fu {
    public void methodFu(){
        System.out.println("我是父类中的methodFu方法");
    }
    public void method(){
        System.out.println("我是父类中的method方法");
    }
}
public class Zi extends Fu {
    public void methodZi() {
        System.out.println("我是子类中的methodZi方法");
    }
    @Override
    public void method() {
        System.out.println("我是子类中的method方法");
    }
}
public class Test01 {
    public static void main(String[] args) {
        Fu fu = new Fu();
        fu.methodFu(); // 自己的methodFu方法
        fu.method(); // new的是父类对象,那么调用的就是父类中的method方法

        System.out.println("==========================");
        Zi zi = new Zi();
        zi.methodZi();
        zi.methodFu();
        zi.method(); // 子类中的method方法
    }
}

1.4.1 注意事项

  1. 子类重写父类之后,权限必须保证大于或等于父类权限(权限指的是访问权限)

    publicprotected → 默认(不写任何权限修饰符)private
    
  2. 子类方法重写父类方法,方法名和参数列表要一样

  3. 私有方法不能被重写,构造方法不能被重写,静态方法不能被重写

  4. 子类重写父类方法之后,返回值类型应该是父类方法返回值类型的子类类型

public class Fu {
    public void methodFu(){
        System.out.println("我是父类中的methodFu方法");
    }
    public void method(){
        System.out.println("我是父类中的method方法");
    }

    public void method01() {

    }

    public static void method02() {

    }

    public Fu method03() {
        return null;
    }
}
public class Zi extends Fu {
    public void methodZi() {
        System.out.println("我是子类中的methodZi方法");
    }
    @Override
    public void method() {
        System.out.println("我是子类中的method方法");
    }
    // 子类重写父类之后,权限必须保证大于或等于父类权限(权限指的是访问权限)
    /*@Override
    void method01() {

    }*/
    // 私有方法不能被重写,构造方法不能被重写,静态方法不能被重写
    /*@Override
    public static void method02() {

    }*/

    // 子类重写父类方法之后,返回值类型应该是父类方法返回值类型的子类类型
    @Override
    public Zi method03() {
        return null;
    }
}

1.4.2 使用场景

  1. 使用场景:功能升级改造,子类需要对父类中已经实现好的功能进行重新改造

    image-20240331035847199

public class OldPhone {
    public void call() {
        System.out.println("打电话");
    }

    public void message() {
        System.out.println("发短信");
    }
    public void show() {
        System.out.println("显示手机号");
    }
}
public class NewPhone extends OldPhone {
    @Override
    public void show() {
        System.out.println("显示手机号");
        System.out.println("显示归属地");
    }
}
public class Test01 {
    public static void main(String[] args) {
        NewPhone newPhone = new NewPhone();
        newPhone.call();
        newPhone.message();
        newPhone.show();
    }
}

第二章 super和this

2.1 继承中构造方法的特点

  1. 注意:new对象时,会先初始化父类(先走父类无参构造方法)

  2. 原因:

    每个构造方法的第一行,默认都会有一个 super(),不写jvm(虚拟机)自动提供一个

    super()代表的是父类无参构造

public class Fu {
    public Fu() {
        System.out.println("我是父类无参构造");
    }
}
public class Zi extends Fu{
    public Zi() {
        // super();
        System.out.println("我是子类无参构造");
    }
    public Zi(int i) {
        // super();
        System.out.println("我是子类中的有参构造");
    }
}
public class Test01 {
    public static void main(String[] args) {
        Zi zi = new Zi();
        System.out.println("=================");
        Zi zi1 = new Zi(10);
    }
}

image-20240331110001360

2.2 super和this的具体使用

2.2.1 super的具体使用

  1. 概述:代表的时父类引用

  2. 作用:可以调用父类中的成员

  3. 使用:

    a. 调用父类构造方法 → 在子类中的构造方法

    super() → 调用父类无参构造
    super(实参) → 调用父类有参构造
    

    b. 调用父类成员变量

    super.成员变量名
    

    c. 调用父类成员方法

    super.成员方法名(实参)
    
public class Fu {
    int num = 10;

    public Fu() {
        System.out.println("我是父类中的无参构造");
    }

    public Fu(int data) {
        System.out.println("我是父类中的有参构造");
    }
    public void method() {
        System.out.println("我是父类中的method方法");
    }
}
public class Zi extends Fu {
    int num = 100;

    public Zi() {
        super(); // 调用父类中的无参构造(不写也有)
        System.out.println("我是子类中的无参构造");
    }

    public Zi(int num) {
        super(10); //  调用父类的有参构造
        System.out.println("我是子类中的有参构造");
    }
    public void method() {
        super.method(); // 调用父类的方法
        System.out.println("我是子类中的method方法");
        System.out.println(num); // 子类自己的
        System.out.println(super.num); // 父类的
    }
}
public class Test01 {
    public static void main(String[] args) {
        Zi zi = new Zi();
        System.out.println("==============");
        Zi zi1 = new Zi(10);
        System.out.println("==============");
        Zi zi2 = new Zi();
        zi2.method();
    }
}

image-20240331112415825

2.2.2 this的具体使用

  1. this概述:代表的是当前对象(哪个对象调用的this所在的方法,this就代表哪个对象)

  2. 作用

    a. 区分重名的成员变量和局部变量

    b. 调用当前对象中的成员

  3. 使用

    a. 调用当前对象的构造:在构造中写

    this(): 调用当前对象的无参构造
    this(实参):调用当前对象的有参构造
    

    b. 调用当前对象的成员变量

    this.成员变量名
    

    c. 调用当前对象的成员方法

    this.成员方法名(实参)
    
  4. 注意:

    不管是super还是this,只要在构造中使用,都必须在第一行,所以二者不能同时手写出来

public class Person {
    int num = 10;

    public Person() {
        // this(10); // 无参构造调用有参构造
        System.out.println("我是Person中的无参构造");
    }

    public Person(int data) {
        // super(); // super和this不能同时在构造中出现
        this();// 有参构造调用无参构造
        System.out.println("我是Person中的有参构造");
    }
    public void method() {
        int num = 20;
        System.out.println(num); // 20
        System.out.println(this.num); // 10
        method01();
        System.out.println("我是Person类中的method方法");
    }
    public void method01() {
        System.out.println("我是Person类中的method01方法");
    }
}
public class Test01 {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println("===============");
        Person person1 = new Person(10);
        System.out.println("===============");
        Person person2 = new Person();
        person2.method();
    }
}

image-20240331120606949

2.3 继承的特点

  1. 继承只支持单继承,不能多继承

    public class A extends B,C{} → 错误
    
  2. 继承支持多层继承

    public class A extends B{}
    public class B extends C{}
    
  3. 一个父类可以有多个子类

    public class A extends C{}
    public class B extends C{}
    
  4. 构造方法不能继承,也不能重写

    私有方法可以继承,但是不能被重写

    静态方法可以继承,但是不能被重写

public class Fu {
    public void method01() {
        System.out.println("method01方法");
    }

    private void method02() {
        System.out.println("method02方法");
    }

    public static void method03() {
        System.out.println("method03方法");
    }
}
public class Zi extends Fu{
    @Override
    public void method01() {
        System.out.println("重写的method01方法");
    }
    // 私有方法不能被重写
    /*@Override
    private void method02() {
        System.out.println("method02方法");
    }*/
    // 静态方法不能被重写,但是能被使用
    /*@Override
    public static void method03() {
        System.out.println("method03方法");
    }*/
}
public class Test01 {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.method03();
        // 或者
        Zi.method03();
    }
}

2.4 如何为父类中private的成员变量赋值

2.4.1 利用set赋值

public class Employee {
    private String name;
    private int age;

    public Employee() {
    }

    public Employee(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void work() {
        System.out.println("工作");
    }
}
public class Teacher extends Employee{

}
public class Test01 {
    public static void main(String[] args) {
        /*
            利用set为private的成员变量赋值
         */
        Teacher teacher = new Teacher();
        teacher.setName("涛哥");
        teacher.setAge(18);
        System.out.println(teacher.getName()+"..."+teacher.getAge());
    }
}

2.4.2 利用构造方法赋值

public class Employee {
    private String name;
    private int age;

    public Employee() {
    }

    public Employee(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void work() {
        System.out.println("工作");
    }
}
public class Manager extends Employee{
    public Manager() {
    }

    public Manager(String name, int age) {
        super(name, age);
    }
}
public class Test01 {
    public static void main(String[] args) {
        /*
            利用set为private的成员变量赋值
         */
        Teacher teacher = new Teacher();
        teacher.setName("涛哥");
        teacher.setAge(18);
        System.out.println(teacher.getName()+"..."+teacher.getAge());

        System.out.println("==========================");
        /*
            利用构造方法为private的成员变量赋值
         */
        Manager manager = new Manager("金莲", 26);
        System.out.println(manager.getName()+"..."+manager.getAge());
    }
}

image-20240331125651732

第三章 抽象

image-20240331152435966

3.1 抽象的介绍

  1. 抽象类怎么来的?

    抽取共性方法,放到父类中,发现方法没法实现,因为每个子类对此方法的实现方式细节不一样,此时方法体说不清道不明,可以定义成抽象方法。

    抽象方法所在的类一定是抽象类

  2. 关键字:abstract

  3. 抽象方法

    修饰符 abstract 返回值类型 方法名(参数);
    
  4. 抽象类

    public abstract class 类名{}
    
  5. 注意

    a. 抽象方法所在类一定是抽象类

    b. 抽象类中不一定非得有抽象方法

    c. 子类继承抽象父类时,需要重写父类中所有的抽象方法,不然编译报错

    d. 抽象类不能new对象,只能通过new子类对象调用重写方法。

  6. 可以将抽象类看成是一类事物的标准,要求只要是属于这一类的,都必须要拥有抽象类中的方法,必须要给我实现,怎么证明拥有了,怎么证明实现了呢?→ 重写

    至于这个方法怎么实现,就看子类重写之后怎么写方法体了

public abstract class Animal {
    public abstract void eat();

    public abstract void drink();
}
public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗啃骨头");
    }
    @Override
    public void drink() {
        System.out.println("狗喝水");
    }
}
public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
    @Override
    public void drink() {
        System.out.println("猫喝水");
    }
}
public class Test01 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();
        dog.drink();

        System.out.println("=================");
        Cat cat = new Cat();
        cat.eat();
        cat.drink();
    }
}

3.2 抽象类的注意事项

  1. 抽象类不能直接new对象,只能创建非抽象的子类对象。

  2. 抽象类中不一定非得有抽象方法,但是抽象方法所在的类一定是抽象类。

  3. 抽象类的子类,必须重写父类中的抽象方法,否则,编译报错;除非该子类也是抽象类。

  4. 抽象类中可以有成员变量、构造方法、成员方法等

  5. 抽象类中可以有构造方法,是供子类创建对象时,初始化父类属性使用的。

    public abstract class Employee {
        private String name;
        private int age;
    
        public Employee() {
        }
    
        public Employee(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
        public abstract void work();
    }
    
    public class Teacher extends Employee {
        public Teacher() {
        }
    
        public Teacher(String name, int age) {
            super(name, age);
        }
    
        @Override
        public void work() {
            System.out.println("涛哥在讲Java");
        }
    }
    
    public class Test01 {
        public static void main(String[] args) {
            Teacher teacher = new Teacher("涛哥", 18);
            System.out.println(teacher.getName()+"..."+teacher.getAge());
        }
    }
    

第四章 综合案例

某IT公司有多名员工,按照员工负责的工作不同,进行了部门的划分(研发部、运维部)。

研发部(Developer)根据所需研发的内容不同,又分为JavaEE工程师、Android工程师;

运维部(Maintainer)根据所需维护的内容不同,又分为网络维护工程师(Network)、硬件维护工程师(Hardware)。

公司的每名员工都有自己的员工编号、姓名、并要做他们所负责的工作。

工作内容:

  • JavaEE工程师:员工号为xxx的xxx员工正在研发电商网站
  • Android工程师:员工号为xxx的xxx员工,正在研发电商的手机客户端软件
  • 网络维护工程师:员工号为xxx的xxx员工,正在检查网络是否畅通
  • 硬件维护工程师:员工号为xxx的xxx员工,正在修复电脑主板

请根据描述,完成员工体系中所有类的定义,并指定类之间的继承关系,进行xx工程师的对象创建,完成工作方法的调用。

image-20240331163327884

4.1 方式一 利用set赋值

public abstract class Employee {
    private int id;
    private String name;

    public Employee() {
    }

    public Employee(int id, String name) {
        this.id = id;
        this.name = name;
    }

    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 abstract void work();
}
public abstract class Developer extends Employee {
}
public class JavaEE extends Developer{
    @Override
    public void work() {
        // System.out.println("员工号为:"+getId()+"的"+getName()+"员工正在研发电商网站");
        // 或者
        System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"员工,正在研发电商网站");
    }
}
public class Android extends Developer{
    @Override
    public void work() {
        // System.out.println("员工号为:"+getId()+"的"+getName()+"员工正在开发APP");
        // 或者
        System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"员工,正在开发APP");
    }
}
public abstract class Maintainer extends Employee {
}
public class Network extends Maintainer {
    @Override
    public void work() {
        // System.out.println("员工号为:"+getId()+"的"+getName()+"员工正在检查网络是否畅通");
        // 或者
        System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"员工,正在检查网络是否畅通");
    }
}
public class Hardware extends Maintainer {
    @Override
    public void work() {
        // System.out.println("员工号为:"+getId()+"的"+getName()+"员工,正在修复电脑主板");
        // 或者
        System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"员工,正在修复电脑主板");
    }
}
public class Test01 {
    public static void main(String[] args) {
        JavaEE javaEE = new JavaEE();
        javaEE.setId(1);
        javaEE.setName("涛哥");
        javaEE.work();
        System.out.println("=================");
        Android android = new Android();
        android.setId(2);
        android.setName("金莲");
        android.work();
        System.out.println("=================");
        Network network = new Network();
        network.setId(3);
        network.setName("张三");
        network.work();
        System.out.println("=================");
        Hardware hardware = new Hardware();
        hardware.setId(4);
        hardware.setName("李四");
        hardware.work();
    }
}

image-20240331170229647

4.2 利用构造方法赋值

public abstract class Employee {
    private int id;
    private String name;

    public Employee() {
    }

    public Employee(int id, String name) {
        this.id = id;
        this.name = name;
    }

    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 abstract void work();
}
public abstract class Developer extends Employee {
    public Developer() {
    }

    public Developer(int id, String name) {
        super(id, name);
    }
}
public class JavaEE extends Developer{
    public JavaEE() {
    }

    public JavaEE(int id, String name) {
        super(id, name);
    }

    @Override
    public void work() {
        // System.out.println("员工号为:"+getId()+"的"+getName()+"员工正在研发电商网站");
        // 或者
        System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"员工,正在研发电商网站");
    }
}
public class Android extends Developer{
    public Android() {
    }

    public Android(int id, String name) {
        super(id, name);
    }

    @Override
    public void work() {
        // System.out.println("员工号为:"+getId()+"的"+getName()+"员工正在开发APP");
        // 或者
        System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"员工,正在开发APP");
    }
}
public abstract class Maintainer extends Employee {
    public Maintainer() {
    }

    public Maintainer(int id, String name) {
        super(id, name);
    }
}
public class Network extends Maintainer {
    public Network() {
    }

    public Network(int id, String name) {
        super(id, name);
    }

    @Override
    public void work() {
        // System.out.println("员工号为:"+getId()+"的"+getName()+"员工正在检查网络是否畅通");
        // 或者
        System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"员工,正在检查网络是否畅通");
    }
}
public class Hardware extends Maintainer {
    public Hardware() {
    }

    public Hardware(int id, String name) {
        super(id, name);
    }

    @Override
    public void work() {
        // System.out.println("员工号为:"+getId()+"的"+getName()+"员工,正在修复电脑主板");
        // 或者
        System.out.println("员工号为:"+this.getId()+"的"+this.getName()+"员工,正在修复电脑主板");
    }
}
public class Test02 {
    public static void main(String[] args) {
        /*
            利用构造方法赋值
         */
        JavaEE javaEE = new JavaEE(1, "涛哥");
        javaEE.work();
        System.out.println("=================");
        Android android = new Android(2, "金莲");
        android.work();
        System.out.println("=================");
        Network network = new Network(3, "李四");
        network.work();
        System.out.println("=================");
        Hardware hardware = new Hardware(4, "王五");
        hardware.work();
    }
}

image-20240331171315389

第五章 总结

img

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

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

相关文章

simulink 的stm32 ADC模块输出在抽筋,不知为何

% outtypecast(uint16(1000),uint8) % 10003E8,E8232,out232 3 function [y,len] myfcn(u1) headuint8([255 85]);%帧头 out1typecast(uint16(u1),uint8); % out2typecast(uint16(u2),uint8); y[head,out1]; lenuint16(length(y)); 2023b版本,stm32硬件支持…

layui在上传多图时,allDone方法只是在第一次全部成功时调用了

问题点:在使用layui框架做多张图片上传时,遇见只有第一次操作上传图片时,触发了allDone全部上传成功的方法,后面再添加图片时,就不会调用这个方法 原因:是因为我删除了 choose 方法,并且也没有将…

低通滤波器滤波信号

clear clc close all % 生成加速度时程信号 fs 200; % 采样频率为200Hz duration 2 * 60; % 时长为2分钟 t (0:1/fs:duration-1/fs); % 时间向量 % 生成白噪声 noise_power 0.1; % 噪声功率 noise sqrt(noise_power) * randn(size(t)); % 构造加速度信号 % 这里使…

Mac怎么调大音频音量?

Mac怎么调大音频音量?在使用 Mac 电脑时,有时可能会发现音频的音量不够大,特别是在观看视频、听音乐或进行视频会议时。不过,幸运的是,Mac 提供了多种方法来调大音频音量,让您更好地享受音乐和视频的乐趣。…

Kibana管理ES生命周期

希望通过Kibana界面管理ES索引的生命周期 版本:7.15.2 创建索引模板 创建索引模板方便匹配索引,对匹配到的一批索引采用同一套生命周期管理策略,例如开发环境的所有索引以dev-开头,可以创建样式为dev-*的索引模板以匹配开发环境…

【机器学习·浙江大学】机器学习概述、支持向量机SVM(线性模型)

机器学习概述 机器学习 特征提取(feature) 根据提取的特征构造算法,实现特定的任务⭐(这门课程的重点:假设所有的特征已经存在且有效,如何根据这些特征来构造学习算法) 如下图所示,机器学习主要就是来进行…

zdpdjango_argonadmin使用Django开发一个美观的后台管理系统

初始代码 安装依赖 pip install -r requirements.txt生成管理员账户 迁移模型: python manage.py makemigrations python manage.py migrate创建超级用户: python manage.py createsuperuser启动服务 python manage.py runserver浏览器访问&#xf…

学习CSS Flexbox 玩flexboxfroggy flexboxfroggy1-24关详解

欢迎来到Flexbox Froggy,这是一个通过编写CSS代码来帮助Froggy和朋友的游戏! justify-content 和 align-items 是两个用于控制 CSS Flexbox 布局的属性。 justify-content:该属性用于控制 Flexbox 容器中子项目在主轴(水平方向)…

FPGA + 图像处理(三)生成3x3像素矩阵

前言 生成NxN的像素矩阵是对图像进行各类滤波操作的基本前提,本文介绍一种通过bram生成3x3矩阵的方法。 程序 生成bram核 因为本文介绍的是基于bram生成的3x3像素矩阵,所以要先生成两个bram核,用于缓存前两行图像数据 在 IP catalog中选…

IDEA连接SqlServer数据库详细讲解

####一、前期准备 确保已经安装了SqlServer数据库,并记住服务器名称、登录名和密码等信息。在IDEA中安装适当的JDBC(Java Database Connectivity)驱动程序。你可以从Microsoft官方网站上下载最新版本。 二、连接步骤 打开IDEA,…

Unity类银河恶魔城学习记录12-7-1 p129 Craft UI - part 1源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_CraftList.cs using System.Collections; using System.Collections.Gen…

【小白学机器学习10】假设检验之1:F检验,F检验量的构造,F分布,F分布查表求P值等

目录 1 什么是F检验 F-test 1.1 F-test的定义 1.1.1 维基百科对F检验的定义 1.1.2 百度百科的定义 1.2 F检验的别名 1.3 F检验的判断手段 / 要达成的目标 / 适用范围 1.3.1 判断手段 1.3.2 对H0原假设的理解 1.3.3 判断目标/目的 1.3.4 适用的范围,场合 …

HTML5+CSS3+JS小实例:圣诞按钮

实例:圣诞按钮 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0&…

甘特图/横道图制作技巧 - 任务组

在甘特图中通过合理的任务分组可以让项目更加清晰&#xff0c;修改也更方便。 列如下面的甘特图一眼不太容易看清楚整体的进度。或者需要把所有的任务整体的延迟或者提前只能这样一个一个的任务调整&#xff0c;就比较麻烦。 通过给任务分组&#xff0c;看这上面整体的进度就…

TiDB MVCC 版本堆积相关原理及排查手段

导读 本文介绍了 TiDB 中 MVCC&#xff08;多版本并发控制&#xff09;机制的原理和相关排查手段。 TiDB 使用 MVCC 机制实现事务&#xff0c;在写入新数据时不会直接替换旧数据&#xff0c;而是保留旧数据的同时以时间戳区分版本。 当历史版本堆积过多时&#xff0c;会导致读…

【c语言】strncat函数模拟实现

strncat函数模拟实现 strncat函数在cplusplus网站中的定义 模拟实现源码 //strncat函数模拟实现 #include <stdio.h> #include <string.h> #include <assert.h>char* my_strncat(char* destination, const char* source, size_t num) {assert(destination &a…

第十三届蓝桥杯真题解析

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

抖音-引流私域转化模式1.0现场视频,从抖音源源不断把人加到私域,

抖音-引流私域转化模式1.0现场视频&#xff0c;从抖音源源不断把人加到私域&#xff0c;让加到私域的粉丝买单 抖音-引流私域转化模式1.0现场视频&#xff0c;从抖音源源不断把人加到私域 - 百创网-源码交易平台_网站源码_商城源码_小程序源码 课程内容&#xff1a; 01.第一…

JetBrains IDE 2024.1 发布 - 开发者工具

JetBrains IDE 2024.1 (macOS, Linux, Windows) - 开发者工具 CLion, DataGrip, DataSpell, Fleet, GoLand, IntelliJ IDEA, PhpStorm, PyCharm, Rider, RubyMine, WebStorm 请访问原文链接&#xff1a;JetBrains IDE 2024.1 (macOS, Linux, Windows) - 开发者工具&#xff0…

代码随想录阅读笔记-二叉树【合并二叉树】

题目 给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠&#xff0c;那么将他们的值相加作为节点合并后的新值&#xff0c;否则不为 NULL 的节…