C# 面向对象
C# 面向对象编程
面向过程:一件事情分成多个步骤来完成。
把大象装进冰箱 (面向过程化设计思想)。走一步看一步。
1、打开冰箱门
2、把大象放进冰箱
3、关闭冰箱门
面向对象:以对象作为主体
把大象装进冰箱
1、抽取对象 大象 冰箱 门 (全局规划)。
2、找有没有工具可以帮助我来完成这个操作 (找对象帮自己完成任务)
3、组织工具执行合理逻辑。
4、大象
5、冰箱 装东西
6、门 (开门和关门)
OOP 定义
面向对象编程(OOP)是一种使用对象及其相互作用设计应用和计算机程序的编程范例。
OOP 中有一些基本的编程概念:
- 抽象化 (抽象化,也在我们编程世界中 所有类都是抽象化,物以类聚,拥有共同的特性或者行为)
椅子类 人类 动物类 【本质就是归类】
-
多态性 【一类多种表现形态】【本质就是抽象化的程度】
-
封装形式 【抽像后的共同行为的封装【吹冷风】】,就是隐藏对象行为实现的细节。
出冷风(); // 需要不需要管方法内部实现逻辑。【对接三方支付一样】
- 继承【抽象过程,儿子(子类)可以继承父亲(父类)的共有财产】
抽象通过建模适合该问题的类来简化复杂的现实。 多态性是将运算符或函数以不同方式用于不同数据输入的过程。 封装对其他对象隐藏了类的实现细节。 继承是一种使用已经定义的类形成新类的方法。
====================================
现实生活中:
对象:就是实实在在的具体事物。
类:现实生活中多个事物共同特征和行为归类
eg: 手机
苹果 三星 华为 OPPO……
共同特征: 颜色 尺寸 分辨率 我们内存 电池容量。。。。。。
共同行为:发短信 刷视频 打电话 打语音 开视频。。。。。。
====================================
编程中:
类:
手机类:
// 现实中的类的特性被抽象为类的成员变量
颜色
尺寸
分辨率
内存大小
电池容量// 现实生活中的行为或者功能抽象为类的方法
发短信方法();
打电话方法();
开视频方法();
...........
编程世界中类来源于真实世界中一类事物共同特性和行为抽象。【类是对象模板】
对象:
// 创建一个手机对象
手机类 phone = new 手机类();
phone.颜色=红色;
phone.尺寸=61.7寸;
phone.分辨率=2048X1096
对象其实是类的实例【对象是类实例】
C# 对象
对象是 C# OOP 程序的基本构建块。 对象是数据和方法的组合。 数据和方法称为对象的成员。 在 OOP 程序中,我们创建对象。 这些对象通过方法进行通信。 每个对象都可以接收消息,发送消息和处理数据。
创建对象有两个步骤。 首先,我们定义一个类。 类是对象的模板。 它是一个蓝图,描述了类对象共享的状态和行为。 一个类可以用来创建许多对象。 在运行时从类创建的对象称为该特定类的实例。
Program.
using System;namespace Being
{class Being {}class Program{static void Main(string[] args){var b = new Being();Console.WriteLine(b);}}
}
在第一个示例中,我们创建一个简单的对象。
class Being {}
这是一个简单的类定义。 模板的主体为空。 它没有任何数据或方法。
var b = new Being();
我们创建Being
类的新实例。 为此,我们使用了new
关键字。 b
变量是创建对象的句柄。
Console.WriteLine(b);
我们将对象打印到控制台以获取该对象的一些基本描述。 打印对象是什么意思? 实际上,当我们打印对象时,我们将其称为ToString()
方法。 但是我们还没有定义任何方法。 这是因为创建的每个对象都继承自基本object
。 它具有一些基本功能,可以在所有创建的对象之间共享。 其中之一是ToString()
方法。
$ dotnet run
Being.Being
我们得到对象类名。
C# 对象属性
对象属性是捆绑在类实例中的数据。 对象属性称为实例变量或成员字段。 实例变量是在类中定义的变量,该类中的每个对象都有一个单独的副本。
Program.
using System;namespace ObjectAttributes
{class Person{//实例变量,这个变量必须通过类实例化后才能操作public string name;}class Program{static void Main(string[] args){var p1 = new Person();p1.name = "Jane";var p2 = new Person();p2.name = "Beky";Console.WriteLine(p1.name);Console.WriteLine(p2.name);}}
}
在上面的 C# 代码中,我们有一个带有一个成员字段的Person
类。
class Person
{public string name;
}
我们声明一个名称成员字段。 public
关键字指定可以在类块之外访问成员字段。
var p1 = new Person();
p1.name = "Jane";
我们创建Person
类的实例,并将名称变量设置为“ Jane”。 我们使用点运算符来访问对象的属性。
var p2 = new Person();
p2.name = "Beky";
我们创建Person
类的另一个实例。 在这里,我们将变量设置为“ Beky”。
Console.WriteLine(p1.name);
Console.WriteLine(p2.name);
我们将变量的内容打印到控制台。
$ dotnet run
Jane
Beky
我们看到了程序的输出。 Person
类的每个实例都有一个单独的名称成员字段副本。
C# 方法
方法是在类主体内定义的函数。 它们用于通过对象的属性执行操作。 方法将模块化带入我们的程序。
在 OOP 范式的封装概念中,方法至关重要。 例如,我们的AccessDatabase
类中可能有一个Connect()
方法。 我们无需知道方法Connect()
如何精确地连接到数据库。 我们只需要知道它用于连接数据库。 这对于划分编程中的职责至关重要,尤其是在大型应用中。
对象将状态/特性和行为分组,方法代表对象的行为部分。
Program.
using System;namespace Methods
{class Circle{private int radius;public void SetRadius(int radius){this.radius = radius;}public double Area(){return this.radius * this.radius * Math.PI;}}class Program{static void Main(string[] args){var c = new Circle();c.SetRadius(5);Console.WriteLine(c.Area());}}
}
在代码示例中,我们有一个 Circle 类。 我们定义了两种方法。
private int radius;
我们只有一个成员字段。 它是圆的半径。 private
关键字是访问说明符。 它表明变量仅限于外部世界。 如果要从外部修改此变量,则必须使用公共可用的SetRadius()
方法。 这样我们可以保护我们的数据。
public void SetRadius(int radius)
{this.radius = radius;
}
这是SetRadius()
方法。 this
变量是一个特殊变量,我们用它来访问方法中的成员字段。 this.radius
是实例变量,而半径是局部变量,仅在SetRadius()
方法内部有效。
var c = new Circle();
c.SetRadius(5);
我们创建Circle
类的实例,并通过在圆对象上调用SetRadius()
方法来设置其半径。 我们使用点运算符来调用该方法。
public double Area()
{return this.radius * this.radius * Math.PI;
}
Area()
方法返回圆的面积。 Math.PI
是内置常数。
$ dotnet run
78.5398163397448
运行该示例可得出此结果。
C# 访问修饰符
访问修饰符设置方法和成员字段的可见性。 C# 具有四个基本访问修饰符:public
,protected
,private
和internal
。 可以从任何地方访问public
成员。 protected
成员只能在类本身内部以及继承的和父类访问。 private
成员仅限于包含类型,例如 仅在其类或接口内。 可以从同一程序集(exe 或 DLL)中访问internal
成员。
修饰符还有两种组合:protected internal
和private protected
。 protected internal
类型或成员可以由声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。 private protected
类型或成员只能在其声明程序集中通过同一个类或从该类派生的类型的代码进行访问。
访问修饰符可防止意外修改数据。 它们使程序更强大。
类 | 当前程序集 | 派生类 | 当前程序集中的派生类 | 整个程序 | |
---|---|---|---|---|---|
public | + | + | + | + | + |
protected | + | o | + | + | o |
internal | + | + | o | o | o |
private | + | o | o | o | o |
protected internal | + | + | + | + | o |
private protected | + | o | o | + | o |
上表总结了 C# 访问修饰符(+是可访问的,o 是不可访问的)。
Program.
using System;namespace AccessModifiers
{class Person{public string name;private int age;public int GetAge(){return this.age;}public void SetAge(int age){this.age = age;}}class Program{static void Main(string[] args){var p = new Person();p.name = "Jane";p.SetAge(17);Console.WriteLine("{0} is {1} years old",p.name, p.GetAge());}}
}
在上面的程序中,我们有两个成员字段。 一个被宣布为公开,另一个被宣布为私有。
public int GetAge()
{return this.age;
}
如果成员字段是private
,则访问它的唯一方法是通过方法。 如果要在类外部修改属性,则必须将方法声明为public
。 这是数据保护的重要方面。
public void SetAge(int age)
{this.age = age;
}
SetAge()
方法使我们能够从类定义之外更改private
年龄变量。
var p = new Person();
p.name = "Jane";
我们创建Person
类的新实例。 因为名称属性是public
,所以我们可以直接访问它。 但是,不建议这样做。
p.SetAge(17);
SetAge()
方法修改年龄成员字段。 由于已声明private
,因此无法直接访问或修改。
Console.WriteLine("{0} is {1} years old",p.name, p.GetAge());
最后,我们访问两个成员以构建一个字符串。
$ dotnet run
Jane is 17 years old
运行示例将给出此输出。
具有private
访问修饰符的成员字段不被派生类继承。
Program.
using System;namespace Protected
{class Base{public string name = "Base";protected int id = 5323;private bool isDefined = true;}class Derived : Base{public void info(){Console.WriteLine("This is Derived class");Console.WriteLine("Members inherited");Console.WriteLine(this.name);Console.WriteLine(this.id);// Console.WriteLine(this.isDefined);}}class Program{static void Main(string[] args){var derived = new Derived();derived.info();}}
}
在前面的程序中,我们有一个Derived
类,该类继承自Base
类。 Base
类具有三个成员字段。 全部具有不同的访问修饰符。 isDefined 成员不继承。 private
修饰符可以防止这种情况。
class Derived : Base
类Derived
继承自Base
类。 要从另一个类继承,我们使用冒号(:)运算符。
Console.WriteLine(this.name);
Console.WriteLine(this.id);
// Console.WriteLine(this.isDefined);
public
和protected
成员由Derived
类继承。 可以访问它们。 private
成员未继承。 访问成员字段的行被注释。 如果我们取消注释该行,则代码将无法编译。
$ dotnet run
Program.(9,22): warning 0414: The field 'Base.isDefined' is assigned but its value
is never used [C:\Users\Jano\Documents\harp\tutorial\oop\Protected\Protected.proj]
This is Derived class
Members inherited
Base
5323
运行程序,我们收到此输出。
C# 构造函数 (初始化成员变量的角色)
构造函数是一种特殊的方法。 创建对象时会自动调用它。 构造函数不返回值。 构造函数的目的是初始化对象的状态。 构造函数与类具有相同的名称。 构造函数是方法,因此它们也可以重载。
构造函数不能被继承。 它们按继承顺序被调用。 如果我们不为类编写任何构造函数,则 C# 提供一个隐式默认构造函数。 如果提供任何类型的构造函数,则不提供默认值。
Program.
using System;namespace Constructor
{class Being{public Being(){Console.WriteLine("Being is created");}public Being(string being){Console.WriteLine("Being {0} is created", being);}}class Program{static void Main(string[] args){new Being();new Being("Tom");}}
}
我们有一个Being
类。 此类具有两个构造函数。 第一个不带参数; 第二个采用一个参数。
public Being(string being)
{Console.WriteLine("Being {0} is created", being);
}
此构造函数采用一个字符串参数。
new Being();
创建Being
类的实例。 这次,在创建对象时调用没有参数的构造函数。
$ dotnet run
Being is created
Being Tom is created
这是程序的输出。
在下一个示例中,我们初始化类的数据成员。 变量的初始化是构造函数的典型工作。
Program.
using System;namespace Constructor2
{class MyFriend{private DateTime born;private string name;public MyFriend(string name, DateTime born){this.name = name;this.born = born;}public void Info(){Console.WriteLine("{0} was born on {1}",this.name, this.born.ToShortDateString());}}class Program{static void Main(string[] args){var name = "Lenka";var born = new DateTime(1990, 3, 5);var friend = new MyFriend(name, born);friend.Info();}}
}
我们有一个带有数据成员和方法的MyFriend
类。
private DateTime born;
private string name;
类定义中有两个私有变量。
public MyFriend(string name, DateTime born)
{this.name = name;this.born = born;
}
在构造函数中,我们启动两个数据成员。 this
变量是用于引用对象变量的处理程序。
var friend = new MyFriend(name, born);
friend.Info();
我们创建带有两个参数的MyFriend
对象。 然后我们调用对象的Info()
方法。
$ dotnet run
Lenka was born on 3/5/1990
这是输出。
C# 构造函数链接
构造函数链接是类从构造函数调用另一个构造函数的能力。 要从同一类调用另一个构造函数,我们使用this
关键字。
Program.
using System;namespace ConstructorChaining
{class Circle{public Circle(int radius){Console.WriteLine("Circle, r={0} is created", radius);}public Circle() : this(1){}}class Program{static void Main(string[] args){new Circle(5);new Circle();}}
}
我们有一个Circle
类。 该类具有两个构造函数。 一种采用一个参数,一种不采用任何参数。
public Circle(int radius)
{Console.WriteLine("Circle, r={0} is created", radius);
}
此构造函数采用一个参数-radius
。
public Circle() : this(1)
{}
这是没有参数的构造函数。 它只是简单地调用另一个构造函数,并为其提供默认半径 1。
$ dotnet run
Circle, r=5 is created
Circle, r=1 is created
C# ToString
方法
每个对象都有一个ToString()
方法。 它返回人类可读的对象表示形式。 默认实现返回Object
类型的标准名称。 请注意,当我们使用对象作为参数调用Console.WriteLine()
方法时,将调用ToString()
。
Program.
using System;namespace ToStringMethod
{class Being{public override string ToString(){return "This is Being class";}}class Program{static void Main(string[] args){var b = new Being();var o = new Object();Console.WriteLine(o.ToString());Console.WriteLine(b.ToString());Console.WriteLine(b);}}
}
我们有一个Being
类,其中我们重写了ToString()
方法的默认实现。
public override string ToString()
{return "This is Being class";
}
创建的每个类都从基object
继承。 ToString()
方法属于此对象类。 我们使用override
关键字来通知我们正在覆盖方法。
var b = new Being();
var o = new Object();
我们创建一个自定义对象和一个内置对象。
Console.WriteLine(o.ToString());
Console.WriteLine(b.ToString());
我们在这两个对象上调用ToString()
方法。
Console.WriteLine(b);
正如我们之前指定的,将对象作为Console.WriteLine()
的参数将调用其ToString()
方法。 这次,我们隐式调用了该方法。
$ dotnet run
System.Object
This is Being class
This is Being class
这是我们运行示例时得到的。
C# 对象初始化器
对象初始化程序让我们在创建时将值分配给对象的任何可访问字段或属性,而无需调用构造函数。 属性或字段在{}
括号内分配。 另外,我们可以为构造函数指定参数,也可以省略参数。
Program.
using System;namespace ObjectInitializers
{class User{public User() {}public string Name { set; get; }public string Occupation { set; get; }public override string ToString(){return $"{Name} is a {Occupation}";}}class Program{static void Main(string[] args){var u = new User { Name = "John Doe", Occupation = "gardener" };Console.WriteLine(u);}}
}
在示例中,我们使用对象初始化程序语法创建一个新用户。
public User() {}
我们定义一个空的构造函数。
public string Name { set; get; }
public string Occupation { set; get; }
我们有两个属性:Name
和Occupation
。
var u = new User { Name = "John Doe", Occupation = "gardener" };
我们将值分配给{}
括号中的属性。
$ dotnet run
John Doe is a gardener
C# 类常量
C# 可以创建类常量。 这些常量不属于具体对象。 他们属于阶级。 按照约定,常量用大写字母表示。
Program.
using System;namespace ClassConstants
{class Math{public const double PI = 3.14159265359;}class Program{static void Main(string[] args){Console.WriteLine(Math.PI);}}
}
我们有一个带有PI
常量的Math
类。
public const double PI = 3.14159265359;
const
关键字用于定义常数。 public
关键字使它可以在类的主体之外访问。
$ dotnet run
3.14159265359
运行示例,我们看到此输出。
C# 继承
继承是使用已经定义的类形成新类的方法。 新形成的类称为派生的类,我们派生的类称为基类。 继承的重要好处是代码重用和降低程序的复杂性。 派生类(后代)将覆盖或扩展基类(祖先)的功能。
Program.
using System;namespace Inheritance
{class Being{public Being(){Console.WriteLine("Being is created");}}class Human : Being{public Human(){Console.WriteLine("Human is created");}}class Program{static void Main(string[] args){new Human();}}
}
在此程序中,我们有两个类。 基类Being
和派生的Human
类。 派生类继承自基类。
class Human : Being
在 C# 中,我们使用冒号(:)运算符创建继承关系。
new Human();
我们实例化派生的Human
类。
$ dotnet run
Being is created
Human is created
我们可以看到两个构造函数都被调用了。 首先,调用基类的构造函数,然后调用派生类的构造函数。
接下来是一个更复杂的示例。
Program.
using System;namespace Inheritance2
{class Being{static int count = 0;public Being(){count++;Console.WriteLine("Being is created");}public void GetCount(){Console.WriteLine("There are {0} Beings", count);}}class Human : Being{public Human(){Console.WriteLine("Human is created");}}class Animal : Being{public Animal(){Console.WriteLine("Animal is created");}}class Dog : Animal{public Dog(){Console.WriteLine("Dog is created");}}class Program{static void Main(string[] args){new Human();var dog = new Dog();dog.GetCount();}}
}
我们有四个班。 继承层次更加复杂。 Human
和Animal
类继承自Being
类。 Dog 类直接继承自Animal
类,并间接继承自Being
类。 我们还介绍了static
变量的概念。
static int count = 0;
我们定义一个static
变量。 静态成员是类的所有实例共享的成员。
Being()
{count++;Console.WriteLine("Being is created");
}
每次实例化Being
类时,我们将 count 变量增加一。 这样,我们就可以跟踪创建的实例数。
class Animal : Being
...class Dog : Animal
...
Animal
继承自Being
,Dog
继承自Animal
。 Dog
也间接继承自Being
。
new Human();
var dog = new Dog();
dog.GetCount();
我们从Human
和Dog
类创建实例。 我们称为 Dog 对象的GetCount()
方法。
$ dotnet run
Being is created
Human is created
Being is created
Animal is created
Dog is created
There are 2 Beings
Human
调用两个构造函数。 Dog
调用三个构造函数。 有两个实例化的存在。
我们使用base
关键字显式调用父级的构造函数。
Program.
using System;namespace Shapes
{class Shape{protected int x;protected int y;public Shape(){Console.WriteLine("Shape is created");}public Shape(int x, int y){this.x = x;this.y = y;}}class Circle : Shape{private int r;public Circle(int r, int x, int y) : base(x, y){this.r = r;}public override string ToString(){return String.Format("Circle, r:{0}, x:{1}, y:{2}", r, x, y);}}class Program{static void Main(string[] args){var c = new Circle(2, 5, 6);Console.WriteLine(c);}}
}
我们有两个类:Shape
类和Circle
类。 Shape
类是几何形状的基类。 我们可以在此类中加入一些常见形状的共同点,例如x
和y
坐标。
public Shape()
{Console.WriteLine("Shape is created");
}public Shape(int x, int y)
{this.x = x;this.y = y;
}
Shape
类具有两个构造函数。 第一个是默认构造函数。 第二个参数有两个参数:x,y 坐标。
public Circle(int r, int x, int y) : base(x, y)
{this.r = r;
}
这是Circle
类的构造函数。 此构造函数启动r
成员并调用父级的第二个构造函数,并向其传递x
和y
坐标。 如果不使用base
关键字显式调用构造函数,则将调用Shape
类的默认构造函数。
$ dotnet run
Circle, r:2, x:5, y:6
这是示例的输出。
C# 抽象类和方法
抽象类无法实例化。 如果一个类至少包含一个抽象方法,则也必须将其声明为抽象方法。 抽象方法无法实现; 他们只是声明方法的签名。 当我们从抽象类继承时,所有抽象方法都必须由派生类实现。 此外,必须以较少受限制的可见性声明这些方法。
与接口不同,抽象类可能具有完全实现的方法,并且可能具有定义的成员字段。 因此,抽象类可以提供部分实现。 程序员经常将一些通用功能放入抽象类中。 这些抽象类随后会被子类化以提供更具体的实现。 例如,Qt 图形库具有QAbstractButton
,它是按钮小部件的抽象基类,提供按钮所共有的功能。 按钮Q3Button
,QCheckBox
,QPushButton
,QRadioButton
和QToolButton
都从此基本抽象类继承。
正式地说,抽象类用于强制执行协议。 协议是所有实现对象都必须支持的一组操作。
Program.
using System;namespace AbstractClass
{abstract class Drawing{protected int x = 0;protected int y = 0;public abstract double Area();public string GetCoordinates(){return string.Format("x: {0}, y: {1}", this.x, this.y);}}class Circle : Drawing{private int r;public Circle(int x, int y, int r){this.x = x;this.y = y;this.r = r;}public override double Area(){return this.r * this.r * Math.PI;}public override string ToString(){return string.Format("Circle at x: {0}, y: {1}, radius: {2}",this.x, this.y, this.r);}}class Program{static void Main(string[] args){var c = new Circle(12, 45, 22);Console.WriteLine(c);Console.WriteLine("Area of circle: {0}", c.Area());Console.WriteLine(c.GetCoordinates());}}
}
我们有一个抽象基类Drawing
。 该类定义两个成员字段,定义一个方法并声明一个方法。 一种方法是抽象的,另一种是完全实现的。 Drawing
类是抽象的,因为我们无法绘制它。 我们可以画一个圆,一个点或一个正方形。 Drawing
类对我们可以绘制的对象具有一些通用功能。
abstract class Drawing
我们使用abstract
关键字定义一个抽象类。
public abstract double Area();
抽象方法之前还带有abstract
关键字。
class Circle : Drawing
圆是Drawing
类的子类。 它必须实现抽象的Area()
方法。
public override double Area()
{return this.r * this.r * Math.PI;
}
当我们实现Area()
方法时,必须使用override
关键字。 这样,我们通知编译器我们将覆盖现有的(继承的)方法。
$ dotnet run
Circle at x: 12, y: 45, radius: 22
Area of circle: 1520.53084433746
x: 12, y: 45
C# 部分类
使用partial
关键字,可以将类的定义拆分到同一名称空间中的几个部分中。 该类也可以在多个文件中定义。
当使用非常大的代码库时可以使用部分类,这些代码库可以拆分为较小的单元。 局部类也与自动代码生成器一起使用。
Program.
using System;namespace PartialClass
{partial class Worker{public string DoWork(){return "Doing work";}}partial class Worker{public string DoPause(){return "Pausing";}}class Program{static void Main(string[] args){var worker = new Worker();Console.WriteLine(worker.DoWork());Console.WriteLine(worker.DoWork());Console.WriteLine(worker.DoPause());}}
}
在示例中,我们将Worker
类定义为两部分。 这些部分由编译器连接在一起以形成最终类。
$ dotnet run
Doing work
Doing work
Pausing
相关文章:

C# 面向对象
C# 面向对象编程 面向过程:一件事情分成多个步骤来完成。 把大象装进冰箱 (面向过程化设计思想)。走一步看一步。 1、打开冰箱门 2、把大象放进冰箱 3、关闭冰箱门 面向对象:以对象作为主体 把大象装进冰箱 1、抽取对象 大象 冰箱 门 ࿰…...
android wifi扫描的capability
混合型加密android11 8155与普通linux设备扫描到的安全字段差别 android应用拿到关于wifi安全的字段: systembar-WifiBroadcastReceiver---- scanResult SSID: Redmi_697B, BSSID: a4:39:b3:70:8c:20, capabilities: [WPA-PSK-TKIPCCMP][WPA2-PSK-TKIPCCMP][RSN-PSK…...

datawhale 2411组队学习:模型压缩4 模型量化理论(数据类型、int8量化方法、PTQ和QWT)
文章目录 一、数据类型1.1 整型1.2 定点数1.3 浮点数1.3.1 正规浮点数(fp32)1.3.2 非正规浮点数(fp32)1.3.3 其它数据类型1.3.4 浮点数误差1.3.5 浮点数导致的模型训练问题 二、量化基本方法2.1 int8量化2.1.1 k-means 量化2.1.2 …...

数据分析-48-时间序列变点检测之在线实时数据的CPD
文章目录 1 时间序列结构1.1 变化点的定义1.2 结构变化的类型1.2.1 水平变化1.2.2 方差变化1.3 变点检测1.3.1 离线数据检测方法1.3.2 实时数据检测方法2 模拟数据2.1 模拟恒定方差数据2.2 模拟变化方差数据3 实时数据CPD3.1 SDAR学习算法3.2 Changefinder模块3.3 恒定方差CPD3…...

POD-Transformer多变量回归预测(Matlab)
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现POD-Transformer多变量回归预测,本征正交分解数据降维融合Transformer多变量回归预测,使用SVD进行POD分解(本征正交分解); 2.运行环境Matlab20…...

Hadoop生态圈框架部署(七)- MySQL安装与配置教程
文章目录 前言一、MySQL安装与配置(手动部署)1. 下载MySQL2. 上传安装包3. 解压HBase安装包4. 配置4.1 配置 MySQL 的主配置文件 my.cnf4.2 配置 MySQL 服务的脚本 5. 初始化MySQL数据库6. 创建快捷方式7. 启动MySQL服务8. 修改MySQL登录密码8.1 使用临时…...

视频直播5G CPE解决方案:ZX7981PG/ZX7981PMWIFI6网络覆盖
方案背景 视频直播蓬勃发展的当下,传统直播网络联网方式的局限性越来越明显。目前传统直播的局限性主要集中在以下几个方面: 传统直播间网络架构条件有限,可连接WIFI数量少,多终端同时直播难以维持;目前4G网络带宽有限…...
技术周刊 |Google 2024 年首届 Web AI 峰会回顾
大家好,我是童欧巴。见字如面,万事胜意,欢迎来到第 134 期周刊。 大厨推荐 Google 2024 年首届 Web AI 峰会回顾 不仅包括来自谷歌团队的演讲者,如 Chrome 和 MediaPipe,还包括第三方代表,如英特尔、Hug…...

web——upload-labs——第十二关——%00截断
查看源码 分析源码我们可以知道,这里是基于白名单过滤,只允许上传jpg,png,gif,但是这里注意第八行,上传路径是可以控制的,所以可以利用%00截断,来达到上传木马的目的。这里要注意一下,%00截断想…...
ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值。ojdbc8版本23.2.0.0驱动BUG【已解决】
问题描述 JDK8使用ojdbc8驱动操作oracle11g数据库,使用JDBC复用 PreparedStatement 对象执行Insert操作时,报错java.sql.SQLException: ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值。,经测试发现,是预编译对象某个占位符号被赋…...

win10 自带 directx 修复工具怎么用?最新 directx 修复工具使用方法介绍
DirectX 是一组用于处理多媒体,特别是游戏和图形相关任务的技术和接口。当 DirectX 出现问题,可能会导致游戏运行不畅、图像显示异常、声音故障等。 系统自带的 directx 修复工具能够检测 DirectX 的组件是否完整、版本是否正确、配置是否合理ÿ…...

报错java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not ...解决方法
在运行项目时出现java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field com.sun.tools.javac.tree.JCTree qualidzz这样的报错 解决方法 1.第一步:在pom文件中将lombok的版本改成最新的 此时1.18.34是新…...

前端三大件之CSS
引言 CSS(层叠样式表,Cascading Style Sheets)是一种用于描述网页文档外观和格式的样式表语言。它主要用于控制网页的布局、颜色、字体、间距等视觉效果,使开发者能够将内容与设计分离。 一,CSS的基本概念 选择器&…...
C语言 | 指针 | 野指针 | 数组指针 | 指针数组 | 二级指针 | 函数指针 | 指针函数
文章目录 1.指针的定义2.指针的加减运算3.野指针4.指针 & 数组 & 传参 & 字符数组5.数组指针 & 指针数组6.二级指针7.指针函数 & 函数指针 & 回调函数8.函数指针数组 & 指向函数指针数组的指针 1.指针的定义 指针是内存中一个最小单元的编号&…...
mysql 的乐观锁和 mvcc 是一回事吗
MySQL 的乐观锁和 MVCC(多版本并发控制)是两个不同的概念,尽管它们都涉及到并发控制和数据的一致性,但在设计目的和实现方式上存在本质区别。 1. 乐观锁 概念 乐观锁是一种用于解决并发更新冲突的控制机制。它假设数据在大部分情况…...
redis的击穿和雪崩
Redis 是一个高性能的键值存储数据库,广泛用于缓存、会话管理等场景。然而,Redis 在高并发场景下可能会遇到一些问题,比如“击穿”和“雪崩”。下面详细解释这两个概念: 击穿(Hotspot) 击穿是指某个热点数…...

java中创建多线程的4种方式
目录 一、继承 Thread 类创建线程 步骤 示例代码 原理 二、实现 Runnable 接口创建线程 步骤 示例代码 原理 三、实现 Callable 接口创建线程 步骤 示例代码 原理 与Runnable接口相比的不同之处 四、使用线程池创建线程 步骤 示例代码(使用 Executo…...

MATLAB深度学习(二)——如何训练一个卷积神经网路
2.1 基本概念 从数学的角度看,机器学习的目标是建立输入和输出的函数关系,相当于 y F(x)的过程。F(x)就是我们所说的模型,对于使用者来说,这个模型就是一个黑箱,我们不知…...

删除k8s 或者docker运行失败的脚本
vi delete_exited_containers.sh#!/bin/bash# 列出所有停止的容器并存储到数组 list_exited_containers() {echo -e "\nStopped containers:"containers()# 获取停止的容器信息并存入数组while IFS read -r line; docontainers("$line")done < <(do…...
重置docker版本的octoprint管理员账号密码
我的情况是octoprint安装在HiNAS系统的机顶盒上,只有一个账号,但是忘记了用户名和密码。有两个选择: 可以试试先找回用户名,然后尝试你的常用密码。直接重置所有账号。 1.找回用户名: 使用使用 docker exec -it <…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...