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

Java——基础语法(二)

前言

在这里插入图片描述
「作者主页」:雪碧有白泡泡
「个人网站」:雪碧的个人网站
「推荐专栏」

java一站式服务
React从入门到精通
前端炫酷代码分享
★ 从0到英雄,vue成神之路★
uniapp-从构建到提升
从0到英雄,vue成神之路
解决算法,一个专栏就够了
架构咱们从0说
★ 数据流通的精妙之道★
★后端进阶之路★

请添加图片描述
在这里插入图片描述

继上一篇Java——基础语法(一)后的续文

文章目录

  • 前言
  • 5. 继承与多态:
    • 继承的基本概念
    • 继承的特点
    • 多态的基本概念
    • 多态的实现方式
    • 强制类型转换
    • 抽象类与抽象方法
    • 接口
    • 总结
  • 6. 接口:
    • 接口的概念
    • 接口的特点
    • 接口的使用方法
    • 接口的实现
    • 接口的继承
    • 接口的应用场景
  • 7. 泛型:
    • 泛型的概念
    • 泛型的特点
    • 泛型的使用方法
    • 泛型类
    • 泛型方法
    • 通配符
    • 泛型的应用场景
      • 泛型类
      • 泛型方法
      • 通配符
      • 泛型接口
      • 泛型枚举

5. 继承与多态:

Java支持继承和多态。继承是一种面向对象编程的重要技术,它可以使一个新的类获取已有类的属性和方法。多态指的是同一个方法在不同情况下表现出不同的行为。

下面我将详细介绍Java中的继承与多态。

继承的基本概念

在Java中,继承是一种面向对象编程的机制,它允许一个类从另一个类继承属性和行为。被继承的类称为父类或基类,继承的类称为子类或派生类。继承使得代码重用更加容易,同时也提高了代码的可读性和可维护性。

Java中使用关键字extends来实现继承关系,示例代码如下:

public class Animal {public void eat() {System.out.println("Animal is eating.");}
}public class Dog extends Animal {public void bark() {System.out.println("Dog is barking.");}
}

在上面的代码中,Dog类继承自Animal类,因此Dog类具有父类Animal中的成员方法eat()。

继承的特点

  • 子类可以继承父类的成员变量和成员方法,包括公有、受保护和默认访问级别的成员。
  • 子类可以重写父类的成员方法以实现特定需求。
  • 子类可以添加新的成员变量和成员方法,以满足特定需求。
  • 子类不能直接访问父类的私有成员变量和私有成员方法,但可以通过父类的公有或受保护成员方法来访问。

多态的基本概念

多态是面向对象编程中的一种特性,它允许不同的对象对同一消息做出不同的响应。在Java中,多态可以通过方法重载和方法重写来实现。

  • 方法重载:方法重载是指在一个类中定义多个具有相同方法名但参数列表不同的方法。Java会根据方法的参数列表来决定调用哪个方法。
  • 方法重写:方法重写是指在子类中对父类的某个方法进行重新定义。子类重写的方法必须与父类的方法具有相同的名称、参数列表和返回类型,并且访问修饰符不能更严格。

示例代码:

public class Animal {public void eat() {System.out.println("Animal is eating.");}
}public class Dog extends Animal {@Overridepublic void eat() {System.out.println("Dog is eating bones.");}
}public class Cat extends Animal {@Overridepublic void eat() {System.out.println("Cat is eating fish.");}
}

上述代码中,Dog类和Cat类都重写了父类Animal中的eat()方法。当调用eat()方法时,Java虚拟机会根据具体调用的对象类型来决定调用哪个方法。

多态的实现方式

在Java中,多态有两种实现方式:通过继承和接口来实现多态。

  • 通过继承实现多态:

    在继承体系中,父类指针可以指向子类对象。使用父类的引用变量来调用重写的方法时,Java虚拟机会根据具体调用的对象类型来决定调用哪个方法。

    示例代码:

    Animal ani1 = new Dog();
    Animal ani2 = new Cat();
    ani1.eat();   // 输出:Dog is eating bones.
    ani2.eat();   // 输出:Cat is eating fish.
    
  • 通过接口实现多态:

    接口是一种特殊的抽象类,它只定义了方法的声明而没有提供方法的实现。一个类可以实现多个接口,从而具有不同的行为特征。Java中通过将对象引用转换为接口类型来实现多态。使用接口的引用变量来调用实现类中的方法时,Java虚拟机会根据具体调用的对象类型来决定调用哪个方法。

示例代码:

interface Shape {void draw();
}class Circle implements Shape {@Overridepublic void draw() {System.out.println("Draw a circle.");}
}class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Draw a rectangle.");}
}public class Main {public static void main(String[] args) {Shape s1 = new Circle();Shape s2 = new Rectangle();s1.draw();  // 输出:Draw a circle.s2.draw();  // 输出:Draw a rectangle.}
}

在上述代码中,Circle和Rectangle类都实现了Shape接口,并重写了接口中的draw()方法。当使用接口的引用变量来调用实现类中的方法时,Java虚拟机会根据具体调用的对象类型来决定调用哪个方法。

强制类型转换

在Java中,可以使用强制类型转换将父类引用变量转换为子类引用变量,以方便访问子类特有的成员。

示例代码:

Animal ani = new Dog();
if (ani instanceof Dog) {Dog d = (Dog)ani;d.bark();
}

在上述代码中,ani是一个Animal类的引用变量,但它指向的是一个Dog类的实例。通过使用instanceof运算符可以判断ani是否指向了一个Dog类的实例。如果是,则可以使用强制类型转换将ani转换为Dog类型,以便访问Dog类特有的方法bark()。

需要注意的是,如果进行强制类型转换时,实际对象不是所需类型的子类,会抛出ClassCastException异常。因此,在进行强制类型转换之前,最好先使用instanceof运算符进行类型检查。
6. 调用父类的构造方法

在Java中,子类继承了父类的所有属性和方法,但并没有继承父类的构造方法。因此,在子类的构造方法中调用父类的构造方法是非常必要的,以确保父类的成员变量得到正确的初始化。

在子类的构造方法中使用super关键字来调用父类的构造方法。如果父类有多个构造方法,则可以通过super关键字指定需要调用的构造方法。

示例代码:

public class Animal {private String name;public Animal(String name) {this.name = name;}
}public class Dog extends Animal {private int age;public Dog(String name, int age) {super(name);  // 调用父类的构造方法this.age = age;}
}

在上述代码中,Dog类继承自Animal类,并在其构造方法中调用了Animal类的构造方法。

抽象类与抽象方法

抽象类是一种特殊的类,它不能被实例化,只能作为其他类的父类使用。抽象类中可以包含抽象方法,抽象方法没有具体的实现,只有方法的声明。

在Java中,使用abstract关键字来定义一个抽象类或抽象方法。如果一个类包含抽象方法,则这个类必须是抽象类。

示例代码:

abstract class Shape {abstract void draw();
}class Circle extends Shape {@Overridevoid draw() {System.out.println("Draw a circle.");}
}class Rectangle extends Shape {@Overridevoid draw() {System.out.println("Draw a rectangle.");}
}

在上述代码中,Shape类是一个抽象类,其中包含了一个抽象方法draw()。Circle类和Rectangle类都继承自Shape类,并实现了draw()方法。

需要注意的是,如果一个类继承了一个抽象类,则必须实现抽象类中的所有抽象方法,否则该类也必须声明为抽象类。

接口

接口是一种特殊的抽象类,它只定义了方法的声明而没有提供方法的实现。一个类可以实现多个接口,从而具有不同的行为特征。

在Java中,使用interface关键字来定义一个接口。接口中的方法默认都是公有的抽象方法,也可以定义常量和默认方法、静态方法。

示例代码:

interface Shape {double PI = 3.14;  // 定义常量void draw();       // 定义抽象方法default void show() {   // 定义默认方法System.out.println("This is a shape.");}static void info() {    // 定义静态方法System.out.println("This is a shape interface.");}
}class Circle implements Shape {private double radius;public Circle(double radius) {this.radius = radius;}@Overridepublic void draw() {System.out.println("Draw a circle with radius " + radius);}
}

在上述代码中,Shape接口定义了一个常量PI,以及一个抽象方法draw()、一个默认方法show()、一个静态方法info()。Circle类实现了Shape接口,并重写了其中的draw()方法。

需要注意的是,如果一个类实现了一个接口,则必须实现接口中的所有方法,否则该类必须声明为抽象类。

总结

继承和多态是面向对象编程中非常重要的概念。继承使得代码重用更加容易,同时也提高了代码的可读性和可维护性。多态是面向对象编程中一个非常强大的特性,它可以让不同的对象对同一消息做出不同的响应。

在Java中,使用extends关键字来实现继承关系,使用super关键字来调用父类的构造方法。多态可以通过方法重载和方法重写来实现,以及通过接口来实现。在进行强制类型转换时,需要注意进行类型检查,避免发生ClassCastException异常。此外,抽象类和接口也是面向对象编程中非常重要的概念,它们可以帮助我们更好地组织代码、封装数据和实现复杂功能。

6. 接口:

Java中的接口是一组抽象方法的集合。接口可以被类实现,而一个类也可以实现多个接口。接口使用interface关键字进行定义。
下面我将详细介绍Java中接口的概念、特点、使用方法及应用场景。

接口的概念

在Java中,接口是一种特殊的抽象类,它只包含方法定义和常量声明,而没有具体的方法实现。接口可以让多个不同的类实现相同的方法,从而达到代码重用的目的。同时,接口也可以用于实现回调机制(callback),即某个对象在特定情况下调用另一个对象的方法。

接口的特点

  • 接口中的所有方法都是公有的抽象方法,不包含具体的方法实现。
  • 接口中可以定义常量,但不能定义变量。
  • 接口不能被实例化,只能被实现。
  • 一个类可以实现多个接口。
  • 一个接口可以继承多个接口。

接口的使用方法

在Java中,使用关键字interface来定义一个接口。接口中的方法默认都是公有的抽象方法,可以在方法名前添加abstract关键字,但不是必须的。

示例代码:

public interface Shape {double getArea();double getPerimeter();
}

在上述代码中,定义了一个Shape接口,其中包含了两个方法getArea()和getPerimeter(),这两个方法都是公有的抽象方法。该接口可以被其他类实现,以提供不同的形状计算面积和周长的功能。

接口的实现

在Java中,使用关键字implements来实现一个接口。一个类可以实现多个接口,实现接口的类必须实现接口中声明的所有方法。

示例代码:

public class Circle implements Shape {private double radius;public Circle(double radius) {this.radius = radius;}@Overridepublic double getArea() {return Math.PI * radius * radius;}@Overridepublic double getPerimeter() {return 2 * Math.PI * radius;}
}

在上述代码中,Circle类实现了Shape接口,并重写了其中的getArea()和getPerimeter()方法。

接口的继承

在Java中,接口也可以继承另一个接口,从而允许子接口继承父接口的方法定义。

示例代码:

public interface Drawable {void draw();
}public interface Shape extends Drawable {double getArea();double getPerimeter();
}

在上述代码中,Shape接口继承了Drawable接口,并扩展了两个新的方法getArea()和getPerimeter()。

接口的应用场景

  • 实现多态:接口可以让多个不同的类实现相同的方法,从而达到代码重用的目的。
  • 实现回调机制:接口可以用于实现回调机制,即某个对象在特定情况下调用另一个对象的方法。
  • 限制类的继承:接口可以作为一种约束,限制某个类的继承关系。如果某个类实现了某个接口,就必须实现该接口中声明的所有方法。
  • 定义常量:接口可以定义常量,供其他类使用。

总之,接口是Java中非常重要的概念之一,它可以让我们更好地组织代码、封装数据和实现复杂功能。在设计API时,接口也是非常常见的一种设计模式,它可以提高 API 的可扩展性和可维护性。

7. 泛型:

泛型是Java语言中的一个强大特性,它可以使代码更加灵活和安全。使用泛型可以将类型参数化,从而使代码更好地适应不同的数据类型。

好的,下面我将详细介绍Java中泛型的概念、特点、使用方法及应用场景。

泛型的概念

在Java中,泛型(Generic)是一种参数化类型的机制,它可以让我们定义一个类或方法,使其可以支持多种不同的数据类型。通俗地说,泛型就是把数据类型作为参数传递给类或方法,从而实现代码的重用和扩展。

泛型的特点

  • 泛型支持可编译时类型检查,能够在编译时发现类型错误。
  • 泛型可以减少代码重复,提高代码的可读性和可维护性。
  • 泛型可以增加程序的灵活性和扩展性。

泛型的使用方法

在Java中,使用尖括号<>来指定泛型类型,例如:

List<String> list = new ArrayList<>();

在上述代码中,List是一个泛型接口,其中包含了多个操作列表的方法,String表示元素的类型,ArrayList是一个基于数组实现的 List 接口的可变长度的数组序列。

泛型类

在Java中,我们可以定义一个泛型类,使其可以支持多种不同类型的对象。泛型类在定义时要在类名后面添加类型参数,如下所示:

public class Box<T> {private T data;public Box(T data) {this.data = data;}public T getData() {return data;}
}

在上述代码中,Box类是一个泛型类,其中定义了一个类型参数T,表示Box可以存储任意类型的数据。在创建Box对象时,需要指定T的具体类型。

泛型方法

在Java中,我们也可以定义一个泛型方法,使其可以支持多种不同类型的参数。泛型方法在定义时要在方法名前面添加类型参数,如下所示:

public class ArrayUtil {public static <T> void printArray(T[] array) {for (T element : array) {System.out.printf("%s ", element);}System.out.println();}
}

在上述代码中,printArray()是一个泛型方法,其中定义了一个类型参数T,表示该方法可以处理任意类型的数组。在调用printArray()方法时,需要指定T的具体类型。

通配符

在Java中,我们可以使用通配符(wildcard)来表示某种类型的子类或父类。

  • ? extends T 表示某种类型的子类。
  • ? super T 表示某种类型的父类。

示例代码:

public class Animal {}
public class Dog extends Animal {}List<? extends Animal> list1 = new ArrayList<Dog>(); // 子类向父类转换
List<? super Dog> list2 = new ArrayList<Animal>(); // 父类向子类转换

在上述代码中,list1表示包含所有Animal的子类的List,可以接收Dog类型的List;list2表示包含所有Dog的父类的List,可以接收Animal类型的List。这样就可以实现子类向父类转换和父类向子类转换。

泛型的应用场景

  • 集合类:Java中的集合类(如List、Set、Map等)都是使用泛型来实现的。
  • 接口与抽象类:泛型可以被用于接口和抽象类中,使其支持多种不同类型的对象。
  • 类型安全:泛型可以保证编写类型安全的代码,避免了强制类型转换时的运行时错误。
  • 反射机制:泛型可以与反射机制相结合,使得我们可以在运行时获取到泛型信息。

总之,泛型是Java中非常重要的概念之一,泛型可以使我们在编译时发现类型错误,从而提高代码的健壮性和可读性。它还可以减少代码重复,提高代码的可维护性和可扩展性。

二,泛型不仅适用于类,还适用于方法。在定义泛型方法时,需要在方法名前面添加类型参数。

三,通配符是泛型中一个非常重要的概念,它可以用来表示某种类型的子类或父类。比如List<? extends Number>表示包含所有Number的子类的List,而List<? super Integer>表示包含所有Integer的父类的List。

四,泛型的应用场景非常广泛,常见的有集合类、接口和抽象类、类型安全和反射机制等等。

下面是一些使用泛型的示例代码:

泛型类

public class Box<T> {private T data;public Box(T data) {this.data = data;}public T getData() {return data;}
}

在上述代码中,Box是一个泛型类,其中定义了一个类型参数T,表示Box可以存储任意类型的数据。

泛型方法

public class ArrayUtil {public static <T> void printArray(T[] array) {for (T element : array) {System.out.printf("%s ", element);}System.out.println();}
}

在上述代码中,printArray()是一个泛型方法,其中定义了一个类型参数T,表示该方法可以处理任意类型的数组。

通配符

public class Animal {}
public class Dog extends Animal {}List<? extends Animal> list1 = new ArrayList<Dog>(); // 子类向父类转换
List<? super Dog> list2 = new ArrayList<Animal>(); // 父类向子类转换

在上述代码中,list1表示包含所有Animal的子类的List,可以接收Dog类型的List;list2表示包含所有Dog的父类的List,可以接收Animal类型的List。这样就可以实现子类向父类转换和父类向子类转换。

泛型接口

public interface Comparable<T> {int compareTo(T o);
}

在上述代码中,Comparable是一个泛型接口,其中定义了一个类型参数T,表示Comparable可以比较任意类型的对象。

泛型枚举

public enum Color {RED, GREEN, BLUE}
public enum Size {SMALL, MEDIUM, LARGE}public class Shirt<T extends Enum<T>> {private T color;private T size;public Shirt(T color, T size) {this.color = color;this.size = size;}public T getColor() {return color;}public T getSize() {return size;}
}

在上述代码中,Shirt是一个泛型类,其中定义了两个类型参数T和E。T必须是一个枚举类型(如Color或Size),E必须是实现了Comparable接口的类型。这样就可以创建一个泛型枚举类,用于表示衬衫的颜色和大小。

总之,泛型是Java中非常重要的概念之一,它可以让我们编写更健壮、更灵活和更可扩展的代码。在实际开发中,我们应该熟练掌握泛型的语法和使用方法,以便更好地完成自己的工作。

相关文章:

Java——基础语法(二)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

数据结构----算法--分治,快速幂

数据结构----算法–分治,快速幂 一.分治 1.分治的概念 分治法&#xff1a;分而治之 将一个问题拆解成若干个解决方式完全相同的问题 满足分治的四个条件 1.问题难度随着数据规模缩小而降低 2.问题可拆分 3.子问题间相互独立 4.子问题的解可合并 2.二分查找(折半搜索)…...

【ChatGPT 指令大全】怎么使用ChatGPT写履历和通过面试

目录 怎么使用ChatGPT写履历 寻求履历的反馈 为履历加上量化数据 把经历修精简 为不同公司客制化撰写履历 怎么使用ChatGPT通过面试 汇整面试题目 给予回馈 提供追问的问题 用 STAR 原则回答面试问题 感谢面试官的 email 总结 在职场竞争激烈的今天&#xff0c;写一…...

微服务:从header中获取用户存入当前线程

1、从网关gateway工程filter中解析token携带的当前用户信息并添加到header中 //获取token携带的idObject userid claimsBody.get("id");//在header中添加新的信息ServerHttpRequest serverHttpRequest request.mutate().headers(httpHeaders -> {httpHeaders.ad…...

C语言系列之原码、反码和补码

一.欢迎来到我的酒馆 讨论c语言中&#xff0c;原码、反码、补码。 目录 一.欢迎来到我的酒馆二.原码 二.原码 2.1在计算机中&#xff0c;所有数据都是以二进制存储的&#xff0c;但不是直接存储二进制数&#xff0c;而是存储二进制的补码。原码很好理解&#xff0c;就是对应的…...

程序框架——UI管理模块

UI基类BasePanel 负责帮助我们通过代码快速的找到所有的子控件&#xff0c;方便我们在子类中处理逻辑&#xff0c;节约找控件的工作量。 public class BasePanel : MonoBehaviour {//通过里式转换原则 来存储所有的控件private Dictionary<string, List<UIBehaviour>…...

MySQL 慢查询探究分析

目录 背景&#xff1a; mysql 整体结构&#xff1a; SQL查询语句执行过程是怎样的&#xff1a; 知道了mysql的整体架构&#xff0c;那么一条查询语句是怎么被执行的呢&#xff1a; 什么是索引&#xff1a; 建立索引越多越好吗&#xff1a;   如何发现慢查询&#xff1…...

wpf 项目中使用 Prism + MaterialDesign

1.通过nuget安装MaterialDesign 2.通过nuget安装Prism 3.修改App.xmal <prism:PrismApplication x:Class"VisionMeasureGlue.App"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/…...

【Spring Boot】Thymeleaf模板引擎 — Thymeleaf页面布局

Thymeleaf页面布局 熟悉Thymeleaf的语法和表达式后&#xff0c;后面开发起来会更加得心应手。接下来好好研究一下Thymeleaf如何实现完整的Web系统页面布局。 1.引入代码片段 在模板中经常希望包含来自其他模板页面的内容&#xff0c;如页脚、页眉、菜单等。为了做到这一点&a…...

整理mongodb文档:删

个人博客 整理mongodb文档:删 求关注&#xff0c;哪儿不足&#xff0c;求大佬们指出&#xff0c;哪儿写的不够通俗易懂跟清晰&#xff0c;也求指出 文章概叙 本文主要是介绍了删除数据的几个方法&#xff0c;主要还是在介绍deleteMany、deleteOne以及remove&#xff0c;对于…...

篇二十三:设计模式的综合实例:构建完整项目

篇二十三&#xff1a;"设计模式的综合实例&#xff1a;构建完整项目" 开始本篇文章之前先推荐一个好用的学习工具&#xff0c;AIRIght&#xff0c;借助于AI助手工具&#xff0c;学习事半功倍。欢迎访问&#xff1a;http://airight.fun/。 另外有2本不错的关于设计模…...

FFmpeg常见命令行(三):FFmpeg转码

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个&#xff0c; 对应的要学习的内容是&#xff1a;如何使…...

合宙Air724UG LuatOS-Air script lib API--scanCode

Table of Contents scanCode scanCode.request(cbFnc, timeout) scanCode 模块功能&#xff1a;扫码. 支持二维码、条形码扫描 scanCode.request(cbFnc, timeout) 设置扫码请求 参数 名称 传入值类型 释义 cbFnc function 扫码返回或者超时未返回的回调函数&#xff0c;回调…...

2023年新手如何学剪辑视频 想学视频剪辑如何入门

随着短视频、vlog等媒体形式的兴起&#xff0c;视频剪辑已经成为了热门技能。甚至有人说&#xff0c;不会修图可以&#xff0c;但不能不会剪视频。实际上&#xff0c;随着各种智能软件的发展&#xff0c;视频剪辑已经变得越来越简单。接下来&#xff0c;一起来看看新手如何学剪…...

C++的auto究竟是何方神圣

C的auto究竟是何方神圣 前言&#x1f64c;auto&#xff08;C 11&#xff09; 的使用细则auto是什么&#xff1f; auto声明的变量是在什么时期被编译器推导出来呢&#xff1f;为什么使用auto进行定义变量时&#xff0c;必须进行初始化&#xff1f; auto 的使用场景auto与指针和引…...

网络安全【黑客】面试题汇总

前言 一眨眼2023年已经过去一大半&#xff0c;不知道大家有没有找到心仪的工作。作为一个安全老鸟&#xff0c;工作这么多年&#xff0c;面试过很多人也出过很多面试题目&#xff0c;也在网上收集了各类关于渗透面试题目&#xff0c;里面有我对一些问题的见解&#xff0c;希望…...

docker菜谱大全

记录docker常用软件安装&#xff0c;感谢小马哥和杨师傅的投稿。&#x1f60e;&#x1f60e;&#x1f60e; 相关文档&#xff1a; DockerHub&#xff1a;https://hub.docker.com/Linux手册&#xff1a;https://linuxcool.com/Docker文档&#xff1a;https://docs.docker.com/Do…...

git: git checkout命令

git checkout 命令在Git中有不同的用法和功能&#xff0c;具体取决于您在命令后面提供的参数。以下是一些常见的用法&#xff1a; 1. 切换分支&#xff1a;您可以使用 git checkout <branch> 切换到指定的分支。例如&#xff0c;要切换到名为 "feature-branch"…...

以游戏编程的角度看待模拟时间的算法题——以PAT甲级1026 Table Tennis为例

对于需要模拟时间的算法题&#xff0c;可以将开始时间作为游戏的开始&#xff08;如Unity的Start或UE的BeginPlay&#xff09;&#xff0c;每一秒的模拟作为游戏的画面更新&#xff08;如Unity的Update或UE的Tick&#xff09;&#xff0c;结束时间可作为游戏的结束&#xff08;…...

SNAT与DNAT原理

SNAT和DNAT &#xff08;源地址转换和目标地址转换&#xff09; SNAT&#xff1a;源地址转换。内网到外网转换的是源地址。 DNAT&#xff1a;目标地址转换&#xff1a;外网到内网转换的是目的地址 &#xff08;把内部服务器的ip地址转换成一个所有人都可以访问的地址&#xff0…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 &#xff09; 缓存工作原理分析 在了解了本地缓存和远程缓存之后&#xff0c;我们来探究缓存是如何工作的。以计算文件的哈希串为例&#xff0c;若后续运行任务时文件哈希串未变&#xff0c;系统会直接使用对应的输出和制品文件。 2 …...

FTXUI::Dom 模块

DOM 模块定义了分层的 FTXUI::Element 树&#xff0c;可用于构建复杂的终端界面&#xff0c;支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...

GeoServer发布PostgreSQL图层后WFS查询无主键字段

在使用 GeoServer&#xff08;版本 2.22.2&#xff09; 发布 PostgreSQL&#xff08;PostGIS&#xff09;中的表为地图服务时&#xff0c;常常会遇到一个小问题&#xff1a; WFS 查询中&#xff0c;主键字段&#xff08;如 id&#xff09;莫名其妙地消失了&#xff01; 即使你在…...

SpringCloud优势

目录 完善的微服务支持 高可用性和容错性 灵活的配置管理 强大的服务网关 分布式追踪能力 丰富的社区生态 易于与其他技术栈集成 完善的微服务支持 Spring Cloud 提供了一整套工具和组件来支持微服务架构的开发,包括服务注册与发现、负载均衡、断路器、配置管理等功能…...

【AI News | 20250609】每日AI进展

AI Repos 1、OpenHands-Versa OpenHands-Versa 是一个通用型 AI 智能体&#xff0c;通过结合代码编辑与执行、网络搜索、多模态网络浏览和文件访问等通用工具&#xff0c;在软件工程、网络导航和工作流自动化等多个领域展现出卓越性能。它在 SWE-Bench Multimodal、GAIA 和 Th…...