TypeScript ~ TS 面向对象编程 ⑧

news2024/11/25 0:32:28

请添加图片描述

@作者 : SYFStrive

 
请添加图片描述

@博客首页 : HomePage

📜: TypeScript ~ TS

📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗

📌:觉得文章不错可以点点关注 👉:专栏连接🔗

💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞

请添加图片描述
相关专栏

👉 微信小程序(🔥)
👉 UNIAPP开发(🔥)


                    ⡖⠒⠒⠒⠤⢄⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸   ⠀⠀⠀⡼⠀⠀⠀⠀ ⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢶⣲⡴⣗⣲⡦⢤⡏⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠋⠉⠉⠓⠛⠿⢷⣶⣦⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠇⠀⠀⠀⠀⠀⠀⠘⡇⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡞⠀⠀⠀⠀⠀⠀⠀⢰⠇⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⡴⠊⠉⠳⡄⠀⢀⣀⣀⡀⠀⣸⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠰⠆⣿⡞⠉⠀⠀⠉⠲⡏⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠈⢧⡀⣀⡴⠛⡇⠀⠈⠃⠀⠀⡗⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣱⠃⡴⠙⠢⠤⣀⠤⡾⠁⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢀⡇⣇⡼⠁⠀⠀⠀⠀⢰⠃⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⣸⢠⣉⣀⡴⠙⠀⠀⠀⣼⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⡏⠀⠈⠁⠀⠀⠀⠀⢀⡇⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠀⠀⠀⠀⠀⠀⡼⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⣰⠃⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣀⠤⠚⣶⡀⢠⠄⡰⠃⣠⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⢀⣠⠔⣋⣷⣠⡞⠀⠉⠙⠛⠋⢩⡀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀
⠀⡏⢴⠋⠁⠀⣸⠁⠀⠀⠀⠀⠀ ⠀⣹⢦⣶⡛⠳⣄⠀⠀⠀⠀⠀
⠀⠙⣌⠳⣄⠀⡇   不能   ⡏⠀⠀  ⠈⠳⡌⣦⠀⠀⠀⠀
⠀⠀⠈⢳⣈⣻⡇   白嫖 ⢰⣇⣀⡠⠴⢊⡡⠋⠀⠀⠀⠀
⠀⠀⠀⠀⠳⢿⡇⠀⠀⠀⠀⠀⠀⢸⣻⣶⡶⠊⠁⠀⠀
⠀⠀⠀⠀⠀⢠⠟⠙⠓⠒⠒⠒⠒⢾⡛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⣠⠏⠀⣸⠏⠉⠉⠳⣄⠀⠙⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⡰⠃⠀⡴⠃⠀⠀⠀⠀⠈⢦⡀⠈⠳⡄⠀⠀⠀⠀⠀⠀⠀
⠀⠀⣸⠳⣤⠎⠀⠀⠀⠀⠀⠀⠀⠀⠙⢄⡤⢯⡀⠀⠀⠀⠀⠀⠀
⠀⠐⡇⠸⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⡆⢳⠀⠀⠀⠀⠀⠀
⠀⠀⠹⡄⠹⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣇⠸⡆⠀⠀⠀⠀⠀
⠀⠀⠀⠹⡄⢳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⡀⣧⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢹⡤⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣷⠚⣆⠀⠀⠀⠀
⠀⠀⠀⡠⠊⠉⠉⢹⡀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡎⠉⠀⠙⢦⡀⠀
⠀⠀⠾⠤⠤⠶⠒⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠒⠲⠤⠽   

提示:以下是本篇文章正文内容

T y p e S c r i p t TypeScript TypeScript 简介


  1. TypeScript是JavaScript的超集。
  2. 它对JS进行了扩展,向JS中引入了类型的概念,并添加了许多新的特性。
  3. TS代码需要通过编译器编译为 → JS,然后再交由JS解析器执行。
  4. TS完全兼容JS,换言之,任何的JS代码都可以直接当成JS使用。
  5. 相较于JS而言,TS拥有了静态类型,更加严格的语法,更强大的功能;TS可以在代码执行前就完成代码的检查,减小了运行时异常的出现的几率;TS代码可以编译为任意版本的JS代码,可有效解决不同JS运行环境的兼容问题;同样的功能,TS的代码量要大于JS,但由于TS的代码结构更加清晰,变量类型更加明确,在后期代码的维护中TS却远远胜于JS

T y p e S c r i p t TypeScript TypeScript 开发环境搭建

  1. 官方 https://www.tslang.cn/index.html

  2. 下载Node.js

    • 64位:https://nodejs.org/dist/v14.15.1/node-v14.15.1-x64.msi
    • 32位:https://nodejs.org/dist/v14.15.1/node-v14.15.1-x86.msi
  3. 安装Node.js

  4. 使用npm全局安装typescript

    • 进入命令行
    • 输入:npm i -g typescript
  5. 创建一个ts文件

  6. 使用tsc对ts文件进行编译

    • 进入命令行

    • 进入ts文件所在目录

    • 执行命令:tsc xxx.ts

T y p e S c r i p t TypeScript TypeScript O b j e c t − O r i e n t e d Object-Oriented ObjectOriented

  • 概念 :面向对象是程序中一个非常重要的思想,它被很多同学理解成了一个比较难,比较深奥的问题,其实不然。面向对象很简单,简而言之就是程序之中所有的操作都需要通过对象来完成。
  • 举例来说

    • 操作浏览器要使用window对象
    • 操作网页要使用document对象
    • 操作控制台要使用console对象
  • 面向对象理解 : 在程序中所有的对象都被分成了两个部分数据和功能,以人为例,人的姓名、性别、年龄、身高、体重等属于数据,人可以说话、走路、吃饭、睡觉这些属于人的功能。数据在对象中被成为属性 ,而功能就被称为方法。所以简而言之,在程序中 一切皆是对象

1、 🥖 类 ( C l a s s ) (Class) Class

  • 概念 : 要想面向对象,操作对象,首先便要拥有对象,那么下一个问题就是如何创建对象。要创建对象,必须要先定义类,所谓的类可以理解为对象的模型,程序中可以根据类创建指定类型的对象,举例来说:可以通过Person类来创建人的对象,通过Dog类创建狗的对象,通过Car类来创建汽车的对象,不同的类可以用来创建不同的对象。

  • 定义类

class 类名 {
	属性名: 类型;
	
	constructor(参数: 类型){
		this.属性名 = 参数;
	}
	
	方法名(){
		....
	}
}
  • 示例
class Person{
	//实例属性
    name: string;
    age: number;
    
    // constructor 被称为构造函数  构造函数会在对象创建时调用
    constructor(name: string, age: number){
        // 在实例方法中,this就表示当前当前的实例
        // 在构造函数中当前对象就是当前新建的那个对象
        // 可以通过this向新建的对象中添加属性
        this.name = name;
        this.age = age;
    }

    sayHello(){
        console.log(`大家好,我是${this.name}`);
    }
}
  • 使用类
const p = new Person('孙悟空', 18);
p.sayHello();

2、 🥖面向对象的特点 ( c h a r a c t e r i s t i c ) (characteristic) characteristic

  • 面向对象的三个特征 : 封装,继承,多态

 🗡 E n c a p s u l a t i o n Encapsulation Encapsulation 封装

  • 对象实质上就是属性和方法的容器,它的主要作用就是存储属性和方法,这就是所谓的封装

  • 默认情况下,对象的属性是可以任意的修改的,为了确保数据的安全性,在TS中可以对属性的权限进行设置

  • 只读属性 ( R e a d o n l y ) (Readonly) Readonly

    • 如果在声明属性时添加一个 R e a d o n l y Readonly Readonly,则属性便成了只读属性无法修改
  • TS中属性具有三种修饰符

    • p u b l i c public public(默认值),可以在类、子类和对象中修改
    • p r o t e c t e d protected protected ,可以在类、子类中修改
    • p r i v a t e private private ,可以在类中修改
  • P u b l i c Public Public 示例 ↓

class Person{
   public name: string; // 写或什么都不写都是public
   public age: number;

   constructor(name: string, age: number){
       this.name = name; // 可以在类中修改
       this.age = age;
   }

   sayHello(){
       console.log(`大家好,我是${this.name}`);
   }
}

class Employee extends Person{
   constructor(name: string, age: number){
       super(name, age);
       this.name = name; //子类中可以修改
   }
}

const p = new Person('孙悟空', 18);
p.name = '猪八戒';// 可以通过对象修改
  • P r o t e c t e d Protected Protected 示例 ↓
class Person{
   protected name: string;
   protected age: number;

   constructor(name: string, age: number){
       this.name = name; // 可以修改
       this.age = age;
   }

   sayHello(){
       console.log(`大家好,我是${this.name}`);
   }
}

class Employee extends Person{
   constructor(name: string, age: number){
       super(name, age);
       this.name = name; //子类中可以修改
   }
}

const p = new Person('孙悟空', 18);
p.name = '猪八戒';// 不能修改
  • $Private $ 示例 ↓
class Person{
   private name: string;
   private age: number;

   constructor(name: string, age: number){
       this.name = name; // 可以修改
       this.age = age;
   }

   sayHello(){
       console.log(`大家好,我是${this.name}`);
   }
}

class Employee extends Person{
   constructor(name: string, age: number){
       super(name, age);
       this.name = name; //子类中不能修改
   }
}

const p = new Person('孙悟空', 18);
p.name = '猪八戒';// 不能修改

   1、属性存取器

  • 对于一些不希望被任意修改的属性,可以将其设置为private

  • 直接将其设置为private将导致无法再通过对象修改其中的属性

  • 我们可以在类中定义一组读取、设置属性的方法,这种对属性读取或设置的属性被称为属性的存取器

  • 读取属性的方法叫做getter方法,设置属性的方法叫做setter方法

  • 示例 ↓
class Person{
	private _name: string;
	
	 constructor(name: string){
	     this._name = name;
	 }
	
	 get name(){
	     return this._name;
	 }
	
	 set name(name: string){
	     this._name = name;
	 }
}
	
const p1 = new Person('孙悟空');
console.log(p1.name); // 通过getter读取name属性
p1.name = '猪八戒'; // 通过setter修改name属性

   2、静态属性

  • 静态属性(方法),也称为类属性。使用静态属性无需创建实例,通过类即可直接使用

  • 静态属性(方法)使用static开头

  • 示例 ↓

class Tools{
    static PI = 3.1415926;
    
    static sum(num1: number, num2: number){
        return num1 + num2
    }
}

console.log(Tools.PI);
console.log(Tools.sum(123, 456));   

    3 、 T h i s 3、This 3This

  • 在类中,使用 T h i s This This表示当前对象

 🗡 I n h e r i t Inherit Inherit 继承

  • 继承时面向对象中的又一个特性

  • 通过继承可以将其他类中的属性和方法引入到当前类中

  • 示例 ↓

class Animal{
    name: string;
    age: number;

    constructor(name: string, age: number){
        this.name = name;
        this.age = age;
    }
}

/*
* Dog extends Animal
*   - 此时,Animal被称为父类,Dog被称为子类
*   - 使用继承后,子类将会拥有父类所有的方法和属性
*   - 通过继承可以将多个类中共有的代码写在一个父类中,
*       这样只需要写一次即可让所有的子类都同时拥有父类中的属性和方法
*       如果希望在子类中添加一些父类中没有的属性或方法直接加就行
*   - 如果在子类中添加了和父类相同的方法,则子类方法会覆盖掉父类的方法
*       这种子类覆盖掉父类方法的形式,我们称为方法重写
*/
class Dog extends Animal{
    bark(){
        console.log(`${this.name}在汪汪叫!`);
    }
}

const dog = new Dog('旺财', 4);
dog.bark();

 🗡 R e w r i t e Rewrite Rewrite 重写

  • 发生继承时,如果子类中的方法会替换掉父类中的同名方法,这就称为方法的重写
  • 示例 ↓
class Animal{
    name: string;
    age: number;

    constructor(name: string, age: number){
        this.name = name;
        this.age = age;
    }

    run(){
        console.log(`父类中的run方法!`);
    }
}

class Dog extends Animal{

    bark(){
        console.log(`${this.name}在汪汪叫!`);
    }

    run(){
        console.log(`子类中的run方法,会重写父类中的run方法!`);
    }
}

const dog = new Dog('旺财', 4);
dog.bark();
  • 在子类中可以使用Super来完成对父类的引用
class Person {

    name: string
    age: number

    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }
}

class SpiritPerson extends Person {
    name: string
    age: number
    sex: string

    constructor(name: string, age: number, sex: string) {
        super(name, age);
        this.sex = sex
    }
}

let sp = new SpiritPerson("暗夜精灵",32,'无法确定')

console.log(sp.name)
console.log(sp.age)
console.log(sp.sex)

 🗡 ( A b s t r a c t (Abstract Abstract C l a s s ) Class) Class 抽象类

  • 抽象类是专门用来被其他类所继承的类,它只能被其他类所继承不能用来创建实例

/*
*   以abstract开头的类是抽象类,
*       抽象类和其他类区别不大,只是不能用来创建对象
*       抽象类就是专门用来被继承的类
*       抽象类中可以添加抽象方法
*/
 abstract class Animal{
     // 定义一个抽象方法
     // 抽象方法使用 abstract开头,没有方法体
     // 抽象方法只能定义在抽象类中,子类必须对抽象方法进行重写
     abstract run(): void;
     bark(){
         console.log('动物在叫~');
     }
 }
 
 class Dog extends Animals{
     run(){
         console.log('狗在跑~');
     }
 }
  • 使用abstract开头的方法叫做抽象方法,抽象方法没有方法体只能定义在抽象类中,继承抽象类时抽象方法必须要实现

3、 🥖接口 ( I n t e r f a c e ) (Interface) Interface

  • 什么是接口 : 接口的作用类似于抽象类,不同点在于接口中的所有方法和属性都是没有实值的,换句话说接口中的所有方法都是抽象方法。接口主要负责定义一个类的结构,接口可以去限制一个对象的接口,对象只有包含接口中定义的所有属性和方法时才能匹配接口。同时,可以让一个类去实现接口,实现接口时类中要保护接口中的所有属性。
  • 普通对象示例(描述一个对象的类型)
// 描述一个对象的类型
type myType = {
    name: string,
    age: number
}

function myTypeFun(obj: myType) {

    console.log(obj)
}

myTypeFun({name: '小明', age: 12})
  • 接口示例1(检查对象类型)
//接口类型
interface Person{
  name: string;
  sayHello():void;
}

function fn(per: Person){
   per.sayHello();
}

fn({name:'孙悟空', sayHello() {console.log(`Hello, 我是 ${this.name}`)}});
  • 接口示例2(检查对象类型)
//接口用来定义一个类结构,用来定义一个类中应该包含哪些属性和方法
//同时接口也可以当成类型声明去使用
// 接口可以在定义类的时候去限制类的结构,
//  接口中的所有的属性都不能有实际的值
//  接口只定义对象的结构,而不考虑实际值
//  在接口中所有的方法都是抽象方法
interface Person {
    name: string;

    sayHello(): void;
}

/*
* 定义类时,可以使类去实现一个接口,
*   实现接口就是使类满足接口的要求
*/
class Student implements Person {

    constructor(public name: string) {
        console.log("构造函数", '~', name + '!')
    }

    sayHello() {
        console.log('大家好,我是' + this.name + '!');
    }
}

let studio = new Student('小明')
studio.sayHello()

4、 🥖泛型 ( G e n e r i c ) (Generic) Generic

  • 泛型 : 定义一个函数或类时,有些情况下无法确定其中要使用的具体类型(返回值、参数、属性的类型不能确定),此时泛型便能够发挥作用。

  • 举个例子 ↓

function test(arg: any): any{
	return arg;
}
  • 上例中,test函数有一个参数类型不确定,但是能确定的时其返回值的类型和参数的类型是相同的,由于类型不确定所以参数和返回值均使用了any,但是很明显这样做是不合适的,首先使用any会关闭TS的类型检查,其次这样设置也不能体现出参数和返回值是相同的类型

  • 使用泛型 ↓
function test<T>(arg: T): T{
	return arg;
}
  • 这里的<T>就是泛型,T是我们给这个类型起的名字(不一定非叫T),设置泛型后即可在函数中使用T来表示该类型。所以泛型其实很好理解,就表示某个类型。

  • 那么如何使用上边的函数呢?

    • 方式一(直接使用):
test(10)
  • 使用时可以直接传递参数使用,类型会由TS自动推断出来,但有时编译器无法自动推断时还需要使用下面的方式

    • 方式二(指定类型):
test<number>(10)

  • 也可以在函数后手动指定泛型 → 可以同时指定多个泛型,泛型间使用逗号隔开 ↓
function test<T, K>(a: T, b: K): K{
	return b;
}
      
test<number, string>(10, "hello");

  • 使用泛型时,完全可以将泛型当成是一个普通的类去使用 , 可以同时指定多个泛型,泛型间使用逗号隔开 ↓
class MyClass<T,k>{
    prop: T;
    prop1: K;

    constructor(prop: T,prop2:K){
        this.prop = prop;
		this.prop1 = prop1; 
    }
}

  • 除此之外,也可以对泛型的范围进行约束
interface MyInter{
    length: number;
}

function test<T extends MyInter>(arg: T): number{
    return arg.length;
}

text("hello world!") //执行
text(25) //报错
  • 使用T extends MyInter表示泛型T必须是MyInter的子类,不一定非要使用接口类和抽象类同样适用。

总结

以上是个人学习TypeScript的相关知识点,一点一滴的记录了下来,有问题请评论区指正,共同进步,这才是我写文章的原因之,如果这篇文章对您有帮助请三连支持一波

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

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

相关文章

6. Redis缓存设计与性能优化

分布式缓存技术Redis 1. 多级缓存架构2. 缓存设计2.1 缓存穿透2.2 缓存失效(击穿)2.3 缓存雪崩2.4 热点缓存key重建优化2.5 缓存与数据库双写不一致 3. 开发规范与性能优化3.1 键值设计3.1.1 key名设计3.1.2 value设计 3.2 命令使用3.3 三、客户端使用 4. 系统内核参数优化 本文…

3-2 Named tensors

这里有一张图像img_t 彩色图像可以看作一个矩阵&#xff0c;只是矩阵中的每一个点不是一个值&#xff0c;而是包含3个值的数组&#xff0c;这3个值就是RGB值 我们给它随机化为一个形状为 [3, 5, 5] 的三维张量img_t img_t torch.randn(3, 5, 5) # shape [channels, rows, co…

数据库是如何工作的

数据库是如何工作的 注&#xff1a; 本文翻译自db_tutorial. 数据库计算机世界的一个基础软件&#xff0c;要想深入了解数据库&#xff0c;就不得不思考如下几个问题&#xff1a; 数据以什么格式保存&#xff1f;&#xff08;在内存和磁盘上&#xff09;它何时从内存移动到磁…

永磁同步电机的矢量控制PMSM仿真(matlab仿真与图像处理系列第一期)

永磁同步电机(Permanent Magnet Synchronous Motor, PMSM) PMSM具有高效率、高功率密度和快速响应等特点,在现代工业中得到了广泛应用。而矢量控制是一种广泛应用于永磁同步电机的高精度控制方法,它能够实现永磁同步电机的快速、准确、稳定的运行。 矢量控制 矢量控制的…

Android自定义View合集

文章目录 自定义QQ步数QQ计步效果分析自定义View分析的常用步骤自定义属性获取自定义属性画外圆弧画内圆画文字增加动画让其动起来 自定义评分控件RatingBar自定义评分View效果分析自定义属性获取自定义属性重写onMeasure()方法画出对应数量的星星触摸事件处理 自定义酷狗侧滑菜…

Ubuntu设置无线wifi的静态IP

安装 net-tools sudo apt install net-tools 输入ifconfig查看当前网络ip地址&#xff1a; pulsarpulsar:~$ ifconfig docker0: flags4099<UP,BROADCAST,MULTICAST> mtu 1500inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255ether 02:42:02:8c:87:a…

Linux下使用Mysql数据库忘记密码问题解决

​ 方法1查看初始化密码进行登录&#xff1a; 查看mysql的初始密码 在rootlocalhost后面的就是mysql初始的密码&#xff0c;以上图为例 初始密码则为&#xff1a;ukehBfivW1 方法2直接跳过数据库密码验证&#xff1a; 1、用vi指令进入mysql配置文件/etc/my.cnf并修改 在最后…

jmeter的web接口测试

目录 前言&#xff1a; 一、安装Jmeter 二、添加HTTP接口测试 三、添加新的POST请求 四、添加断言 前言&#xff1a; 使用JMeter进行Web接口测试是一种常见的应用场景。 一、安装Jmeter 二、添加HTTP接口测试 我们的所以工具都会在Jmeter工具中完成&#xff0c;接来就…

python爬虫之Scrapy框架--测试调试--保存数据

目录 ScrapyShell 启动ScrapyShell 基本方法 注意 保存数据到文件 方法一 使用python原生方式保存 方法二 使用Scrapy内置方式 方法三 Item Pipeline的使用 功能 ScrapyShell ScrapyShell是Scrapy框架提供的一个交互式的开发工具&#xff0c;用于调试和测试爬虫&…

数学建模-数据的处理

MATLAB数学建模方法与实践&#xff08;第3版&#xff09;——读书笔记 数据的准备数据获取数据处理缺失值处理噪音过滤数据集成数据归约数据变换标准化离散化 数据统计基本描述性统计分布描述性统计 数据可视化数据降维主成分分析&#xff08;PCA&#xff09;相关系数降维 数据…

K8S 使用(1)- 基本命令

根据上文完成部署k8s后&#xff0c;我们需要了解如何使用k8s.首先我们需要了解如何使用K8S的一些基础命令及主要概念。 尚不清楚如何部署的请参考&#xff1a;单master部署简要步骤 如果您熟悉了k8s基本命令&#xff0c;可以跳过此章节。 目录 先看一下这张图 2. 节点 nod…

2.2、IOC容器的实现流程

​一、类图 二、容器的实现接口 Spring容器并不是只有一个。Spring自带多个容器实现&#xff0c;可以归位两种不同的类型。 &#xff08;1&#xff09;Bean工厂&#xff08;由org.springframework.beans.factory.BeanFactory接口定义&#xff09;是简单的容器实现工厂&#x…

数学内容的概述

前言 作为一名文科生&#xff0c;学习编程最大的阻碍莫过于数学知识。 学习数学的必要性 跟开发APP和后台服务器相比&#xff0c;机器学习、深度学习需要大量的数学知识。 数据处理和清洗&#xff1a;数据分析涉及大量的数据处理和清洗工作&#xff0c;需要掌握基本的数学概…

linux系统LAMP架构

文章目录 一、LAMP简介与概述二、LAMP各组件主要作用1.构建LAMP平台顺序 三、编译安装Apache httpd服务1.将所需软件安装包下载到/opt目录下解压2.移动两个文件并改名3.安装依赖环境4.编译安装5.做软连接&#xff0c;使文件可执行6.优化配置文件路径&#xff0c;并把httpd服务的…

《面试1v1》Redis主从架构

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

crossover虚拟机软件好用吗?22.1.1版本有哪些优点

苹果系统虽然安全稳定&#xff0c;但有些应用程序并不提供苹果系统的安装包&#xff0c;使用双系统或在苹果电脑安装虚拟机可以帮我们提升设备使用效率&#xff0c;除了这两种解决方案外&#xff0c;还可以使用类虚拟机软件crossover&#xff0c;crossover mac的优点在于不会占…

使用HTTP/2实现服务端主动推送消息给客户端

77. 使用HTTP/2实现服务端主动推送消息给客户端 HTTP/2协议的服务器主动推送机制是通过服务器在接收到客户端请求后&#xff0c;主动向客户端推送相关资源的方式来实现的。下面将详细解释如何在服务器端和客户端实现HTTP/2的服务器主动推送&#xff0c;并给出相应的代码示例。…

华为OD机试真题(Java),素数伴侣(100%通过+复盘思路)

一、题目描述 若两个正整数的和为素数&#xff0c;则这两个正整数称之为“素数伴侣”&#xff0c;如2和5、6和13&#xff0c;它们能应用于通信加密。现在密码学会请你设计一个程序&#xff0c;从已有的 N &#xff08; N 为偶数&#xff09;个正整数中挑选出若干对组成“素数伴…

老鸟是这样实现springboot日志打印的~

文章目录 前言一、实现一个全局日志打印二、使用步骤1. 新增一个自定义注解2. 拦截注解,并实现相应的打印日志功能3. 使用 总结 前言 项目中有时候为了与前端,与后端(微服务/远程调用http) 等撕逼,我们不得不做好应对措施,最终的就是打印清晰我们的入参出参日志,这为以后撕逼,…

Nik Silver Efex 黑白胶片效果滤镜

Nik Silver Efex 为获得优质黑白效果而精心设计算法&#xff0c;是世界领先级的黑白胶片滤镜集。 内置 64 个黑白&#xff08;包括单色、双色等&#xff09;预设供选择&#xff0c;主要分为经典 Classic、现代 Modern、复古 Vintage、阿弗格 En Vogue等四大风格&#xff0c;另外…