day02-面向对象-多态抽象类接口

news2024/12/23 18:27:26

一、⭐多态⭐

1.1 概述

1.多态
    是在继承/实现情况下的一种现象, 表现为对象多态和行为多态
​
2.⭐对象多态写法:
​
        继承:
            父类 变量 = new 子类1();
​
            父类 变量 = new 子类2();
        实现:
            接口 变量 = new 实现类();
​
3.多态的前提(对象多态的前提为1,2条;行为多态的前提为这3条)
    1. 有继承/实现关系
    2. 存在父类引用指向子类对象
    3. 有方法的重写
​
4.多态的注意事项
    多态是对象、行为的多态; 变量则不涉及多态
   
5.代码执行:
    编译看左,运行看右
//父类
public class People {
    private int age;
    private String name;
    //定义父类People, 内含跑步run方法
    public void run(){
        System.out.println("父类People, 跑步run方法");
    }
}
​
//子类
public class Student extends People{
    @Override
    public void run() {
        System.out.println("学生跑");
    }
}
public class Teacher extends People{
    @Override
    public void run() {
        System.out.println("老师跑");
    }
}
​
//测试类
public class Demo {
    public static void main(String[] args) {
        //使用多态的形式创建Student对象
        People p1 = new Student();
        p1.run();
        //使用多态的形式创建Teacher对象
        People p2 = new Teacher();
        p2.run();
    }
}

 

1.2 多态的好处和弊端

多态的好处
    1. 在多态形式下,等号左右两边松耦合,更便于修改和维护
    2. 在多态下, 定义方法时, 可以使用父类类型作为形参, 那么该方法可以接收该父类下所有子类的对象
​
public class Demo {
    public static void main(String[] args) {
        //好处1: 在多态形式下,等号左右两边松耦合,更便于修改和维护
        //创建一个老师对象,调用5次跑步的方法=======有一天需求改了========>创建一个学生对象,调用5次跑步的方法
       //使用普通写法
        Teacher teacher = new Teacher();//改成学生对象的话,需要整体修改
        teacher.run();
        teacher.run();
        teacher.run();
        teacher.run();
        teacher.run();

        //*使用多态的写法
        Person person = new Teacher();//改成学生对象的话,直接就将Teacher 改成 Student就完成了
        person.run();
        person.run();
        person.run();
        person.run();
        person.run();
------------------------------------------------------------------
        //调用login方法,可以使用父类类型作为形参, 那么该方法可以接收该父类下所有子类的对象
        Person person1 = new Student();
        person1.login();//学生登录
        Person person2 = new Teacher();
        person2.login();//老师登录
    }

    //好处2: 在多态下, 定义方法时, 可以使用父类类型作为形参, 那么该方法可以接收该父类下所有子类的对象
    //创建一个login方法,接收一个老师对象,然后调用对象的login方法=======有一天需求改了========>接收一个学生对象,然后调用对象的login方法
    //使用普通写法
    public static void login(Teacher teacher){//改成学生对象的话,需要整体修改
        teacher.login();
    }
    //*使用多态的写法
    public static void login(Person person){//直接让父类类型作为形参
        person.login();
    }
}

//父类
class Person{
    public void run(){}
    public void login(){}
}
//学生子类
class Student extends Person{
    @Override
    public void run() {
        System.out.println("学生跑的快");
    }

    @Override
    public void login() {
        System.out.println("学生登录");
    }
}
//老师子类
class Teacher extends Person{
    @Override
    public void run() {
        System.out.println("老师跑的慢");
    }

    @Override
    public void login() {
        System.out.println("老师登录");
    }
}
多态的弊端
    不能直接使用子类特有的功能
    解决方案: 强制类型转换
​
多态中的转型
    子-->父 (小到大 自动转换): 
            也称为向上转型, 父类引用指向子类对象 Person p = new Student();
    父-->子 (大到小 强制转换): 
            也称为向下转型, 父类引用转为子类对象 Student s = (Student)p;
​
强转风险
    强转是存在风险的, 如果转为父类引用记录的真实子类对象,那么不会报错(否则会报ClassCastException)
    如果想规避这个风险,可以在强转前,使用instanceof关键字, 判断变量对应的类型
public class Demo {
    public static void main(String[] args) {
        //1.多态创建一个学生对象
         Person p1 = new Student();
         //Person p1 = new Teacher();//强转时报错ClassCastException:真实类型与强转类型不一致
         System.out.println(p1);
        //2.调用方法
        p1.run();
        //3.调用学生独有功能
        //4.判断真实类型与强转类型不一致   语法:变量 instanceof 类型
        //报错ClassCastException:真实类型与强转类型不一致
        if (p1 instanceof Student){
            //将p1转化为子类的对象(父类转化为子类,用强转)
            Student s1 = (Student) p1;
            s1.study();
        }else {
            System.out.println("真实类型与强转类型不一致");
        }
        
        System.out.println("------------------------------------------------");
        Person p2 = new Teacher();
        method(p2);
    }
    
     public static void method(Person person){
        //调用老师的run()方法
        person.run();
​
        //需求: 想再调用一下老师的teach()方法
        if(person instanceof Teacher){
            Teacher t1 = (Teacher) person;
            t1.teach();
        }else {
            System.out.println("真实类型与强转类型不一致");
        }
    }
    
}
​
class Person{
    public void run(){}
}
​
class Student extends Person {
    @Override
    public void run() {
        System.out.println("学生跑的快");
    }
​
    //独有方法
    public void study(){
        System.out.println("学生在学习~~~~");
    }
}
​
class Teacher extends Person {
    @Override
    public void run() {
​
        System.out.println("老师跑的慢");
    }
​
    //独有方法
    public void teach(){
​
        System.out.println("老师在上课~~~~");
    }
}

运行结果:

二、final

final关键字是最终的意思,可以修饰(类、方法、变量) ⭐ 修饰类:该类被称为最终类, 类不能再被继承 ⭐ 修饰方法:该方法被称为最终方法, 方法不能被重写 ⭐ 修饰变量:该变量只能被赋值一次, 赋值完毕之后不能再修改 成员变量: 声明时赋完值,或者在构造方法结束之前完成赋值 局部变量: 变量只能被赋值一次

⭐final修饰变量的注意事项 基本类型变量: 变量记录的数据不能再被改变 引用类型变量: 变量记录的地址不能再被改变, 但是地址对应的堆内存中的内容可以改变

public class Demo {
    public static void main(String[] args) {
       //基本类型变量: 变量记录的数据不能再被改变    
            final int age = 10;
            //age = 20;//编译报错, 因为age被final修饰了, 不能再被赋值
            System.out.println(age);
            final Son son = new Son();
            //son = new Son();//编译报错, 因为son被final修饰了, 不能再被赋值
         son.run();
        
        //引用类型变量: 变量记录的地址不能再被改变, 但是地址对应的堆内存中的内容可以改变
            final int[] arr = {1,2,3};
            arr[0] = 5;//内容可变
            int[] arr1 = {1,2,4};
            //arr = arr1;//编译报错, 因为arr被final修饰了, 地址不能改变
        
    }
}
​
class Father {
    public  void run() {
        System.out.println("爸爸在跑");
    }
}
​
class Son extends Father {
    final String name = "lisi";
    String school;
​
    @Override
    public void run() {
        int age = 10;
        //name = "zhangsan"; //编译报错, 因为name被final修饰了, 不能再被赋值
        System.out.println(age + "岁的儿子在跑");
    }
}

三、抽象类

3.1 抽象类概述

1.抽象类和抽象方法
    在Java中有一个关键字叫:abstract,它就是抽象的意思,可以用它修饰类、成员方法。
        abstract修饰类,这个类就是抽象类
        abstract修饰方法,这个方法就是抽象方法,抽象方法没有方法体
        
 2.语法:
​
        修饰符 abstract class 类名{
​
            修饰符 abstract 返回值类型 方法名称(形参列表);
​
        }       
​
3.抽象类的特点
    1. 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。
    2. 类该有的成员(成员变量、方法、构造器)抽象类都可以有。
    3. 抽象类最主要的特点:抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。
    4. 一个类继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。
public class Demo {
    public static void main(String[] args) {
        Person p1 = new Student();
        p1.run();
        Person p2 = new Teacher();
        p2.run();
​
        //Person p3 = new Person();//抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。
    }
}
​
//需求1: 将Person类声明为抽象类
abstract class Person {
    //成员变量
    private String name;
​
    //成员方法
    public  void eat(){
        System.out.println("吃饭");
    }
​
    //需求2: 将run方法修改为抽象方法
    public abstract void run();
}
​
class Student extends Person{
    @Override
    public void run() {
        System.out.println("学生跑步");
    }
}
​
class Teacher extends Person{//鼠标放在这里看提示,Alt+Enter
    @Override
    public void run() {
        System.out.println("老师跑步");
    }
}
//一个类继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。
abstract class Employee extends Person{
​
}

3.2 抽象类的场景和好处

抽象类的应用场景和好处
    1、将所有子类中重复的代码,抽取到抽象的父类中,提高了代码的复用性(先编写子类,再编写抽象类)
    2、我们不知道系统未来具体的业务时,可以先定义抽象类,将来让子类去继承实现,提高了代码的扩展性 (先编抽象类,再编写子类)
/*
需求
    某宠物游戏,需要管理猫、狗的数据。
        猫的数据有:名字;行为是:喵喵喵的叫~
        狗的数据有:名字;行为是:汪汪汪的叫~
 */       
public class Demo {
    public static void main(String[] args) {
        Animal cat = new Cat();
        cat.setName("小花");//小花喵喵喵的叫~
        cat.cry();
        System.out.println("-------------------");
        Animal dog = new Dog();
        dog.setName("小黑");//小黑汪汪汪的叫~
        dog.cry();
​
    }
}
​
//动物的父类,公共的属性和方法
abstract class Animal {
    private String name;
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
    public abstract void cry();
}
​
//猫
class Cat extends Animal {
​
    @Override
    public void cry() {
        System.out.println(getName() + "喵喵喵的叫~");
    }
}
​
//狗
class Dog extends Animal {
​
    @Override
    public void cry() {
        System.out.println(getName() + "汪汪汪的叫~");
    }
}

3.3 模板方法设计模式(为了解决某些特定问题的编码套路)

设计模式
    对于某类问题,前人总结出类的解决问题的套路
​
模板方法设计模式用来解决什么问题?
    1.一个功能的完成需要经过一系列步骤,这些步骤是固定的
    2.但是中间某些步骤具体行为是待定的,在不同的场景中行为不同
​
使用思路
    1、定义一个抽象类(Person作为父类),提供模板方法
    2、模板方法中,需要让子类自己实现的地方,定义为抽象方法
    3、子类(Teacher Student)只需要继承该抽象类,重写抽象方法即可完成对应的功能
​
多学一招:
    建议使用final关健字修饰模板方法
        模板方法是给对象直接使用的,不能被子类重写
        一旦子类重写了模板方法,模板方法就失效了

 

public class Demo {
    public static void main(String[] args) {
        //创建对象
        Person p1 = new Student();
        //执行模板方法
        p1.work();
        System.out.println("-------------------");
        Person p2 = new Teacher();
        p2.work();
    }
}
/**
 * 抽象类模板
 */
abstract class Person {
​
    /**
     * 1.定义模板(必须具有执行的步骤和顺序)
     * 建议使用final关健字修饰模板方法
     *         模板方法是给对象直接使用的,不能被子类重写
     *         一旦子类重写了模板方法,模板方法就失效了
     */
   final public void work() {
        System.out.println("1.吃饭");
        dowork();
        System.out.println("3.睡觉");
    }
    //2.定义抽象方法,让子类实现
    public abstract void dowork();
}
​
/**
 * 子类
 */
class Teacher extends Person {
    @Override
    public void dowork() {
        System.out.println("2.教课");
    }
}
​
class Student extends Person {
​
    @Override
    public void dowork() {
        System.out.println("2.学习");
    }
}

执行结果:

四、⭐接口⭐

4.1 概述

⭐接口
    Java提供了一个关键字interface,用这个关键字我们可以定义出一个特殊的结构:接口
​
⭐定义格式
    public interface 接口名 {
        成员变量(接口中的成员变量都是常量, 默认是被public static final修饰的)
        成员方法(接口中的成员方法都是抽象方法, 默认是被public abstract修饰的)
        注意: 接口中不能有构造方法和代码块
    }
​
⭐注意事项
    1. 接口不能直接创建对象
    2. 接口是用来被类实现(implements)的,实现接口的类称为⭐实现类⭐。
    3. 一个类可以实现多个接口,实现类实现多个接口,必须重写完全部接口的全部抽象方法,否则实现类需要定义成抽象类。
        修饰符 class 实现类 implements 接口1, 接口2, 接口3 , ... {
            
        }
        
⭐步骤:    
    1.定义接口 : interface
    2.定义接口实现类,实现上面接口中的所有抽象方法 : implements
    3.测试类:创建 接口 变量 = new 实现类()
//定义接口
public interface UserInterface {
    //定义成员变量,默认是public static final
    String name = "张三";
​
    //定义成员方法,默认是public abstract
    void save();//抽象方法
}
/**
 * 1. 定义一个实现类, 实现UserInterface接口
 * 2.实现接口中的抽象方法
 */
public class UserInterfaceImpl implements UserInterface {
    @Override
    public void save() {
        System.out.println("保存用户" + name);
    }
}
// 测试类
public class Demo {
    public static void main(String[] args) {
        //面向接口编程,创建对象,调用方法  
        //接口 变量名 = new 实现类()
        UserInterface ui = new UserInterfaceImpl();
        ui.save();//保存用户张三
    }
}

4.2 接口特点、好处

 ⭐接口特点、好处
    让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现。(解耦合)
 ⭐接口的作用:解耦
    1.接口是用来定义规范
    2.定义好xxx功能的方法名,参数,返回值类型(规范定义好,方法名不能随便改)

4.3 接口新特性(了解)

JDK8开始,接口中新增的三种方法
    1、默认方法(jdk8开始支持):对接口中的方法提供默认实现
        使用default修饰,有方法体,可以但是不强制要求实现类重写, 只能通过实现类的对象调用
    2、静态方法(jdk8开始支持):方便调用
         使用static修饰,有方法体,只能通过接口名调用
    3、私有方法(jdk9开始支持):提高代码复用性
        使用private修饰,服务于接口内部,用于抽取相同的功能代码
public class Demo {
    public static void main(String[] args) {
        Animal a = new Dog();
        a.eat();
        a.print1();// dog实现了default方法
​
        System.out.println("-----------------");
​
        Animal b = new Cat();
        b.eat();
        b.print1();// cat未实现default方法,默认调用接口的默认方法
​
        System.out.println("-----------------");
​
        Animal.print2();//dog实现了static方法
​
​
    }
}
​
interface Animal{
    void eat();
    // 默认方法:有方法体,有默认的功能实现,实现类可以选择实现此方法,也可以不实现
    default void print1(){
        System.out.println("defaultPrint");
        print3();//调用私有方法
    }
    // 静态方法:有方法体,只能通过接口名调用,不能通过实现类的对象调用
    static void print2(){
        System.out.println("staticPrint");
    }
    // 私有方法:有方法体,只能用于接口内部,用于抽取相同的功能代码
    private void print3(){
        System.out.println("privatePrint");
    }
}
​
class Dog implements Animal{
    public void eat(){
        System.out.println("动物苏醒了");
        System.out.println("动物开始用膳");
    }
​
    @Override
    public void print1() {
        System.out.println("dog实现了default方法");
    }
}
​
class Cat implements Animal{
    public void eat(){
        System.out.println("动物苏醒了");
        System.out.println("动物开始用膳");
    }
}

4.4 注意事项(了解)

接口使用注感事项
    1、一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承。
    2、一个类实现多个接口,如果多个接口中存在方法签名冲突,则此时不支持多实现。
    3、一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。
    4、一个类继承了父类,又同时实现了接口,父类中和接口中有同名的默认方法,实现类会优先用父类的

五、总结

类和接口的关系总结
    1、类和类: 继承(extends)关系,对于类只支持单继承,不支持多继承,但是可以多层继承
    2、接口和接口: 继承(extends)关系,对于接口,支持多继承
    3、类和接口:实现(implements)关系,支持多实现,一个类同时实现多个接口
1. 抽象类 (Abstract Class)
  • 定义: 抽象类是一个不能实例化的类,旨在作为其他类的基类。它可以包含抽象方法(没有实现)和具体方法(有实现)

  • 字段和构造函数: 抽象类可以有字段(成员变量)和构造函数,并且这些字段可以有初始化值。构造函数可以用来初始化对象的状态。

  • 访问修饰符: 抽象类中的方法可以有不同的访问修饰符(如 privateprotectedpublic)。

  • 继承: 一个类只能继承一个抽象类,但可以实现多个接口抽象类适用于需要共享代码和状态的情况。

  • 用途: 当多个子类共享一些方法和字段时,使用抽象类是合适的。例如,抽象类可以定义一些通用的方法实现,并允许子类扩展或重写这些方法

2. 接口 (Interface)
  • 定义: 接口是一种纯粹的抽象类型,用于定义一组方法的签名(即方法名和参数),并可以提供一些方法的默认实现(从 Java 8 开始)。接口不能包含字段除了 public static final 的常量和构造函数

  • 实现: 接口中的方法默认是 publicabstract(除非它们是 defaultstatic 方法)。实现接口的类必须提供这些方法的具体实现

  • 多重实现: 一个类可以实现多个接口,这样可以弥补 Java 单继承的局限性,允许类从多个来源获取功能。

  • 用途: 接口适用于定义某些行为的契约,而这些行为可以由不同的类实现。这对于需要不同类之间共享某种行为而又不需要继承特定类时非常有用。例如,Runnable 接口允许不同的类实现并定义线程的行为。

总结
  • 抽象类 适用于有一些共用实现和状态的场景,子类可以继承这些共用的实现。

  • 接口 适用于定义行为契约,类可以实现多个接口,从而在不同的类中实现这些行为。

在实际使用中,选择使用抽象类还是接口取决于具体的设计需求和架构要求。

3.多态

Java中的多态主要通过以下两个方面实现:

(1)方法重写

方法重写是指子类提供对父类方法的具体实现,实现行动多态。在Java中,当子类重写父类的方法时,子类方法的签名必须与父类中的方法完全一致。

(2)接口实现 (Interface Implementation)

接口定义了一组方法,任何实现这个接口的类都必须提供这些方法的具体实现接口使得不同的类可以实现相同的行为,但它们不需要有共同的祖先类

多态的优势
  • 灵活性: 多态允许程序在运行时决定调用哪个方法,提供了灵活的调用方式

  • 可扩展性: 通过接口和方法重写,新的类可以轻松地加入到现有系统中,而无需修改现有代码

  • 代码重用: 通过父类和接口定义通用的方法,子类可以重用这些方法的签名和行为,而只需实现具体的逻辑。

关键点
  • 动态绑定: 多态是动态绑定的基础。Java 在运行时根据对象的实际类型决定调用哪个方法,而不是编译时。

  • 继承和接口: 方法重写依赖于继承,而接口允许不同类实现相同的方法,都是实现多态的方式。

通过这两个机制,Java 提供了一种强大的方式来实现灵活的代码设计和运行时行为的变化。

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

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

相关文章

Comsol 微穿孔板吸声性能优化、提升吸声系数

微穿孔板吸声体是由穿孔直径在1毫米以下的薄板和板后空腔组成的共振吸声结构。与传统的吸声材料及普通穿孔板吸声体相比,微穿孔板吸声体清洁,可收回重复利用,不燃,坚固,重量轻,由于不需另加纤维等多孔性吸声材料即可获得良好的吸声性能,且制造不受材料限制,不污染环境,已成功应…

【Python 千题 —— 基础篇】简易银行

= Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目描述 题目描述 编写一个面向对象的程序,模拟一个简化的银行系统。要求定义一个 BankAccount 类,具有基本的存款、取款和查询余额的功能。然后,创建一个 S…

HPM5301系列--VSCODE开发环境问题修复(一)

一、目的 问题描述:在配置工程和编译工程时出现以下提示,并且无法进入调试。 [cpptools] The build configurations generated do not contain the active build configuration. Using "release" for CMAKE_BUILD_TYPE instead of "Relea…

自定义注解+拦截器+多线程,实现字典值的翻译

上一篇,自定义注解拦截器,实现字段加解密操作,奈何公司的这个项目里没有字典值翻译的功能,正好可以再自定义注解拦截器方式的基础上,扩展一下 第一步,新建一个注解 Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface Dict {//对应数据字典的cod…

IO进程线程8月27日

1&#xff0c;思维导图 2&#xff0c;使用两个线程分别复制文件的上下两部分到同一个文件 #include<myhead.h> sem_t fastsem; //pthread_mutex_t fastmutex; void *capy_up(void *c) { // pthread_mutex_lock(&fastmutex);int len*(int *)c;int fp1open("./1…

STM32的IAP

STM32的IAP(In-Application Programming,在应用编程)地址主要涉及IAP程序本身的存储地址以及它所要操作的应用程序(APP)的存储地址。这些地址通常与STM32的FLASH存储器映射相关,并且可以根据具体的STM32型号和IAP程序的设计进行调整。 1. IAP程序存储地址 IAP程序本身…

可视耳勺好用吗?四大可视挖耳勺超值好物分享!

在近年来&#xff0c;可视挖耳勺以其高效的清洁效能&#xff0c;逐渐成为备受青睐的护理产品设备。面对市面上琳琅满目的可视挖耳勺品牌&#xff0c;其质量参差不齐&#xff0c;用户在选择时往往面临着挑战。劣质可视挖耳勺不仅不能达到应有的清洁效果&#xff0c;还可能由于不…

我要做全栈:自学前端第一天

大家好&#xff0c;今天要介绍的是我自学前端的一些经验。 前端想要知道学习哪些内容&#xff0c;首先要知道前端的结构是什么样的&#xff0c;前端是有哪些东西构成的。 所以我先了解了前端的构成是由三部分&#xff1a; 1、HTML&#xff1a;定义了网页的结构 2、CSS&…

DDOS攻击学习-渗透测试-域名信息收集

文章目录 wordpress漏洞利用域名信息收集域名介绍域名分类 whoiswhois反查子域名收集子域名发现网络空间安全搜索引擎SSL证书查询js文件发现子域名 wordpress漏洞利用 这个一般都需要安装wordpress服务使用wpscan扫描&#xff0c;但现在一般很少人知道或者使用wordpress所以这个…

Tkinter Checkbutton设置了一个多选,为什么初始值都是勾选的:

代码如下&#xff1a; from tkinter import *master Tk()renyuan ["唐僧", "沙僧", "悟空", "八戒"]def r_change():rec ""ci 0for el in vars:rec el.get() "、"ci 1rec "九点" rec "离…

论文速览【LLM】 —— 【ORLM】Training Large Language Models for Optimization Modeling

标题&#xff1a;ORLM: Training Large Language Models for Optimization Modeling文章链接&#xff1a;ORLM: Training Large Language Models for Optimization Modeling代码&#xff1a;Cardinal-Operations/ORLM发表&#xff1a;2024领域&#xff1a;使用 LLM 解决运筹优化…

浙商之源——龙游商帮丨情义担当与信誉丰碑——姜益大布行

在龙游这片古老而繁华的土地上&#xff0c;流传着一段关于龙商精神的光辉篇章——姜益大的故事。这不仅是一段商业传奇&#xff0c;更是龙游商人智慧、勇气与诚信的生动写照。 初来乍到&#xff0c;逆锋起笔 清朝同治六年(1867)&#xff0c;安徽绩溪人姜德明在龙游商帮朋友点拨…

《JavaEE进阶》----2.<Spring前传:Maven项目管理工具>

本篇博客讲解我们在使用Spring框架时所要用到的Maven这个项目管理工具 它可以更方便的管理我们的项目&#xff0c;比如通过 1.常用的Maven命令来进行编译、测试、打包、清理包等等&#xff0c;不仅如此&#xff0c; 2.Maven还可以对依赖进行管理&#xff0c;方便我们添加依赖、…

信息打点-资产泄露CMS识别Git监控SVNDS_Store备份

知识点&#xff1a; 1、CMS指纹识别源码获取方式&#xff1b; 2、习惯&配置&特性等获取方式&#xff1b; 3、托管资产平台资源搜索监控&#xff1b; 详细点&#xff1a; 参考&#xff1a;https://www.secpulse.com/archives/124398.html 源码泄露原因&#xff1a; …

fastjson序列化时过滤字段的方法

在使用fastjson进行序列化时&#xff0c;可能需要根据实际需求过滤掉某些字段&#xff0c;以避免将敏感信息或不必要的字段发送到客户端。fastjson提供了多种灵活的方式来实现这一需求。以下整理了fastjson序列化时过滤字段的几种常用方法。 方法一&#xff1a;使用fastjson的…

Windows10激活__“亲测有效”无需秘钥

目录 前言 1. 鼠标“右键”点击“开始菜单” 2. 点击选择“Windows PowerShell&#xff08;管理员&#xff09;” 3. 在该终端窗口&#xff0c;输入“ irm "https://get.activated.win" |iex ” 4. 按下“Enter”键&#xff0c;回车执行该命令 5. 按下数字键盘…

如何使用 Python 和 Selenium 解决 Cloudflare 验证码

在网络自动化测试或网页数据抓取的过程中&#xff0c;Cloudflare验证码是许多开发者遇到的棘手问题。这一验证码设计的初衷是为了保护网站免受恶意攻击&#xff0c;但它也给合法的自动化操作带来了不小的挑战。 那么&#xff0c;使用Python和Selenium&#xff0c;是否有办法有…

PCL 点云ISS关键点提取算法

目录 一、概述二、代码示例三、运行结果📌 结果预览 🔗接上篇 Python 点云ISS关键点提取算法 一、概述 点云ISS关键点(Intrinsic Shape Signatures):利用点云中每个点的局部邻域的协方差矩阵来分析局部几何结构。协方差矩阵的特征值可以揭示局部几何形状的显著性。通…

通过websock实现实时刷新前端(可实现进度条)

业务场景&#xff1a; 领导让我们做一个根据进度实时刷新的进度条&#xff0c;如下所示 后面去网上查了下&#xff0c;可以通过websocket这种双向通信协议的持久链接实现。 配置 创建配置类&#xff0c;启用websocket支持 import org.springframework.context.annotation.…

进阶-task1-深度学习理论基础

学习目标&#xff1a; 从不同的角度更好地优化神经网络 熟悉临界点等与优化有关的常见的概念网络优化失败的常见原因常用的解决/优化方案 具体内容&#xff1a; 网络优化常见的问题&#xff1f; 损失函数Loss不再下降&#xff0c;但是收敛值不合理 深层网络反而不如浅层网…