面向对象三大特征——多态

目录

1. 多态

1.1 概述

1.2 多态中方法的访问特点

1.3多态中成员变量访问特点

1.4 多态中静态方法的访问特点

1.5 向上或向下转型

1.6多态的好处

2.抽象类

2.1抽象类

2.2抽象方法

2.3抽象类的特点

2.4抽象类成员特点

3.接口

3.1接口的概述

3.2接口中成员的特点

3.3类与类、类与接口、接口与接口之间的关系


1. 多态

1.1 概述

多态:可以理解为一个事物的多种形态。同一方法调用可以根据实际调用对象的不同而采用多种不同的行为方式。

  • 多态的前提:

    • 要有子父类的继承(实现)关系

    • 有方法的重写

  • 何为多态:

    • 父类的引用指向子类的对象

  • 示例:

    public class Person {
        String name;
        int age;
    ​
        public void eat() {
            System.out.println("人:吃饭!");
        }
    }
    ​
    /***********************************/
    ​
    public class Man extends Person {
        boolean isSmoking;
    ​
        public void earnMoney() {
            System.out.println("男人负责挣钱养家!");
        }
    ​
        @Override
        public void eat() {
            System.out.println("男人要多吃饭,才能长身体!");
        }
    }
    ​
    /***********************************/
    ​
    public class Woman extends Person {
        boolean isBeauty;
    ​
        public void goShopping() {
            System.out.println("女人喜欢购物!");
        }
    ​
        @Override
        public void eat() {
            System.out.println("女人要少吃饭,为了减肥!");
        }
    }
    /***********************************/
    ​
    public class PersonTest {
        public static void main(String[] args) {
            // Person person = new Man();// 父类的引用指向子类的对象
            Person person = new Woman();// 父类的引用指向子类的对象
            person.eat();
        }
    }

1.2 多态中方法的访问特点

  • 虚拟方法调用(多态情况下)

    • 正常的方法调用 Student student = new Student(); student.getInfo();

    • 子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法确定的

  • 编译看左边,运行看右边

  • 多态情况下

    • “看左边”:看的是父类的引用(父类中不具备子类特有的方法)

    • “看右边”:看的是子类的对象(实际运行的是子类重写父类的方法)

  • 编译的时候,要看【=】左边的引用所属的类型中,是否有该方法的定义,如果有,就编译成功,如果没有,就编译失败。

  • 运行的时候,要看【=】右边的对象所属的类型中,是如何实现这个方法的。最终运行的是子类重写过的方法实现。

    public class PersonTest {
        public static void main(String[] args) {
            Person man = new Man();// 父类的引用指向子类的对象
            Person woman = new Woman();// 父类的引用指向子类的对象
            man.earnMoney();// 编译不通过
            woman.goShopping();// 编译不通过
            man.eat(); // 运行看右边
            woman.eat();// 运行看右边
        }
    }

1.3多态中成员变量访问特点

  • 编译看左边,运行看左边(多态性只适用于方法不适用于属性)

  • 编译的时候,要看【=】左边的引用的类型中,是否有该变量的定义,如果有,就编译成功,如果没有,就编译失败。

  • 运行的时候,要看【=】左边的引用所属类型中,真正如何给变量赋值的。获取到的是父类的赋值结果。

  • 示例:

    1.将Person age属性 修改成30;
    2.Man age属性修改成35;
    3.Woman age属性修改成25;
    public class PersonTest {
        public static void main(String[] args) {
            Person man = new Man();
            Person woman = new Woman();
            System.out.println(man.age);
            System.out.println(woman.age);
            System.out.println(man.isSmoking);//编译失败
            System.out.println(man.isBeauty);//编译失败
        }
    }

1.4 多态中静态方法的访问特点

  • 编译看左边,运行看左边

  • 编译的时候,要看【=】左边的引用所属的类型中,是否有该方法的定义,如果有,就编译成功,如果没有,就编译失败

  • 运行的时候,要看【=】左边的引用所属的类型中,如何实现该方法的。最终运行的是【=】左边类型中方法的结果(方法属于类,不属于重写关系,所以不加@Override)

  • 静态解释:

    • 静态变量:存储在类的字节码中的变量,被所有对象所共享,不随着对象的变化而变化,都有相同的值,所以称为静态变量。

    • 静态方法:只会根据引用所属的父类,来决定运行的内容,运行内容,不会随着子类的变化而变化,都是引用所属的父类的方法实现,所以称为静态方法。

  • 示例:

    1.Person Man Woman 分别添加三个static方法 walk()
     ...
     public static void walk() {
            System.out.println("人:走路!");
        }
    ...
     public static void walk() {
            System.out.println("男人走路,威武霸气!");
        }
    ...
     public static void walk() {
            System.out.println("女人走路,窈窕多姿!");
        }
    ...
      
     public class PersonTest {
        public static void main(String[] args) {
            Person man = new Man();
            Person woman = new Woman();
            man.walk();
            woman.walk();
        }
    }

1.5 向上或向下转型

  • 有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法,子类特有的属性和方法不能调用。

  • 如何才能调用子类特有的属性和方法?

  • 正常情况:使用子类的引用指向子类的对象

  • 向上转型:

    • 多态中,使用父类的引用指向子类的对象(向上转型)

    • 本质:缩小了对象本身的访问范围,减少了访问的权限(只能访问父类中定义的内容)

  • 向下转型:

    • 子类的引用指向父类的对象

    • 格式:

      子类类型 引用名称 = (子类类型)父类类型的引用
      Man man = (Man) person;// 向下转型 person表示父类类型的引用
    • 本质:【恢复】子类类型原本就有的访问范围

    public class PersonTest {
        public static void main(String[] args) {
            Person person = new Man();
            Man man = (Man) person;
            System.out.println(man.isSmoking);
            man.earnMoney();
            man.eat();
        }
    }
    • 注意:使用强转时,可能出现ClassCastException异常(强制类型转换异常),强转有风险。

     public static void main(String[] args) {
            Person person = new Man();
            Woman woman = (Woman) person;
            System.out.println(woman.isBeauty);//ClassCastException
            woman.eat();//ClassCastException
            woman.goShopping();//ClassCastException
        }
    /************************正确做法************************/
    ​
    public static void main(String[] args) {
            Person person = new Man();
            System.out.println(person instanceof Woman);
            if (person instanceof Woman) {
                Woman woman = (Woman) person;
                System.out.println(woman.isBeauty);//ClassCastException
                woman.eat();//ClassCastException
                woman.goShopping();//ClassCastException
            }
    ​
        }

    image-20230206163808114

1.6多态的好处

  • 代码示例:

    • 有一个榨汁机,放什么水果就能榨什么水果的果汁。

    public class Fruit {
        public void flow() {
            System.out.println("榨汁");
        }
    }
    ​
    class Apple extends Fruit {
        @Override
        public void flow() {
            System.out.println("榨苹果汁");
        }
    }
    ​
    class Orange extends Fruit {
        @Override
        public void flow() {
            System.out.println("榨橙子汁");
        }
    }
    ​
    class Machine {
        public static void main(String[] args) {
            Machine machine = new Machine();
            machine.juiceMachine(new Apple()); // 调用的时候,传递子类类型的对象
            machine.juiceMachine(new Orange()); // 调用的时候,传递子类类型的对象
        }
    ​
        public void juiceMachine(Fruit fruit) {
            // 参数父类类型的引用
            fruit.flow();
        }
    }
    //******************不使用多态的写法************************************************
    ​
       public void juiceMachine(Fruit fruit) {
            // 参数父类类型的引用
            fruit.flow();
        }
    ​
        public void juiceMachine(Orange orange) {
            orange.flow();
        }
    ​
        public void juiceMachine(Apple apple) {
            apple.flow();
        }
  • 提高了代码的可扩展性,不需要修改源代码.

  • 多态的好处体现在方法的定义上,在方法的参数列表中,可以定义父类类型的引用,将来调用的时候,所有的子类类型的对象,都可以作为方法的实际参数。 public void juiceMachine (Fruit fruit) { ... }

  • 如果不在方法的参数列表中,使用父类的类型指向子类的对象,也能提高代码的可扩展性。因为对象的来源非常广泛,不仅仅是new出来的,(还可能是通过反射获取的,通过文件读取的,还可能是网络传递的,在写代码的编译阶段,无法知道对象具体的子类类型的)需要使用父类类型的引用,操作不知道的子类类型的对象。

  • 多态还可以降低程序之间的耦合性,比如Machine类就只依赖于Fruit 类,与其他子类无关。

2.抽象类

2.1抽象类

  • 为什么需要抽象?

  • 水果案例不合理的地方:

  • machine.juiceMachine(new Fruit());
    // 解决方式,将Fruit类抽
  • 抽象:抽取像的、相同的、相似的内容出来

  • 可以定义抽象方法的类,就是抽象类,抽象类不能直接实例化对象

  • 定义格式:

    abstract class 类名 {
    
    }

2.2抽象方法

  • 抽象方法:只有方法声明,而没有方法实现的方法,就是抽象方法 在各个子类中,对于某个方法都有自己不同的实现,所以实现各不相同,无法抽取,只能抽取方法的声明上来,在父类中,方法就只有方法声明没有方法体。就是抽象方法。

  • 定义格式:

    • 没有方法实现,连大括号都没有,直接在方法声明后面加上一个分号,表示方法定义结束

    • 为了将方法标记为抽象方法,需要在方法前面加上一个abstract关键字

  • 代码示例:

public abstract class Animal {
    public abstract void eat();
}
​
class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗啃骨头");
    }
}
​
class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

2.3抽象类的特点

  • 抽象类和抽象方法都需要使用abstract关键字修饰

  • 抽象类:abstract class {}
    抽象方法:public abstract void test();
  • 抽象类和抽象方法的关系:

    • 抽象方法所在的类必须是抽象类

    • 抽象类中未必一定都定义抽象方法,抽象类中可以存在非抽象方法 ===> (可以继承给子类)

  • 抽象类的实例化(抽象类如何创建对象)

    • 抽象类不能直接实例化

    • 定义抽象类的子类,由子类创建对象,调用方法

  • 抽象类子类前途:

    • 在子类中,将父类所有的抽象方法全部重写(实现),子类就成了一个普通类,就可以创建对象

    • 在子类中,没有将父类中所有的抽象方法全部实现,子类就还是一个抽象类,还需要使用abstract关键字修饰子类。

2.4抽象类成员特点

  • 成员变量:可以定义变量,也可以定义常量,但是不能被抽象(成员变量是有默认值的,设置抽象没有意义)

  • 成员方法:

    • 既可以是抽象方法:强制子类重写

    • 也可以是非抽象方法:用于给子类继承,提高代码的复用性

  • 构造方法:

    • 是否有构造方法,不取决于是否可以创建对象,而是取决于是否可以定义成员变量。如果可以定义成员变量,那么就需要初始化成员变量,就是构造方法来完成的。

  • 代码实例:

 /**
 * 抽象类成员特点
 */
​
public class AbstractDemo {
    public static void main(String[] args) {
        Son son = new Son(1);
        son.test1();
        son.test2();
    }
}
​
abstract class Father {
    int a = 10;
    final int b = 20;
​
    public Father(int a) {
        this.a = a;
    }
​
    public abstract void test1();
​
    public void test2() {
        System.out.println("定义非抽象方法是否有意义?");
    }
​
}
​
class Son extends Father {
​
    public Son(int a) {
        super(a);
    }
​
    @Override
    public void test1() {
        // 实现
        super.test2();
    }
}
 
  • 员工案例练习

/**
 * @author Petrel
 */
public class AbstractExercise {
    /*
    *  员工类练习
       测试工程师:属性(姓名、工号、工资)      ,行为(工作:软件测试,展示自己信息)
       程序员类: 属性(姓名、工号、工资、奖金) ,行为(工作:软件开发,展示自己信息)
       项目经理类:属性(姓名、工号、工资、奖金) ,行为(工作:控制进度,展示自己信息)
​
    * */
    public static void main(String[] args) {
        Employee tester = new Tester("张三", "001", 8000);
        tester.showInfo();
        tester.work();
        Employee coder = new Coder("李四", "002", 10000, 5000);
        coder.showInfo();
        coder.work();
        Employee manager = new Manager("王五", "003", 12000, 8000);
        manager.showInfo();
        manager.work();
    }
}
​
abstract class Employee {
    private String name;//工资
    private String id;//工号
    private double salary;//工资
​
    public Employee(String name, String id, double salary) {
        this.name = name;
        this.id = id;
        this.salary = salary;
    }
​
    public Employee() {
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public String getId() {
        return id;
    }
​
    public void setId(String id) {
        this.id = id;
    }
​
    public double getSalary() {
        return salary;
    }
​
    public void setSalary(double salary) {
        this.salary = salary;
    }
​
    abstract void showInfo();
​
    abstract void work();
}
​
abstract class Emp extends Employee {
    private double bonus;
​
    public Emp(String name, String id, double salary, double bonus) {
        super(name, id, salary);
        this.bonus = bonus;
    }
​
    public double getBonus() {
        return bonus;
    }
​
    public void setBonus(double bonus) {
        this.bonus = bonus;
    }
​
    @Override
    void showInfo() {
        System.out.println(super.getName() + "..." + super.getId() + "..." + super.getSalary() + "..." + bonus);
    }
}
​
class Coder extends Emp {
    public Coder(String name, String id, double salary, double bonus) {
        super(name, id, salary, bonus);
    }
​
    @Override
    void work() {
        System.out.println("软件开发");
    }
}
​
class Manager extends Emp {
    public Manager(String name, String id, double salary, double bonus) {
        super(name, id, salary, bonus);
    }
​
    @Override
    void work() {
        System.out.println("控制进度");
    }
}
​
class Tester extends Employee {
    public Tester(String name, String id, double salary) {
        super(name, id, salary);
    }
​
    public Tester() {
    }
​
    @Override
    void showInfo() {
        System.out.println(super.getName() + "..." + super.getId() + "..." + super.getSalary());
    }
​
    @Override
    void work() {
        System.out.println("软件测试");
    }
}

3.接口

3.1接口的概述

  • 广义:一切定义规则的都是接口

  • 狭义:java中用于定义方法命名的规则就是接口

  • Java接口中,全都是方法的声明,必须都是抽象方法

  • 好处:一旦将命名规则定义出来,【方法的调用】和【方法的实现】就分离开了,可以提升开发效率,降低代码耦合性

  • 接口的特点

    • 接口的定义:使用interface关键字,编译也是生成一个【.class】文件

    interface 接口名称 {
            方法声明的定义;
    }
    • 类可以实现接口:使用implements关键字

    • class 类名称 implements 接口名称 { 
              对接口中方法的实现;
      }
    • 代码示例:

    /**
     * @author Petrel
     */
    public class HumanDemo {
    }
    ​
    interface Speakable {
        public abstract void speak();
    }
    ​
    abstract class Human {
        abstract void eat();
    }
    ​
    class Chinese extends Human implements Speakable {
        @Override
        void eat() {
            System.out.println("吃米饭");
        }
    ​
        @Override
        public void speak() {
            System.out.println("说汉语");
        }
    }
    ​
    ​
    class English extends Human implements Speakable {
    ​
        @Override
        void eat() {
            System.out.println("吃汉堡");
        }
    ​
        @Override
        public void speak() {
            System.out.println("说英语");
        }
    ​
    }
    ​
    class Primitive extends Human {
        @Override
        void eat() {
            System.out.println("会吃");
        }
    }
    ​
  • 实现:接口中只有方法名称的定义,在类中把接口方法的真正完成逻辑写出来

  • 接口的实例化:不能直接实例化

    • 定义实现类,实现接口,类创建对象,对象调用方法

  • 接口的实现类前途:

    • 实现类如果是一个抽象类,那么该类没有实现接口中的所有抽象方法

    • 实现类如果是一个普通类,那么该类实现了接口中的所有抽象方法

3.2接口中成员的特点

  • 成员变量:

    • 只能是常量,不能是变量,默认加上public static final,建议手动加上,因为常量是存在方法区的常量池中,没在对象中

  • 成员方法:

    • 只能是抽象方法,不能是非抽象方法,默认加上public abstract,建议手动加上,不加public abstract 的方法也是抽象方法

  • 构造方法:

    • 没有构造方法。接口中无法定义成员变量,所以不需要使用构造方法给成员变量初始化赋值。虽然接口有自己的实现类,但是对于实现类而言,不去访问接口中的构造方法,而是访问实现类的父类的构造方法。(父类是亲爹(Object)、接口是干爹,找亲爹的构造方法,而不是干爹的)

  • 代码实例:

/**
 * 接口中成员的特点
 */
public interface InterfaceDemo {
    public static final int AGE = 10;
​
    public abstract void studyMath();
​
    public void studyEnglish();
​
    void studyChinese();
​
}
​
class A {
    public A() {
        System.out.println("父类的构造执行了");
    }
}
​
class B extends A implements InterfaceDemo {
    @Override
    public void studyMath() {
​
    }
​
    @Override
    public void studyEnglish() {
​
    }
​
    @Override
    public void studyChinese() {
​
    }
}

3.3类与类、类与接口、接口与接口之间的关系

  • 类与类

    • 继承的关系,使用extends

    • 可以单继承、不可以多继承、可以多层继承

  • 类与接口:

    • 实现关系,使用implements

    • 可以单实现、也可以多实现

    • 多实现的格式:

    • class 实现类类名 implements 接口1, 接口2, 接口3.......{ 
               重写所有接口中的所有抽象方法 
       }
  • 接口与接口:

    • 继承关系,使用extends

    • 多继承的格式:

    • interface 接口名 extends 父接口1, 父接口2.....{
              相当于继承了所有父接口的所有抽象方法
      }
  • 类和接口的区别(设计区别):

    • 抽象类:定义物体本身具有的固有属性和行为 (战斗机, 直升机, 民航飞机) (is - a)

    • 接口:定义物体通过学习、训练而扩展出来的行为 (鸟,子弹,热气球,风筝 ) (has -a)

  • 代码实例 :USB案例

public class UsbDemo {
​
    public static void main(String[] args) {
        Computer c = new Computer();
        c.start();
        c.useUSB(new KeyBorad());
        c.useUSB(new Mouse());
        c.close();
    }
}
​
interface USB {
    public abstract void use();
}
​
class Computer {//电脑是接口的使用者,不直接依赖具体的外接设备
​
    public void start() {
        System.out.println("电脑开机");
    }
​
    public void close() {
        System.out.println("电脑关机");
    }
​
    public void useUSB(USB usb) {//USB usb = new KeyBorad();//接口类引用,指向实现类对象
        usb.use();
    }
}
​
class KeyBorad implements USB {//键盘是USB实现者,不依赖具体的电脑
​
    @Override
    public void use() {
        System.out.println("读取键盘的输入");
    }
}
​
class Mouse implements USB {
    @Override
    public void use() {
        System.out.println("读取鼠标操作");
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CANoe出现Busoff后如何恢复

项目场景: 在测试Busoff或者ECU进行快速上下电测试时,CANOE往往会进入Busoff状态,DUT会自动恢复,但CANoe只有手动重启CANOE,从而导致自动化测试无法进行下去。这时可以通过CAPL检测到Busoff发生时使用特定的函数重启C…

Python虚拟环境指南:告别依赖地狱

一、背景 在SAAS(软件即服务)平台中,用户使用自行定制的Python脚本已经成为司空见惯的做法,然而,由于不同用户对Python三方库的需求各不相同,而底层服务器一般只安装了一个Python版本。举例来说&#xff0…

【数据结构第 6 章 ④】- 用 C 语言实现图的深度优先搜索遍历和广度优先搜索遍历

目录 一、深度优先搜索 1.1 - 深度优先搜索遍历的过程 1.2 - 深度优先搜索遍历的算法实现 二、广度优先搜索 2.1 - 广度优先搜索遍历的过程 2.2 - 广度优先搜索遍历的算法实现 和树的遍历类似,图的遍历也是从图中某一顶点出发,按照某种方法对图中所…

算法leetcode|92. 反转链表 II(rust重拳出击)

文章目录 92. 反转链表 II:样例 1:样例 2:提示:进阶: 分析:题解:rust:go:c:python:java: 92. 反转链表 II: 给你单链表的…

基于itextpdf的java读取和更新pdf表单域字段值功能

基于itextpdf的java读取和更新pdf表单域字段值功能 执行结果为: Hello World! keytopmostSubform[0].Page1[0].qhjc[0] keytopmostSubform[0].Page1[0].qhmc[0] keytopmostSubform[0].Page1[0].cqzh[0] keytopmostSubform[0].Page1[0].fm_year[0] keytopmostSubf…

springboot整合vue,将vue项目整合到springboot项目中

将vue项目打包后&#xff0c;与springboot项目整合。 第一步&#xff0c;使用springboot中的thymeleaf模板引擎 导入依赖 <!-- thymeleaf 模板 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-t…

yolov5单目测距+速度测量+目标跟踪

要在YOLOv5中添加测距和测速功能&#xff0c;您需要了解以下两个部分的原理&#xff1a; 单目测距算法 单目测距是使用单个摄像头来估计场景中物体的距离。常见的单目测距算法包括基于视差的方法&#xff08;如立体匹配&#xff09;和基于深度学习的方法&#xff08;如神经网…

锂电池是什么

锂电池 电工电气百科 文章目录 锂电池前言一、锂电池是什么二、锂电池的类别三、锂电池的作用原理总结前言 锂电池相比其他类型的电池具有许多优点,包括高能量密度、长寿命、低自放电率和较低的内阻等。这些特性使它成为现代电子设备和电动交通工具中首选的能源储存技术。然而…

互联网加竞赛 python+opencv+机器学习车牌识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器学习的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&#xff0c;适…

热烈庆祝安徽普朗膜技术有限公司参加2024济南生物发酵展

公司自2004年注册成立以来主要业务领域主要有以乳酸、氨基酸、抗生素为主的发酵液的提取分离&#xff1b;醋、酱油发酵产品的产品升级&#xff0c;果汁、茶饮料等天然产物提取的除菌和澄清过滤&#xff1b;低聚木糖、低聚果糖、果葡糖浆、高果糖浆等过滤、纯化、浓缩&#xff1…

java SSM酒店客房管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM酒店客房管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

机器学习的12个基础问题

1.阐述批归一化的意义 算法 1&#xff1a;批归一化变换&#xff0c;在一个 mini-batch 上应用于激活 x。 批归一化是一种用于训练神经网络模型的有效方法。这种方法的目标是对特征进行归一化处理&#xff08;使每层网络的输出都经过激活&#xff09;&#xff0c;得到标准差为 …

Mr. Cappuccino的第66杯咖啡——解决MacOS中终端下的中文乱码问题

解决MacOS中终端下的中文乱码问题 中文乱码问题解决方法 中文乱码问题 解决方法 查看Mac使用的是哪个shell echo $SHELL我这里使用的是zsh&#xff0c;将配置添加到.zshrc配置文件中 vi ~/.zshrc 输入i进入编辑模式 esc退出编辑模式 :wq# UTF-8 export LANGen_US.UTF-8加载配…

Excel中MATCH和INDEX函数的用法详解,以及Vlookup的数组用法

match函数 目的&#xff1a;查询函数&#xff0c;范围单元格中搜索特定的项&#xff0c;然后返回该项在此区域中的相对位置。 For example:让 match 去【隔壁办公室】找【老张】 Match 回复&#xff1a;【老张】坐在【隔壁办公室】第【四】个座位上 公式&#xff1a;【 mat…

驱动框架之_gpio_and_pinctrl-设备树的修改

1&#xff1a;设置设备树中的信息 安装“ Pins_Tool_for_i.MX_Processors_v6_x64.exe ”后运行&#xff0c;打开 IMX6ULL 的配置文件“ MCIMX6Y2xxx08.mex ”&#xff0c;就可以在 GUI 界面中选择引脚&#xff0c; 配置它的功能&#xff0c;这就可以自动生成 Pinctrl 的子节…

Linux查看进程的详细信息

使用top找到进程id使用下面命令查看进程的详细信息 systemctl status 17878

Microsoft visual studio 2013卸载方法

1、问 题 Microsoft visual studio 2013 无法通过【程序与功能】卸载 2、解决方法 使用微软的Microsoft visual studio 2013 专用卸载工具 工具下载链接&#xff1a;https://github.com/Microsoft/VisualStudioUninstaller/releases 或 链接&#xff1a;https://pan.baidu.c…

服务器挖矿木马识别与清理

一、什么是挖矿木马 挖矿木马会占用CPU进行超频运算,从而占用主机大量的CPU资源,严重影响服务器上的其他应用的正常运行。黑客为了得到更多的算力资源,一般都会对全网进行无差别扫描,同时利用SSH爆破和漏洞利用等手段攻击主机。部分挖矿木马还具备蠕虫化的特点,在主机被成…

华为ensp-无线小型wlan配置教程

实验拓扑图&#xff1a; 实验平台&#xff1a;ENSP510 实验设备&#xff1a;Centered Cloud、AC6005、AP4030、STA、Cellphone vlan范围划分 vlan 101 : 10.23.101.1/24 vlan 100 : 10.23.100.1/24实验步骤&#xff1a; 一、创建VLAN100、101配置端口类型 [AC1]vlan batch 100…

Python日期范围按旬和整月以及剩余区间拆分

昨天见到了一个比较烧脑的问题&#xff1a; 咋一看可能理解问题比较费劲&#xff0c;可以直接看结果示例&#xff1a; 当然这个结果在原问题上基础上有一定改进&#xff0c;例如将同一天以单个日期的形式展示。 如何解决这个问题呢&#xff1f;大家可以先拿测试用例自己试一下…