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

知识点回顾(一)

 1.final,finally ,finalize 

final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载 。

finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。

finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
 

 

1. 基本介绍
1.1 多态的概念
多态是方法或对象具有多种形态,是面向对象的第三大特征。
多态的前提是两个对象(类)存在继承关系,多态是建立在封装和继承基础之上的。
1.2 多态的具体体现
对象的多态是多态的核心和重点。

规则:

一个对象的编译类型与运行类型可以不一致
编译类型在定义对象时,就确定了,不能改变,而运行类型是可以变化的
编译类型看定义对象时 = 号的左边,运行类型看 = 号的右边
1.3 入门案例
说明:

定义一个 Person 类 作为父类,定义 Student 类 和 Teacher 类作为子类继承父类;
Person 类 拥有 mission() 方法;
Student 类 和 Teacher 类 重写父类的 mission() 方法;
最后在 main 函数中利用多态形式创建对象。
代码如下:

(1)定义父类 Person 类:

package Polymorphism;

public class Person {
    public void mission() {    
        System.out.println("人要好好活着!");
    }
}

(2)定义子类 Student 类:

package Polymorphism;

public class Student extends Person {
    @Override
    public void mission() {    
        System.out.println("学生要好好学习!");
    }
}

(3)定义子类 Teacher 类

package Polymorphism;

public class Teacher extends Person {
    @Override
    public void mission() {    
        System.out.println("老师要好好教书!");
    }
}

(4)在 Test01 类中编写 main 函数,体现多态性

package Polymorphism;

//多态性
public class Test01 {
    public static void main(String[] args) {
        //多态形式,创建对象
        //注意编译类型看等号左边,运行类型看等号右边
        Person p1 = new Student();  
        
        //此时调用的是 Student 类 的 mission() 方法
        p1.mission();
        
        //多态形式,创建对象
        Person p2 = new Teacher();
        
        //此时调用的是 Teacher 类 的 mission() 方法
        p2.mission();
    }
}

(5)运行结果

学生要好好学习!
老师要好好教书!

2. 多态的转型
2.1 向上转型
本质:父类的引用指向子类的对象

特点:

编译类型看左边,运行类型看右边
可以调用父类的所有成员(需遵守访问权限)
不能调用子类的特有成员
运行效果看子类的具体实现
语法:
父类类型 引用名 = new 子类类型();
//右侧创建一个子类对象,把它当作父类看待使用

2.2 向下转型
本质:一个已经向上转型的子类对象,将父类引用转为子类引用

特点:

只能强制转换父类的引用,不能强制转换父类的对象
要求父类的引用必须指向的是当前目标类型的对象
当向下转型后,可以调用子类类型中所有的成员
语法:
子类类型 引用名 = (子类类型) 父类引用;
//用强制类型转换的格式,将父类引用类型转为子类引用类型

2.3 代码示例
说明:

定义一个 Person 类 作为父类,定义 Student 类 和 Teacher 类作为子类继承父类;
Person 类 拥有 mission() 方法;
Student 类 和 Teacher 类 重写父类的 mission() 方法 并且 分别拥有各自的特有的 score() 方法 和 salary() 方法;
最后在 main 函数中 演示转型。
代码如下:

(1)定义类:

package Poly_;

public class Person {
    public void mission() {    
        System.out.println("人要好好活着!");
    }
}

class Student extends Person {    
    @Override
    public void mission() {    
        System.out.println("学生要好好学习!");
    }
    
    public void score() {
        System.out.println("学生得到好成绩!");
    }
}

class Teacher extends Person {
    @Override
    public void mission() {    
        System.out.println("老师要好好教书!");
    }
    
    public void salary() {    
        System.out.println("老师得到高工资!");
    }
}

(2)在 Test02 类中编写 main 函数,演示转型

package Poly_;

//转型演示
public class Test02 {
    public static void main(String[] args) {
        //向上转型(自动类型转换)
        Person p1 = new Student();
        
        //调用的是 Student 的 mission
        p1.mission(); 
        
        //向下转型
        Student s1 = (Student)p1;
        
        //调用的是 Student 的 score
        s1.score();
    }
}

(3)运行结果:

学生要好好学习!
学生得到好成绩!
1
2
2.4 转型的异常
2.4.1 类型转换异常
说明:使用强转时,可能出现异常,对2.3代码示例中的 Test02类 重新编写,演示转型异常

代码如下:

//异常演示
public class Test02 {
    public static void main(String[] args) {
        //向上转型
        Person p1 = new Student();
        
        //调用的是 Student 的 mission
        p1.mission(); 
        
        //向下转型
        Teacher t1 = (Teacher) p1;
        
        //运行时报错
        p1.salary();
    }
}

解释:这段代码在运行时出现了 ClassCastException 类型转换异常,原因是 Student 类与 Teacher 类 没有继承关系,因此所创建的是Student 类型对象在运行时不能转换成 Teacher 类型对象。

2.4.2 instanceof 比较操作符
为了避免上述类型转换异常的问题,我们引出 instanceof 比较操作符,用于判断对象的类型是否为XX类型或XX类型的子类型。

格式:对象 instanceof 类名称
解释:这将会得到一个boolean值结果,也就是判断前面的对象能不能当作后面类型的实例
代码示例 :
package Poly_;

//演示 instanceof 的使用
public class Test03 {
    public static void main(String[] args) {
        //向上转型
        Person p1 = new Student();
        
        //调用的是 Student 的 mission
        p1.mission();
        
        //向下转型
        //利用 instanceof 进行判断
        if(p1 instanceof Student) {    //判断对象 p1 是否是 Student 类 的实例
            Student s1 = (Student)p1;
            s1.score();  //调用的是 Student 的 score
            //上面这两句也可简写为 ((Student) p1).score();
        }
        else if(p1 instanceof Teacher){ //判断对象 p1 是否是 Teacher 类 的实例
            Teacher t1 = (Teacher)p1;
            t1.salary(); //调用的是 Teacher 的 salary
            //同理,上面这两句也可简写为 ((Teacher) p1).salary();
        }
    }
}

运行结果:
学生要好好学习!
学生得到好成绩!
1
2
3.动态绑定(重点)
当调用对象方法的时候,该方法会和该对象的运行类型绑定
当调用对象属性时,没有动态绑定机制,即哪里声明,哪里使用。
代码示例:
package dynamic_;

//演示动态绑定
public class DynamicBinding {
    public static void main(String[] args) {
        //向上转型(自动类型转换)
        //程序在编译阶段只知道 p1 是 Person 类型
        //程序在运行的时候才知道堆中实际的对象是 Student 类型    
        Person p1 = new Student();  
        
        //程序在编译时 p1 被编译器看作 Person 类型
        //因此编译阶段只能调用 Person 类型中定义的方法
        //在编译阶段,p1 引用绑定的是 Person 类型中定义的 mission 方法(静态绑定)
        //程序在运行的时候,堆中的对象实际是一个 Student 类型,而 Student 类已经重写了 mission 方法
        //因此程序在运行阶段对象中绑定的方法是 Student 类中的 mission 方法(动态绑定)
        p1.mission();
    }
}

//父类
class Person {
    public void mission() {    
        System.out.println("人要好好活着!");
    }
}

//子类
class Student extends Person {
    @Override
    public void mission() {    
        System.out.println("学生要好好学习!");
    }
}

运行结果:
学生要好好学习!

4. 应用
4.1 多态数组
多态数组:数组的定义类型为父类类型,里面保存的实际元素类型为子类类型。
代码示例:(循环调用基类对象,访问不同派生类的方法)

说明:
定义一个 Person 类 作为父类,定义 Student 类 和 Teacher 类 作为子类继承父类;
Person 类 拥有 name(姓名) 属性 以及 mission() 方法;
Student 类 和 Teacher 类 拥有各自特有的 score 和 salary 属性,,除此之外,重写父类的 mission() 方法 ;
要求:最后在 main 函数中 创建一个 Person 对象 、一个 Student 对象 和 一个 Teacher 对象,统一放在数组里,并调用每个对象的 mission() 方法。
代码如下:
(1)父类 Person 类:

package polyarr;

public class Person {
    private String name;
    
    public Person(String name) {
        this.name = name;
    }
    
    // getter 和 setter
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    // mission() 方法
    public String mission() {    
        return name + "\t" + "要好好活着";
    }
}

(2)子类 Student 类

package polyarr;

public class Student extends Person {
    private double score;

    public Student(String name, double score) {
        super(name);
        this.score = score;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
    
    //重写父类的say方法
    @Override
    public String mission() {    
        return super.mission() + " score =" + score + " 要好好学习!";
    }
}


(3)子类 Teacher 类

package polyarr;

public class Teacher extends Person {
    private double salary;

    public Teacher(String name, double salary) {
        super(name);
        this.salary = salary;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
    
    //重写父类的 mission 方法
    @Override
    public String mission() {    
        return super.mission() + " salary =" + salary + " 要好好教书!";
    }
}

(4)PolyArray 类 中编写 main 函数

package polyarr;

/*
 * 演示多态数组
 * 创建一个 Person 对象 
 * 创建一个 Student 对象 
 * 创建一个 Teacher 对象
 * 统一放在数组里,并调用每个对象的 mission() 方法。
 */
public class PolyArray {
    public static void main(String[] args) {
        Person[] persons = new Person[3];
        persons[0] = new Person("小汤");
        persons[1] = new Student("小韬", 100);
        persons[2] = new Teacher("小蒲", 10000);
        
        //循环遍历多态数组,调用 mission
        for(int i = 0; i < persons.length; i++) {
            //此处涉及动态绑定机制
            // Person[i] 编译类型是 Person ,运行类型根据实际情况由 JVM 判断
            System.out.println(persons[i].mission());  
        }
    }
}

(5)运行结果:

小汤    要好好活着!
小韬    要好好活着! score = 100.0 要好好学习!
小蒲    要好好活着! salary = 10000.0 要好好教书!
1
2
3
4.2 多态参数
多态参数:方法定义的形参类型为父类类型,实参类型允许为子类类型。
代码示例:

说明:
定义一个 Person 类 作为父类,定义 Student 类 和 Teacher 类作为子类继承父类;
Person 类 拥有 name(姓名) 属性
Student 类 和 Teacher 类 拥有各自 特有 的 study() 和 teach() 方法 ;
要求:最后在 main 函数中 编写 test() 方法 ,功能是调用 Student 类 的 study() 或 Teacher 类 的 teach() 方法,用于演示 多态参数 的使用。
代码如下:
package polyparameter;

//演示多态参数
public class PolyParameter { 
    public static void main(String[] args) {
        Student s1 = new Student("小蓝同学");
        Teacher t1 = new Teacher("小绿老师");
        
        //需先 new 一个当前类的实例化,才能调用 test 方法
        PolyParameter polyParameter = new PolyParameter();
        
        //实参是子类
        polyParameter.test(s1);
        polyParameter.test(t1);        
    }

    //定义方法test,形参为 Person 类型(形参是父类)
    //功能:调用学生的study或教师的teach方法
     public void test(Person p) {
        if (p instanceof Student){
            ((Student) p).study();   //向下转型
        }
        else if (p instanceof Teacher){
            ((Teacher) p).teach();  //向下转型
        }  
     }
}
 
//父类
class Person {
    private String name;
    
    //有参构造
    public Person(String name) {
        this.name = name;
    }
    
    // getter 和 setter
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

//子类
class Student extends Person {

    public Student(String name) {
        super(name);
    }

    // study() 方法
    public void study() {    
        System.out.println(super.getName() + "\t" + "正在好好学习");
    }
}

class Teacher extends Person {

    public Teacher(String name) {
        super(name);
    }

    // teach() 方法
    public void teach() {    
        System.out.println(super.getName() + "\t" + "正在好好教书");
    }
}

运行结果:
小蓝同学    正在好好学习
小绿老师    正在好好教书

5. 多态的优点
代码更加灵活:无论右边new的时候换成哪个子类对象,等号左边调用方法都不会变化。
提高程序的拓展性:定义方法的时候,使用父类类型作为参数,将来使用时,使用具体的子类类型操作
 

相关文章:

知识点回顾(一)

1.final,finally ,finalize final?修饰符&#xff08;关键字&#xff09;如果一个类被声明为final&#xff0c;意味着它不能再派生出新的子类&#xff0c;不能作为父类被继承。因此一个类不能既被声明为 abstract的&#xff0c;又被声明为final的。将变量或方法声明为final&…...

verflow属性的常用值详解

什么是overflow 在CSS中&#xff0c;overflow是“溢出”的意思&#xff0c;该属性规定当内容溢出元素框时发生的事情&#xff0c;设置内容是否会被修剪&#xff0c;溢出部分是否会被隐藏&#xff1b;例如当属性值设置为“visible”则内容不会被修剪&#xff0c;为“hidden”则内…...

算法怎么算:贪心算法

总有人在小白面前说&#xff1a;我是搞算法的&#xff0c;不是码农。又或者在想要进阶的时候&#xff0c;有人问你&#xff1a;你懂算法吗&#xff1f; 所有&#xff0c;算法到底是什么&#xff1f; 从目的性来说&#xff1a;它是计算方法&#xff0c;用来达到自己目的的方式…...

【UDS】ISO15765-2之网络时间参数

文章目录 简介分类1. N_As2. N_Ar3. N_Bs4. N_Br5. N_Cs5. N_Cr 总结 ->返回总目录<- 简介 网络层定时参数定义了N_As、N_Ar、N_Bs、N_Br、N_Cs、N_Cr六个参数。 这些时间参数在多帧传输中可以定义在下图的过程中 分类 1. N_As 方向&#xff1a; 发送方->接收方 …...

Mybatis 动态SQL

注解作用SelectProvider动态查询SQLInsertProvider动态新增SQLUpdateProvider动态更新SQLDeleteProvider动态删除SQL Select 与 SelectProvider 只是在定义注解的方式上有所不同, 一个是静态SQL, 一个是动态SQL 。 SelectProvider 是 MyBatis 中的一个注解&#xff0c;用于指定…...

普通二本院校计算机专业应届生,我来分享java后端开发的自学java经历

当我找到实习的时候&#xff0c;就决定要把自己的经验分享给大家。我会分享一下自己的真实经验。当然了&#xff0c;以下内容仅代表我的个人看法&#xff0c;如有不完善的地方还请见谅。接下来我就以下几个方面进行讲解。下面是兴哥的一位粉丝朋友的经历。 1.自我介绍 首先呢…...

windows系统常见的操作命令及用法

来源&#xff1a;用ChatGPT搜索出来的 目录操作命令&#xff1a; dir&#xff1a;查看当前目录下的文件列表。 用法&#xff1a;dir [路径] [/w] [/p] [/a] [/o] cd&#xff1a;切换当前目录到指定路径。 用法&#xff1a;cd [路径] md/mkdir&#xff1a;创建新的目录。 用法…...

【计算机网络】网络命令的使用

文章目录 一、实验目的二、实验工具三、实验要求四、实验过程01 ping 命令的使用应用1&#xff1a;验证本地计算机上是否正确安装了 TCP/IP 协议应用2&#xff1a;测试某个目的主机可达性应用3&#xff1a;键入 ping&#xff0c;查看 ping 的其他参数含义 02 netstat 命令的典型…...

​当互联网与产业的融合成为一种必然,​平台化和商业化不再是必然

当互联网与产业的融合成为一种必然&#xff0c;我们在互联网时代司空见惯的平台化、中心化的发展模式便开始被瓦解。更为确切地说&#xff0c;经典意义上的平台化和中心化的商业模式不再有存在的必要。因为供求两端的对接不再是依靠平台和中心的撮合和中介来实现的&#xff0c;…...

【linux】冯诺依曼体系+操作系统

我们使用的计算机都是由一个个硬件所组成的&#xff0c;那么如何有条不紊的运行呢&#xff1f;那是因为有冯诺依曼体系约束着硬件&#xff0c;而操作系统来管理着他们&#xff0c;从而使得计算机的硬件和软件完美结合。 一、冯诺依曼体系 首先我们得了解什么是冯诺依曼体系结构…...

从0开始 莫比乌斯函数和反演 学习笔记

莫比乌斯 0 前言 建议先看这篇比较简略的文章&#xff08;有大概了解&#xff09; 莫比乌斯函数_为最后的荣光的博客-CSDN博客 再根据个人情况食用本篇博客 1 莫比乌斯函数 1 1 定义 首先对 n n n 唯一分解&#xff1a; 唯一分解&#xff1a; 唯一分解定理一篇就够了_求…...

IntersectionObserver“替代”滚动条监听

概要 IntersectionObserver 接口提供了一种异步观察目标元素与其祖先元素或顶级文档视口&#xff08;viewport&#xff09;交叉状态的方法。其祖先元素或视口被称为根&#xff08;root&#xff09;。 当一个 IntersectionObserver 对象被创建时&#xff0c;其被配置为监听根中…...

Maven下载安装及IDEA配置Maven的超详细教程

Maven下载安装及IDEA配置Maven的超详细教程 1、IntelliJ IDEA 下载、安装及配置过程2、maven下载、安装、配置过程2.1 mavan下载2.2 安装2.3 配置 3、在IDEA中配置Maven3.1 进入设置界面3.2 maven配置 4、IDEAmaven创建工程示例 Maven是一个能使我们的java程序开发节省时间和精…...

【JAVAEE】线程池基础知识⭐

目录 1.什么是线程池 2.为什么要使用线程池 3.怎么使用线程池 4.自定义一个线程池 5.为什么不推荐使用系统自带的线程池 5.1线程池构造方法的参数和含义 5.1.1拒绝策略 5.2线程池的工作原理 5.3为什么不适用系统自带的线程池 补充&#xff1a;工厂模式 1.什么是线程池…...

【源码解析】@ControllerAdvice实现异常捕获与响应增强处理的原理解析

全局异常处理 demo展示 Slf4j RestControllerAdvice public class GlobalExceptionAdvice {ExceptionHandler(RuntimeException.class)public R<Void> handleNotPermissionException(RuntimeException e, HttpServletRequest request) {String requestURI request.get…...

Visual Studio Code 插件的开发、调试及发布完整详细教程

本篇文章主要讲解:Vscode的拓展插件,从环境安装到生成项目文件再到调试及部署发布的完整开发教程。 日期:2023年5月10日 vscode 1.78.1 一、准备node环境及安装yo 项目初始化,优先安装yo、再通过yo创建code及插件项目。 基础条件 需要先安装node,且node环境已经正确安装…...

Qt音视频开发38-ffmpeg视频暂停录制的设计

一、前言 基本上各种播放器提供的录制视频接口,都是只有开始录制和结束录制两个,当然一般用的最多的也是这两个接口,但是实际使用过程中,还有一种可能需要中途暂停录制,暂停以后再次继续录制,将中间部分视频不需要录制,跳过这部分不需要的视频,而且录制的视频文件必须…...

bat脚本、dos命令

bat脚本 bat脚本就是DOS批处理脚本&#xff0c;就是将一系列DOS命令按照一定顺序排列而形成的集合&#xff0c;运行在windows命令行环境上。这个文件的每一行都是一条DOS命令 在命令提示下键入批处理文件的名称&#xff0c;或者双击该批处理文件&#xff0c;系统就会调用Cmd.…...

【星戈瑞】Sulfo-Cyanine5 mal红色荧光Cy5-maleimide

Sulfo-Cyanine5 mal是一种具有强荧光信号的染料&#xff0c;主要应用于生物荧光成像领域。它的化学式为C38H43KN4O9S2&#xff0c;分子量为803.00。这种染料具有良好的水溶性&#xff0c;可在水溶液中稳定存在。它的光学特性包括吸收峰位于646 nm和发射峰位于662 nm&#xff0c…...

Dcip的学习1-计算器

文章目录 前言一、配置安装环境1.1 网址1.2 再次打开需要进行的操作1.3 NodeJS控制台的操作1.4 出现的页面 二、Dcip生成计算器2.1 软件的基本单位 - Unitform中添加内容 2.2 OnleftChange(); 前言 只是为方便学习&#xff0c;不做其他用途&#xff0c; 一、配置安装环境 1.1 …...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

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

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

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

sshd代码修改banner

sshd服务连接之后会收到字符串&#xff1a; SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢&#xff1f; 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...