模块十一 面向对象

回顾与重点

模块十回顾

  1. 继承:子类继承父类,可以直接使用父类中非私有成员,子类不用写重复性代码

  2. 关键字:extends

  3. 成员访问特点:

    a. 成员变量:看等号左边是谁

    b. 成员方法:看new的是谁

  4. 方法的重写:子类中有一个和父类从方法名以及参数列表上一样的方法

    a. 检测:@Override

    b. 使用场景:功能升级

  5. 继承中的构造的特点:

    new子类对象先初始化父类

  6. super:代表的是父类引用

    a. 调用父类构造:super() super(实参)

    b. 调用父类成员变量:super.成员变量

    c. 调用父类成员方法:super.成员方法名(实参)

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

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

    b. 作用:

    ​ 调用当前对象构造:this() this(实参)

    ​ 调用当前对象成员变量:this.成员变量名

    ​ 调用当前成员方法:this.成员方法名(实参)

    c. 注意:在构造中使用this和super,都必须要在第一行,所以两者不能同时出现

  8. 继承的特点:

    a. 继承只支持单继承,不支持多继承

    b. 继承支持多层继承

    c. 一个父类可以拥有多个子类

  9. 抽象

    a. 抽象方法

    修饰符 abstract 返回值类型 方法名(形参)
    

    b. 抽象类

    public abstract class 类名{}
    

    c. 特点

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

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

    ​ 子类继承抽象父类时,需要重写抽象方法

    ​ 抽象类不能new对象,只能new子类对象

    ​ 抽象类中啥都可以有,私有属性、构造方法、其他方法等

    ​ 抽象类中的构造时供创建子类对象时初始化父类属性使用的

模块十一重点

  1. 会定义接口
  2. 会在接口中定义抽象方法,默认方法,静态方法、成员变量
  3. 会调用接口中的成员
  4. 知道多态的前提
  5. 会利用多态的方式new对象
  6. 要知道使用多态的好处
  7. 会在多态的前提下向下转型
  8. 会使用instanceof类型判断

第一章 接口

1.1 接口的介绍

  1. 接口:是一个引用数据类型,是一种标准,规则

  2. 关键字:

    a. interface 接口

    public interface 接口名{}
    

    b. implements 实现

    实现类 implements 接口名{}
    
  3. 接口中可以定义的成员:

    a. jdk7以及之前

    ​ 抽象方法:public abstract → 即使不写public abstract,默认也有

    ​ 成员变量:public static final 数据类型 变量名 = 值 → 即使不写public static final ,默认也有

    ​ final是最终的,被final修饰的变量不能二次赋值,所以我们一般将final修饰的变量视为常量

    b. jdk8:

    ​ 默认方法:public default 返回值类型 方法名(形参) {}

    ​ 静态方法:public static 返回值类型 方法名(形参) {}

    c. jdk9开始:

    ​ 私有方法:private的方法

image-20240401131359590

1.2 接口的定义以及使用

  1. 定义接口

    public interface 接口名{}
    
  2. 实现

    public class 实现类名 implements 接口名 {}
    
  3. 使用

    a. 实现类实现接口

    b. 重写接口中的抽象方法

    c. 创建实现类对象(接口不能直接new对象)

    d. 调用重写的方法

public interface USB {public abstract void open();public abstract void close();
}
public class Mouse implements USB {@Overridepublic void open() {System.out.println("鼠标打开");}@Overridepublic void close() {System.out.println("鼠标关闭");}
}
public class Test01 {public static void main(String[] args) {Mouse mouse = new Mouse();mouse.open();mouse.close();}
}

1.3 接口中的成员

1.3.1 抽象方法

  1. 定义格式

    public abstract 返回值类型 方法名(形参)
    
  2. 注意:

    不写public abstract 默认也有

  3. 使用

    a. 定义实现类,实现接口

    b. 重写抽象方法

    c. 创建实现类对象,调用重写的方法

public interface USB {public abstract void open();String close();
}
public class Mouse implements USB{@Overridepublic void open() {System.out.println("鼠标打开");}@Overridepublic String close() {return "鼠标关闭";}
}
public class Test01 {public static void main(String[] args) {Mouse mouse = new Mouse();mouse.open();String str = mouse.close();System.out.println("str = " + str);}
}

1.3.2 默认方法

  1. 定义格式

    public default 返回值类型 方法名(形参) {方法体return 结果
    }
    
  2. 使用

    a. 定义实现类,实现接口

    b. 默认方法可重写,可不重写

    c. 创建实现类对象,调用默认方法

public interface USB {// 默认方法public default void methodDef() {System.out.println("我是默认方法");}
}
public class Mouse implements USB {@Overridepublic void methodDef() {System.out.println("我是重写接口中的默认方法");}
}
public class Test01 {public static void main(String[] args) {Mouse mouse = new Mouse();mouse.methodDef();}
}

1.3.3 静态方法

  1. 定义格式

    public static 返回值类型 方法名(形参) {方法体return 结果
    }
    
  2. 使用

    接口名直接调用

public interface USB {// 默认方法public default void methodDef() {System.out.println("我是默认方法");}// 静态方法public static void methodSta() {System.out.println("我是接口中的静态方法");}
}
public class Test01 {public static void main(String[] args) {Mouse mouse = new Mouse();mouse.methodDef();System.out.println("==================================");// 静态方法 接口名直接调用USB.methodSta();}
}

默认方法和静态方法 → 可以作为临时加的一个小功能来使用,直接修改接口对应的实现类都会报错。

1.3.4 成员变量

  1. 格式

    public static final 数据类型 变量名 =
  2. 相关知识点:final

    final代表最终的,被它修饰的变量,不能二次赋值,可以视为常量

  3. 特点:

    不写public static final 默认也有

  4. 使用

    接口名直接调用

  5. 注意

    a. 被static final 修饰的成员变量需要手动赋值

    b. 习惯上我们会将static final修饰的成员变量名大写

public interface USB {// 成员变量public static final int NUM1 = 100;int NUM2 = 200; // 不写 public static final 默认也有
}
public class Test01 {public static void main(String[] args) {System.out.println(USB.NUM1);System.out.println(USB.NUM2);}
}

1.4 接口的特点

  1. 接口可以多继承 → 一个接口可以继承多个接口

    public interface InterfaceA extends InterfaceB,InterfaceC {}
    
  2. 接口可以多实现 → 一个实现类可以实现一个或者多个接口

    public class InterfaceImp1 implements  InterfaceA,InterfaceB {}
    
  3. 一个子类可以继承一个父类的同时实现一个或者多个接口

    public class Zi extends Fu implements InterfaceA,InterfaceB {}
    
  4. 注意

    继承也好,实现接口也罢,只要是父类中或者接口的抽象方法,子类或者实现类都要重写

当一个类实现多个接口时,如果接口中的抽象方法有重名且参数一样的,只需要重写一次。

// InterfaceA接口
public interface InterfaceA {public abstract void method();
}// InterfaceB接口
public interface InterfaceB {public abstract void method();
}// InterfaceImpl 实现类
public class InterfaceImpl implements InterfaceB,InterfaceA {@Overridepublic void method() {System.out.println("重写的method方法");}
}

当一个类实现多个接口时,如果多个接口中默认方法有重名的且参数一样的,必须重写一次默认方法

public interface InterfaceA {public abstract void method();public default void methodDef() {System.out.println("我是接口A中的默认方法");}
}public interface InterfaceB {public abstract void method();/*public default void methodDef() {System.out.println("我是接口B中的默认方法");}*/public default void methodDef(int b) {System.out.println("我是接口B中的默认方法");}
}public class InterfaceImpl implements InterfaceB,InterfaceA {@Overridepublic void method() {System.out.println("重写的method方法");}/*@Overridepublic void methodDef() {System.out.println("重写后的默认方法");}*/
}public class Test01 {public static void main(String[] args) {InterfaceImpl anInterface = new InterfaceImpl();anInterface.method();anInterface.methodDef();anInterface.methodDef(10);}
}

1.5 接口和抽象类的区别

相同点:

a. 都位于继承体系的顶端,用于被其他类实现或者继承

b. 都不能new

c. 都包含抽象方法,其子类或者实现类都必须重写这些抽象方法

不同点:

a. 抽象类:一般作为父类使用,可以有成员变量、构造方法、成员方法、抽象方法等

b. 接口:成员单一,一般抽取接口,抽取的都是方法,视为功能的大集合

c. 类不能多继承,但是接口可以

image-20240401192609520

第二章 多态

  1. 面向对象三大特征:封装、继承、多态

  2. 怎么学:

    a. 不要从字面意思上理解多态这两个字,要从使用形式上掌握

    b. 要知道多态的好处

    c. 要知道多态的前提

2.1 多态的介绍

  1. 前提:

    a. 必须有子父类继承或者接口实现关系

    b. 必须要有方法的重写(没有重写,多态没有意义),多态玩的主要是重写方法

    c. new对象:父类引用指向子类对象

    Fu fu = new Zi() → 理解为大类型接收一个小类型的数据 → 比如 double b = 10
    
  2. 注意:

    a. 多态下不能直接调用子类特有功能

2.2 多态的基本使用

public abstract class Animal {public abstract void eat();
}
public class Dog extends Animal{@Overridepublic void eat() {System.out.println("狗啃骨头");}// 特有方法public void lookDoor() {System.out.println("狗会看门");}
}
public class Cat extends Animal{@Overridepublic void eat() {System.out.println("猫吃鱼");}// 特有方法public void catchMouse() {System.out.println("猫会捉老鼠");}
}
public class Test01 {public static void main(String[] args) {// 原始方式Dog dog = new Dog();dog.eat(); // 重写的dog.lookDoor(); // 特有的Cat cat = new Cat();cat.eat(); // 重写的cat.catchMouse(); // 特有的System.out.println("====================");// 多态形式new对象Animal animal = new Dog(); // 相当于 double b = 10animal.eat(); // 重写的 animal 接收的是dog对象,所以调用的是dog中的eat// animal.lookDoor(); // 多态前提下,不能直接调用子类特有对象Animal animal1 = new Cat();animal1.eat();  // cat 重写的}
}

2.3 多态条件下成员的访问特点

2.3.1 成员变量

public class Fu {int num = 1000;
}
public class Zi extends Fu {int num = 100;
}
public class Test01 {public static void main(String[] args) {Fu fu = new Zi();System.out.println(fu.num); // 1000}
}

成员变量,看等号左边是谁,先调用谁中的变量。

2.3.2 成员方法

public class Fu {int num = 1000;public void method() {System.out.println("我是父类中的method");}
}
public class Zi extends Fu {int num = 100;public void method() {System.out.println("我是子类中的method");}
}
public class Test01 {public static void main(String[] args) {Fu fu = new Zi();System.out.println(fu.num); // 1000fu.method(); // 子类中重写的method方法}
}

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

2.4 多态的好处(为什么要学多态)

  1. 问题描述

    如果使用原始方式new对象(等号左右两边一样),既能调用重写的,还能调用继承的,还能调用自己特有的成员

    但是多态方式new对象,只能调用重写的,不能直接调用子类特有的成员,那为什么还要用多态呢?

  2. 多态方式和原始方式new对象的优缺点:

    原始方式:

    a. 优点:既能调用重写的,还能调用父类非私有的,还能调用自己特有的

    b. 缺点:扩展性差

    多态方式:

    a. 优点:扩展性强

    b. 缺点:不能直接调用子类特有功能

public abstract class Animal {public abstract void eat();
}
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}// 特有方法public void catchMouse() {System.out.println("猫会捉老鼠");}
}
public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗啃骨头");}// 特有方法public void lookDoor() {System.out.println("狗会看门");}
}
public class Test01 {public static void main(String[] args) {// 原始方式Dog dog = new Dog();method(dog);Cat cat = new Cat();method(cat);/*如果还有其他得动物子类,还需要重新定义method方法,重新指定相应得子类对象,扩展性极差*/}public static void method(Dog dog) {dog.eat();}public static void method(Cat cat) {cat.eat();}
}
public class Test02 {public static void main(String[] args) {// 多态方式Animal animal = new Dog();animal.eat();animal = new Cat();animal.eat();System.out.println("=====================");Dog dog = new Dog();method(dog); // 传递参数 Animal animal = new Dog();Cat cat = new Cat();method(cat); // 传递参数 Animal animal = new Cat();}/*形参传递父类类型,调用此方法父类类型可以接收任意它的子类对象传递哪个子类对象,就指向哪个子类对象,就调用哪个子类对象重写的方法*/public static void method(Animal animal) {animal.eat();}
}

形参传递父类类型,调用此方法父类类型可以接收任意它的子类对象,传递哪个子类对象,就指向哪个子类对象,就调用哪个子类对象重写的方法。

2.5 多态中的转型

2.5.1 向上转型

  1. 向上转型:父类引用指向子类对象

    比如:double b = 1;

  2. 表现方式

    父类类型 对象名 = new 子类对象() → 向上转型 → double b = 1
    

2.5.2 向下转型

  1. 向下转型:好比强转,将大类型强制转成小类型

  2. 表现方式

    子类类型 对象名 = new 子类对象() → 向上转型 → double b = 1
    子类类型 对象名1 = (子类类型) 对象名 → 向下转型 int i = (int)b
    
  3. 想要调用子类特有功能,我们就需要向下转型

public abstract class Animal {public abstract void eat();
}
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}// 特有方法public void catchMouse() {System.out.println("猫会捉老鼠");}
}
public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗啃骨头");}// 特有方法public void lookDoor() {System.out.println("狗会看门");}
}
public class Test01 {public static void main(String[] args) {// 多态方式 向上转型Animal animal = new Dog();animal.eat(); // dog 重写的// animal.lookDoor(); // 多态下不能调用子类特有功能// 向下转型Dog dog = (Dog) animal;dog.eat();dog.lookDoor();}
}

2.6 转型可能会出现的问题

  1. 如果等号两边类型不一致,会出现类型转换异常(ClassCastException)

  2. 解决

    在向下转型之前,先判断类型

  3. 怎么判断类型:instanceof

    判断结果是boolean型

  4. 使用

    对象名 instanceof 类型 → 判断的是关键字前面的对象是否符合=关键字后面的类型

public abstract class Animal {public abstract void eat();
}
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}// 特有方法public void catchMouse() {System.out.println("猫会捉老鼠");}
}
public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗啃骨头");}// 特有方法public void lookDoor() {System.out.println("狗会看门");}
}
public class Test01 {public static void main(String[] args) {Dog dog = new Dog();method(dog);System.out.println("==================");Cat cat = new Cat();method(cat);}public static void method(Animal animal) {/*animal.eat();*//*这里会出现类型转换异常(ClassCastException)原因:当调用method,传递Cat对象时,animal代表的就是Cat对象,此时我们将代表cat对象的animal强转成了dog此时等号左右两边类型不一致了,所以出现类型转换异常*//*Dog dog = (Dog) animal;dog.lookDoor();*/if (animal instanceof Dog) {Dog dog = (Dog) animal;dog.eat();dog.lookDoor();}if (animal instanceof Cat) {Cat cat = (Cat) animal;cat.eat();cat.catchMouse();}}
}

2.7 综合练习

定义笔记本类,具备开机,关机和使用USB设备的功能。具体是什么USB设备,笔记本并不关心,只要符合USB规格的设备都可以。鼠标和键盘要想能在电脑上使用,那么鼠标和键盘也必须遵守USB规范,不然鼠标和键盘的生产出来无法使用;

进行描述笔记本类,实现笔记本使用USB鼠标,USB键盘

  • USB接口,包含开启功能、关闭功能
  • 笔记本类,包含运行功能、关机功能、使用USB设备功能
  • 鼠标类,要符合USB接口
  • 键盘类,要符合USB接口

image-20240402170837130

public interface USB {public abstract void open();public abstract void close();
}
public class Mouse implements USB{@Overridepublic void open() {System.out.println("鼠标开启");}@Overridepublic void close() {System.out.println("鼠标关闭");}// 特有方法public void click() {System.out.println("点击鼠标");}
}
public class Keyboard implements USB{@Overridepublic void open() {System.out.println("键盘开启");}@Overridepublic void close() {System.out.println("键盘关闭");}// 特有方法public void strikeKeyboard() {System.out.println("敲击键盘");}
}
public class NoteBookComputer {public void start() {System.out.println("开机");}public void useUSB(USB usb) {if (usb instanceof Mouse) {Mouse mouse = (Mouse) usb;mouse.open();mouse.click();mouse.close();} else if (usb instanceof Keyboard){Keyboard keyboard = (Keyboard) usb;keyboard.open();keyboard.strikeKeyboard();keyboard.close();}}public void close() {System.out.println("关机");}
}
public class Test01 {public static void main(String[] args) {NoteBookComputer noteBookComputer = new NoteBookComputer();Mouse mouse = new Mouse();noteBookComputer.start();noteBookComputer.useUSB(mouse);noteBookComputer.close();System.out.println("================");Keyboard keyboard = new Keyboard();noteBookComputer.start();noteBookComputer.useUSB(keyboard);noteBookComputer.close();}
}

image-20240402172806751

第三章 总结

img

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

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

相关文章

pytorch交叉熵

目录 1. Entropy2. 交叉熵3. 二分类4. 为什么分类问题使用交叉熵5. 代码示例 1. Entropy Entropy中文是熵的意思,它代表一种不确定性,不确定性越高惊喜度也就越高。 如上图,假设熵代表中奖概率,当熵为2 的中奖概率为1/4没什么惊…

数字乡村:科技引领新时代农村发展

随着信息技术的迅猛发展和数字化浪潮的推进,数字乡村作为新时代农村发展的重要战略,正日益成为引领农村现代化的强大引擎。数字乡村不仅代表着农村信息化建设的新高度,更是农村经济社会发展的重要支撑。通过数字技术的深入应用,农…

ICP的一点学习笔记

1. ICP算法相关 2.GICP算法笔记,参考http://www.roboticsproceedings.org/rss05/p21.pdfAbstract:在本文中结合ICP和点云面ICP算法到一个概率框架。接下来要使用这个框架进行局部平面结构而不是通常的点面方法。这个可以认为是面到面方法。与标准的ICP和点到面方法相比&#xf…

npm版本切换工具nvm

有了nvm,可以在一台机器上同时安装多个版本的nodejs,然后指定使用某个版本。 前端开发的时候,安装依赖一直是个令我头痛的问题。总是报错,或者不是少了这样就是少了那样,鸡飞狗走。以往,一般要装个enpm&am…

安卓java打包uniapp原生插件 和 uniapp使用安卓android原生插件

1.uniapp dcloud官方文档 简介 | uni小程序SDK 2.前提,需要有经验的安卓java开发人员,并且同时具备uniapp移动端开发经验。说明:android打包的.aar和uniapp需要的.aar是不一样的,uniapp需要的.aar是需要有一些特定配置的&#x…

HarmonyOS实战开发DLP-如何实现一个安全类App。

介绍 本示例是一个安全类App,使用ohos.dlpPermission 接口展示了在eTS中普通文件加密受限的过程。 效果预览 使用说明: 1.启动应用后点击“”按钮可以添加一个普通文件; 2.长按点击加密按钮,出现加密权限弹窗,选择需要设置的权限并点击确定…

《从零开始学架构》读书笔记(一)

目录 软件架构设计产生的历史背景 软件架构设计的目的 系统复杂度来源 追求高性能 一、单机高性能 二、集群的高性能 追求高可用 一、计算高可用 二、存储高可用 追求可扩展性 一、预测变化 二、应对变化 追求安全、低成本、规模 一、安全 二、低成本 三、规模…

蓝桥杯 历届真题 杨辉三角形【第十二届】【省赛】【C组】

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 思路: 由于我第一写没考虑到大数据的原因,直接判断导致只得了40分,下面是我的代码: #…

uniapp中uni.navigateTo传递变量

效果展示: 核心代码: uniapp中uni.navigateTo传递变量 methods: {changePages(item) {setDatas("maintenanceFunName", JSON.stringify(item)).then((res) > {uni.navigateTo({url: /pages/PMS/maintenance/maintenanceTypes/maintenanceT…

vscode教程

个人笔记(整理不易,有帮助点个赞) 笔记目录:学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔:工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 目录 一&#xff1a…

Mac安装Docker提示Another application changed your Desktop configuration解决方案

1. 问题描述 Mac安装Docker后,提示Another application changed your Desktop configuration,Re-apply configurations无效 2. 解决方案 在终端执行下述命令即可解决: sudo ln -sf /Applications/Docker.app/Contents/Resources/bin/docke…

neo4j图数据库下载安装配置

neo4j下载地址Index of /doc/neo4j/3.5.8/ 1.说明:jdk 1.8 版本对应的 neo4j 数据库版本 推荐安装3.X版本 2.配置系统环境变量 3.启动 neo4j.bat console 4.访问

系统监测工具-tcpdump的使用

一个简单的tcpdump抓包过程。主要抓包观察三次握手,四次挥手的数据包 有两个程序:客户端和服务器两个程序 服务器端的ip地址使用的是回环地址127.0.0.1 端口号使用的是6000 tcpdump -i 指定用哪个网卡等,dstip地址端口指定抓取目的地址…

[图像处理] MFC载入图片并绘制ROI矩形

上一篇: [图像处理] MFC载入图片并进行二值化处理和灰度处理及其效果显示 文章目录 前言完整代码重要代码效果 前言 上一篇实现了MFC通过Picture控件载入图片。 这一篇实现ROI功能的第一部分,在Picture控件中,通过鼠标拖拽画出一个矩形。 完…

前端:SVG绘制流程图

效果 代码 html代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>SVG流程图示例</title><style>/* CSS 样式 */</style><script src"js/index.js"></script…

浪潮信息边缘服务器NE5260G7焕新升级 算力系统更开放、更强大

随着边缘计算场景的增加&#xff0c;再加上用户需求的升级&#xff0c;边缘服务器市场亦迎来了新的挑战&#xff0c;紧跟需求&#xff0c;浪潮信息亦有序通过技术创新提升服务器性能。日前&#xff0c;浪潮信息边缘服务器NE5260G7焕新升级&#xff0c;完成第五代英特尔至强处理…

JVM 全景图

今天我重新复习了一下 jvm 的一些知识点。我以前觉得 jvm 的知识点很多很碎&#xff0c;而且记起来很困难&#xff0c;但是今天我重新复习了一下&#xff0c;对这些知识点进行了简单的梳理之后&#xff0c;产生了不一样的看法。虽然 jvm 的知识点很碎&#xff0c;但是如果你真的…

基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作

第一章、理论篇&#xff1a;以问题导入的方式&#xff0c;深入掌握原理基础 什么是MaxEnt模型&#xff1f; MaxEnt模型的原理是什么&#xff1f;有哪些用途&#xff1f; MaxEnt运行需要哪些输入文件&#xff1f;注意那些事项&#xff1f; 融合R语言的MaxEnt模型的优势&…

科技云报道:卷完参数卷应用,大模型落地有眉目了?

科技云报道原创。 国内大模型战场的比拼正在进入新的阶段。 随着产业界对模型落地的态度逐渐回归理性&#xff0c;企业客户的认知从原来的“觉得大模型什么都能做”的阶段&#xff0c;已经收敛到“大模型能够给自身业务带来什么价值上了”。 2023 年下半年&#xff0c;不少企…

[羊城杯 2020]Easyphp2 ---不会编程的崽

摆烂一周了&#xff0c;继续更&#xff01;&#xff01;题目还是简单哦。 提示明显要我们修改数据包&#xff0c;第一反应是修改referer。试了一下不太对。url很可能存在文件包含 使用伪协议读取一下源码吧。它过滤了base64关键字。尝试url编码绕过&#xff0c;这里可以使用二…