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

【JavaSE】类和对象(中)

类和对象(中)

    • 4. this引用
      • 4.1 为什么要有this引用
      • 4.2 什么是this引用
      • 4.3 this引用的特性
    • 5. 对象的构造及初始化
      • 5.1 如何初始化对象
      • 5.2 构造方法(构造器)
        • 5.2.1 概念
        • 5.2.2 特性
      • 5.3 默认初始化
      • 5.4 就地初始化
    • 6. 封装
      • 6.1 封装的概念
      • 6.2 访问限定符
      • 6.3 封装扩展之包
        • 6.3.1 包的概念
        • 6.3.2 导入包中的类
        • 6.3.3 自定义包
        • 6.3.5 常见的包
        • 6.3.6 封装操作举例

4. this引用

4.1 为什么要有this引用

先看一个日期类的例子:

public class Date {public int year;public int month;public int day;public void setDay(int y, int m, int d){year = y;month = m;day = d;}public void printDate(){System.out.println(year + "/" + month + "/" + day);}public static void main(String[] args) {// 构造三个日期类型的对象 d1 d2 d3Date d1 = new Date();Date d2 = new Date();Date d3 = new Date();// 对d1,d2,d3的日期设置d1.setDay(2020,9,15);d2.setDay(2020,9,16);d3.setDay(2020,9,17);// 打印日期中的内容d1.printDate();d2.printDate();d3.printDate();}
}
//----------------
//打印
2020/9/15
2020/9/16
2020/9/17

但是三个对象都在调用setDate和printDate函数,但是这两个函数中没有任何有关对象的说明,setDate和printDate函数如何知道打印的是那个对象的数据呢

其实在成员方法的第一个形参中默认隐藏了一个this,this引用的是调用成员方法的对象。

4.2 什么是this引用

**this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。**只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

public class Date {public int year;public int month;public int day;public void setDay(int year, int month, int day){this.year = year;this.month = month;this.day = day;}public void printDate(){System.out.println(this.year + "/" + this.month + "/" + this.day);}
}

注意:this引用代表的是的是调用成员方法的对象。

每个成员方法括号中的第一个参数默认是this

image-20221119134555767

注意,我们要习惯使用this。

image-20221119135849351

4.3 this引用的特性

  1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型

  2. this只能在"成员方法"中使用

  3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象

  4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法
    对象的引用传递给该成员方法,this负责接收

5. 对象的构造及初始化

5.1 如何初始化对象

通过前面知识点的学习知道,在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。

public static void main(String[] args) {int a;System.out.println(a);
}
// Error:(26, 28) java: 可能尚未初始化变量a

要让上述代码通过编译,非常简单,只需在正式使用a之前,给a设置一个初始值即可。如果是对象:

public class Date {public int year;public int month;public int day;public void setDay(int y, int m, int d){this.year = y;this.month = m;this.day = d;}public void printDate(){System.out.println(year + "/" + month + "/" + day);}
}
public static void main(String[] args) {Date d = new Date();d.printDate();d.setDate(2021,6,9);d.printDate();
}
// 代码可以正常通过编译

需要调用之前写的SetDate方法才可以将具体的日期设置到对象中。通过上述例子发现两个问题:

  1. 每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象如何快捷进行初始化呢?
  2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?

这两个问题就涉及到了构造方法和默认初始化的问题。

5.2 构造方法(构造器)

5.2.1 概念

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

什么是构造方法?

构造方法非常特殊:这个方法没有返回值,方法名和类名是一样的。

如果我们没有在类中写任何的构造方法,那么Java会帮我们提供一个默认的不带参数的构造方法。

public class Date {public int year;public int month;public int day;public void setDay(int y, int m, int d){year = y;month = m;day = d;}public void printDate(){System.out.println(year + "/" + month + "/" + day);}Date() {System.out.println("这个是构造方法,在实例化对象的时候就会进行调用");}////public static void main(String[] args) {Date date1 = new Date();}
}
//--------------
//编译器运行结果为
//这个是构造方法,在实例化对象的时候就会进行调用

当然在一个类中没有写构造方法的话,Java会默认提供。

但是一个类当中写了构造方法的话,java就不会提供了。

看看效果

public class Date {public int year;public int month;public int day;public void setDay(int y, int m, int d){year = y;month = m;day = d;}public void printDate(){System.out.println(year + "/" + month + "/" + day);}public Date() {System.out.println("这个是构造方法,在实例化对象的时候就会进行调用");}public Date(int year ,int month ,int day) {this.year = year;this.month = month;this.day = day;}////public static void main(String[] args) {Date date1 = new Date(11,11,11);date1.printDate();}
}
//--------------
//编译器运行结果为
//11/11/11

这样我们就可以通过构造方法在进行对象实例化的过程中进行成员变量的初始化。

至于我们写了两个Date函数,那么这两个函数就属于重载关系

public Date() {System.out.println("这个是构造方法,在实例化对象的时候就会进行调用");
}
public Date(int year ,int month ,int day) {this.year = year;this.month = month;this.day = day;
}

重载:方法名相同,参数列表不同,与返回值无关。

我们可以说当一个对象调用完构造函数,那么这个对象就生成了。

因为生成一个对象分为两步1. 为对象分配内存 2. 调用合适的构造方法

补充:

  1. 对于构造方法,我们不能进行添加void因为如果添加了返回值的话,那么就不属于我们的构造方法了。

  2. 如果自己没有写构造函数,那么编译器会提供一个默认的不带任何参数的构造方法。

5.2.2 特性

  1. 名字必须与类名相同

  2. 没有返回值类型,设置为void也不行

  3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)

  4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)

  5. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。一旦用户定义,编译器则不再生成。

如果生成了一个带有参数的构造方法,那么一定要在对象实例化的过程中进行传参,否则会报错。

  1. 构造方法中,可以通过this调用其他构造方法来简化代码

在这个过程中this代表的是调用当前对象的其他构造方法。

public class Date {public int year;public int month;public int day;public void printDate(){System.out.println(year + "/" + month + "/" + day);}public Date() {this(11,11,11);}public Date(int year ,int month ,int day) {this.year = year;this.month = month;this.day = day;}public static void main(String[] args) {Date date1 = new Date();date1.printDate();}
}
//------------
//编译器运行结果为
//11/11/11

但是在调用其他构造方法的时候有一定的要求:

  1. 那么就是this语句一定要放在构造方法中作为第一条语句。不然会报错。

image-20221119163345957

  1. 只能在构造方法内部才能使用,不能在其他方法中使用。

  2. 不能形成环,否则进行反复调用构造函数,形成封闭循环

image-20221119164045666

  1. 绝大多数情况下构造函数使用public来修饰,特殊场景下会被private修饰。

至于这个我们先不管,以后会讲。

总结

this.date 访问当前对象的成员变量

this.func() 访问当前对象的成员方法

this() 调用当前对象的其他构造方法

this不能调用静态static修饰的成员方法和变量这个后面我们再说

5.3 默认初始化

为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?

要搞清楚这个过程,就需要知道 new 关键字背后所发生的一些事情:

Date d = new Date(2021,6,9);

在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:

  1. 检测对象对应的类是否加载了,如果没有加载则加载

  2. 为对象分配内存空间

  3. 处理并发安全问题
    比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突

  4. 初始化所分配的空间
    即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:

数据类型默认值
byte0
char‘\u0000’
short0
int0
long0L
booleanfalse
float0.0f
double0.0
referencenull
  1. 设置对象头信息(关于对象内存模型后面会介绍)
  2. 调用构造方法,给对象中各个成员赋值

所以在调用构造函数进行初始化之前,我们就会进行赋值为默认值。

补充

public只是权限的问题。(只提一下)

局部变量:定义在方法内部的变量。

成员变量:定义在类的内部的变量,定义在成员方法的外部。

定义在成员方法内部的变量就叫做局部变量。

image-20221119173212258

5.4 就地初始化

在声明成员变量时,就对成员变量设置初始值。

public class Date {public int year = 1900;public int month = 1;public int day = 1;//进行就地初始化public Date(){}public Date(int year, int month, int day) {}public static void main(String[] args) {Date d1 = new Date(2021,6,9);Date d2 = new Date();}
}

当然这个除非是业务需求,不然没有提别大的意义,如果成员变量会进行修改,那么就地初始化相当于进行了一个默认值的定义。

6. 封装

6.1 封装的概念

**面向对象程序三大特性:封装、继承、多态。**而类和对象阶段,主要研究的就是封装特性。

何为封装呢?

简单来说就是套壳屏蔽细节。把类的实现细节进行隐藏,对外只提供一些交互的接口。

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互

比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器,USB插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU、显卡、内存等一些硬件元件。

然而要进行封装就涉及到了访问限定符。

6.2 访问限定符

Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符:

private 默认权限 protected public

默认权限就是我们什么都没加的时候的使用默认权限访问限定符。

public class Date {int year;
}

private

权限非常小,被修饰之后只能在自己的类中进行使用。

class Student {public String name;public void show() {System.out.println("姓名" + name);}
}

image-20221119183711913

默认权限default

只能在自己的包中进行使用

这就涉及到了包的概念,如果不懂包是什么,可以先跳过这块继续看下一块的内容。

image-20221119205824167

protect和public以后再讲,因为涉及到了子类的知识

6.3 封装扩展之包

6.3.1 包的概念

要了解封装就要了解权限,要了解权限,就要了解包。

在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包。有点类似于目录。比如:为了更好的管理电脑中的歌曲,一种好的方式就是将相同属性的歌曲放在相同文件下,也可以对某个文件夹下的音乐进行更详细的分类。

image-20221119191624982

包就像文件夹一样,一个文件夹当中不能有相同的文件名,不同文件夹下可以有相同的文件名。

在Java中也引入了包,包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一个包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在
不同的包中即可。

6.3.2 导入包中的类

Java 中已经提供了很多现成的类供我们使用. 例如Date类:可以使用java.util.Arrays导入java.util这个包中的Arrays类.

public class Test {public static void main(String[] args) {int[] arr = {1,2,3};java.util.Arrays.toString(arr);}
}

但是这种方法比较麻烦,我们可以使用import语句导入包

import java.util.Arrays;  // 导包public class Test {public static void main(String[] args) {int[] arr = {1,2,3};Arrays.toString(arr);  }
}

如果需要使用java.util中的其他类, 可以使用import java.util.*

import java.util.*;
public class Test {public static void main(String[] args) {int[] arr = {1,2,3};Arrays.toString(arr);}
}

import java.util.*不是把里面的所有的类都导进来,是随取随用。用到哪个类,就会导哪个类。

但是我们更建议显式的指定要导入的类名. 否则还是容易出现冲突的情况.

image-20221119193240618

import java.util.*;
import java.sql.*;
public class Test {public static void main(String[] args) {
// util 和 sql 中都存在一个 Date 这样的类, 此时就会出现歧义, 这个时候编译器就不知道该导入哪个包了,毕竟两个包中都有Date类,所以编译出错Date date = new Date();System.out.println(date.getTime());}
}
//--------------
// 编译出错
Error:(5, 9) java: 对Date的引用不明确java.sql 中的类 java.sql.Date 和 java.util 中的类 java.util.Date 都匹配

在这种情况下需要使用完整的类名

import java.util.*;
import java.sql.*;
public class Test {public static void main(String[] args) {java.util.Date date = new java.util.Date();System.out.println(date.getTime());}
}

使用import static可以导入包中静态的方法和字段

image-20221119194333543

pow方法就是Math中的一个静态方法,我们使用import static就可以进行简写,在调用的时候只需要写方法名。

没有import static修饰过的

import java.lang.Math;
public class Test {public static void main(String[] args) {double x = 10;double result = Math.pow(x,2);}
}

import static修饰过的

import static java.lang.Math.*;
public class Test {public static void main(String[] args) {double x = 10;double result = pow(x,2);}
}

至于这个import static不建议大家使用

6.3.3 自定义包

包就是所谓的文件夹

操作步骤

  1. 在 IDEA 中先新建一个包: 右键 src -> 新建 -> 包

image-20221119203116846

  1. 在弹出的对话框中输入包名,,通常会用公司的域名的颠倒形式,例利于域名是www.bit.com,那么包的名字就是com.bit.www

image-20221119203128151

  1. 在包中创建类, 右键包名 -> 新建 -> 类, 然后输入类名即可.

image-20221119203210866

  1. 此时可以看到我们的磁盘上的目录结构已经被 IDEA 自动创建出来了

image-20221119203219277

  1. 同时我们也看到了, 在新创建的 Test.java 文件的最上方, 就出现了一个 package 语句

image-20221119203103722

package是声明当前类是在哪个包底下。

package com.bite.demo1;

6.3.5 常见的包

  1. java.lang:系统常用基础类(String、Object),此包从JDK1.1后自动导入。
  2. java.lang.reflect:java 反射编程包;
  3. java.net:进行网络编程开发包。
  4. java.sql:进行数据库开发的支持包。
  5. java.util:是java提供的工具程序包。(集合类等) 非常重要
  6. java.io:I/O编程开发包。

除了JDK自动导入的,剩下的都需要我们用import自己导入

10.Java类和对象完+作业+继承

回顾

什么是类?什么是对象?什么是面向对象?什么是面向过程
如何定义一个类
如何实例化一个对象
如果通过对象访问对象的成员属性、成员方法
通过(对象.)进行访问
this引用?代表的是当前对象的引用
构造方法中的this引用可以访问成员变量,可以访问成员方法,也可以访问当前对象的其他构造方法
引用指向null代表什么?代表这个引用不指向任何对象
引用不能指向引用,但是引用能指向引用所指向的对象。
一个引用只能指向一个对象,不能指向多个对象。
封装:根据业务需求,对类的细节进行隐藏,提供公开的接口,来和数据进行交互。

6.3.6 封装操作举例

class Person {private String name;public int age;private void eat() {System.out.println("吃饭");}public void show() {System.out.println(name + " " + age);}
}

我们通过private关键字进行对成员变量和成员方法进行封装,private封装后的只能在类中使用。

name成员变量、eat成员方法都已经封装起来了

使用private关键字进行了封装。此时,name的权限就变小了,只能在当前类当中才能进行访问。

image-20221120141047983

补充

public哪里都能访问

private只能在当前类访问

default只能在包中进行访问

在Java编译器当中我们对构造函数创建有快捷方法。

第一步右键选择Generate、或者快捷键Alt+Insert

image-20221120141658711

第二步:选择Constructor

image-20221120141814151

第三步选择构造函数的形参(多选按住CTRL)

image-20221120142003727

这样就可以在封装的情况下,通过构造函数在对象实例化的过程中进行初始化成员变量。

但是,如果想要更改姓名的话却无法更改,除非再次进行实例化一个对象,所以我们可以通过创建成员方法作为接口那么我们就创建了成员方法setName进行姓名的更改getName进行名字的查询

class Person {private String name;public int age;private void ear() {System.out.println("吃饭");}public void show() {System.out.println(name + " " + age);}public Person(String name, int age) {this.name = name;this.age = age;}public Person(String name) {this.name = name;}public String getName() {return this.name;}public void setName(String name) {this.name = name;}
}
public class Test {public static void main(String[] args) {Person person = new Person("mengdehong",20);person.setName("meng");System.out.println(person.getName());person.show();}
}
//--------------
//编译器运行结果为
//meng
//meng 20

但是我们有多个成员变量进行封装的时候,我们都要对每个成员变量进行set变量、get变量的方法吗?

实际上我们也有快捷操作。

第一步左键选择Generate

image-20221120144125619

第二部选择Getter and Setter

image-20221120144312677

第三步进行选择所需要创建成员方法的成员变量

image-20221120144348219

这样就创建好了成员方法作为接口

image-20221120144440370

今天我们讲了类和对象的一部分,剩下的内容我们会在下一篇博客中讲完。

相关文章:

【JavaSE】类和对象(中)

类和对象(中)4. this引用4.1 为什么要有this引用4.2 什么是this引用4.3 this引用的特性5. 对象的构造及初始化5.1 如何初始化对象5.2 构造方法(构造器)5.2.1 概念5.2.2 特性5.3 默认初始化5.4 就地初始化6. 封装6.1 封装的概念6.2…...

C语言例程:学生成绩管理程序

学生成绩管理程序 实例说明 编制一个统计存储在文件中的学生考试分数的管理程序。设学生成绩以一个学生一条记录的 形式存储在文件中,每个学生记录包含的信息有姓名、学号和各门功课的成绩。要求编制具有以 下几项功能的程序:求出各门课程的总分&#…...

完美日记母公司再度携手中国妇基会,以“创美人生”助力女性成长

撰稿 | 多客 来源 | 贝多财经 当春时节,梦想花开。和煦的三月暖阳,唤醒的不止是满城春意,更有逸仙电商“创美人生”公益项目播撒的一份希望。 3月8日“国际妇女节”当日,为积极响应我国促进共同富裕的政策倡导,助力相…...

【JaveEE】线程的创建及常见方法解析(Tread类)

目录 1.Tread类介绍 2线程的构造方法——创建线程 1.继承Thread类,重写run()方法 2.使用Runnbable接口创建线程 3.继承 Thread, 重写 run, 使用匿名内部类 4.实现 Runnable, 重写 run, 使用匿名内部类 5.使用 lambda 表达式(重点掌握)…...

Linux的诞生过程

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的…...

面部表情识别1:表情识别数据集(含下载链接)

面部表情识别1:表情识别数据集(含下载链接) 目录 面部表情识别1:表情识别数据集(含下载链接) 1.前言 2.表情识别数据集介绍 1.JAFFE数据集 2.KDEF(Karolinska Directed Emotional Faces)数据集 3.GENKI数据集 4.RaFD数据集…...

CSS实现文字凹凸效果

使用两个div分别用来实现凹凸效果;text-shadow语法 text-shadow: h-shadow v-shadow blur color; h-shadow:必需。水平阴影的位置。允许负值。 v-shadow :必需。垂直阴影的位置。允许负值。 blur:可选,模糊的距离。 co…...

嵌入式常使用的库函数

自己创建简单的mcu中常用的库函数 文章目录自己创建简单的mcu中常用的库函数1. 自己编写库函数的意义2. 计算字符串长度.以\0作为结束符3. 复制字符串4. 字符串比较5. 将整数转换为ASCII数组6. 将ASCII码字符串转换成整数7. 将字节数组转换为16位整数8.计算CRC,用于Modbus协议9…...

【业务安全-02】业务逻辑漏洞之越权操作

越权越权即越权查看被人的信息,又分为水平越权和垂直越权,但是两者的本质都是一样的,只是越权的身份权限不一样而已水平越权:相同级别的用户,如用户A访问用户B垂直越权:普通用户到管理员,普通用…...

完全小白的pycharm深度学习调试+for循环断点条件设置

完全小白的pycharm深度学习调试for循环断点条件设置写在最前面基础方法pycharm断点调试控制台输入代码中循环的debug方法pycharm中图标的介绍常见的BugDebug经验1. 检查激活函数的输入值2. 检查梯度3. 消融实验4. 使用最短的时间5. 静下心来写在最前面 之前把seq2seqattention…...

直方图及其应用

直方图定义直方图是一种描述数据的分布通过将连续变量划分成一系列区间,统计区间频率,并用来表示,以表征其统计特征在图像处理中,直方图可以用来表示图像中像素值的分布状况,描述不同灰度级的像素在图像中的占比直方图…...

《SpringBoot篇》26.SpringBoot整合Jackson超详细教程(附Jackson工具类)

陈老老老板🦸👨‍💻本文专栏:SpringBoot篇(主要讲一些与springboot整合相关的内容)👨‍💻本文简述:本文讲一下Jackson常见用法,超级详细。👨‍&am…...

Redis 如何实现库存扣减操作和防止被超卖?

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…...

(Linux)Ubuntu查看系统版本

uname -a : 查看操作系统的发行版号和操作系统版本 Command: uname -aResult: Linux SERVER 5.19.0-35-generic #36-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb 3 18:36:56 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux uname -v : 查看版本号 Command: uname -vResult: #36-Ubuntu …...

VxWorkds 内存管理(3)

虚拟内存管理 对于带MMU的目标板,VxWorks提供虚拟内存的支持,VxWorks提供了两种虚拟内存管理单元(MMU)的支持: 基本MMU和VxVMI 基本MMU邦定于VxWorks中,可以通过config.h中宏定义INCLUDE MMU BASIC或Tornado工程配置中包含基本MMU组件 VxV…...

单元测试、反射、注解、动态代理

🏡个人主页 : 守夜人st 🚀系列专栏:Java …持续更新中敬请关注… 🙉博主简介:软件工程专业,在校学生,写博客是为了总结回顾一些所学知识点 目录单元测试、反射、注解、动态代理单元测…...

【数据结构】夯实基础|线性表刷题01

作者:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。博主主页: 是瑶瑶子啦所属专栏: 【数据结构|刷题专栏】:该专栏专注于数据结构知识,持续更新&a…...

Java怎么实现几十万条数据插入(30万条数据插入MySQL仅需13秒)

本文主要讲述通过MyBatis、JDBC等做大数据量数据插入的案例和结果。 30万条数据插入插入数据库验证实体类、mapper和配置文件定义User实体mapper接口mapper.xml文件jdbc.propertiessqlMapConfig.xml不分批次直接梭哈循环逐条插入MyBatis实现插入30万条数据JDBC实现插入30万条数…...

java多线程之线程的六种状态

线程的六种状态(1) NEW(初始状态)(2) TERMINATED(终止状态 / 死亡状态)(3) RUNNABLE(运行时状态)(4) TIMED_WAITING(超时等待状态)(5) WAITING(等待状态)(6) BLOCK(阻塞状态)sleep和wait的区别:操作系统里的线程自身是有一个状态的,但是java Thread 是对系统线程的封装,把这里的…...

UnixBench----x86架构openEuler操作系统上进行性能测试

【原文链接】UnixBench----x86架构openEuler操作系统上进行性能测试 (1)打开github上 UnixBench 地址,找到发布的tag (2)找到tar.gz包,右键复制链接 比如这里是 https://github.com/kdlucas/byte-unix…...

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...