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

java基础语知识(8)

类之间的关系

在类之间,最常见的关系有:

  • 依赖(“uses-a”);
  • 聚合(“has-a”);
  • 继承(“is-a”)。
  1. 依赖:一种使用关系,即一个类的实现需要另一个类的协助,使用关系具有偶然性、临时性、非常弱,被使用类的变化会影响到使用类。在 Java 中表现为局部变量、方法的参数或者对静态方法的调用。例如class Driver中方法drive1(Car car)drive2()drive3()分别通过形参、局部变量、静态方法调用体现对Car类的依赖。
  2. 聚合:关联关系的特例,是强关联关系,体现整体与部分的关系,且部分可以离开整体而单独存在,它们有各自的生命周期,部分可属于多个整体对象,也可为多个整体对象共享。在 Java 中一般使用成员变量形式实现,一般用setter方法给成员变量赋值。例如class DriverCar mycar,若赋予 “车是司机财产一部分” 语义,可表示聚合关系。
  3. 继承(泛化):是一种继承关系,表示一般与特殊的关系,指定子类如何获得父类的所有特征和行为。通过关键字extends明确标识。例如class Dog extends Animal,表示Dog类继承自Animal类,Dog类拥有Animal类的属性和方法,还可拥有自己特有的属性和方法。

对象与对象变量

想要使用对象,首先必须先构造对象,并且对其指定初始状态。然后对对象应用方法。

在java程序设计语言中,要使用构造器(constructor, 或称构造函数)构造新实例。构造器是一种特殊的方法,用来构造并初始化对象。

构造器的定义

构造器的名称必须与类名完全相同,并且没有返回类型(连 void 也不能有)。

基本语法如下:

[访问修饰符] 类名([参数列表]) {// 构造器的方法体
}

 构造器的特点

  • 名称与类名相同:构造器的名称必须和所在类的名称一致,这是 Java 语言的规定,用于明确标识这是一个构造器。大小写也需要一致。
  • 没有返回类型:构造器不能声明返回类型,包括 void 也不可以。这是因为构造器的主要目的是创建并初始化对象,而不是返回一个值。
  • 在创建对象时自动调用:当使用 new 关键字创建一个对象时,会自动调用相应类的构造器来完成对象的初始化工作。

对象(Object)

定义

对象是类的一个实例。类是对一类事物的抽象描述,规定了这类事物所具有的属性和行为;而对象则是类在现实世界中的具体个体,它拥有类所定义的属性和行为的具体值。例如,“汽车” 可以看作一个类,而某一辆具体的红色宝马汽车就是 “汽车” 类的一个对象。

创建对象

在 Java 中,使用 new 关键字来创建对象,其一般步骤如下:

  1. 声明类类型的变量:指定要创建对象的类型。
  2. 使用 new 关键字创建对象:调用类的构造器来初始化对象。
class Car {String color;String brand;// 构造器public Car(String color, String brand) {this.color = color;this.brand = brand;}public void showInfo() {System.out.println("This is a " + color + " " + brand + " car.");}
}public class Main {public static void main(String[] args) {// 创建 Car 对象Car myCar = new Car("red", "BMW");myCar.showInfo();}
}

 在上述代码中,Car 是一个类,myCar 是 Car 类的一个对象。通过 new Car("red", "BMW") 调用 Car 类的构造器创建了一个具体的汽车对象,并对其属性进行了初始化。

对象变量(Object Variable)

定义

对象变量是用来引用对象的变量,它存储的是对象在内存中的引用(地址),而不是对象本身。可以把对象变量看作是指向对象的一个 “指针”,通过这个变量可以访问和操作对象的属性和方法。

对象变量的声明和赋值

声明对象变量的语法与声明基本数据类型变量类似,需要指定变量的类型和名称。赋值时,将 new 关键字创建的对象的引用赋给对象变量。

示例代码如下:

class Dog {String name;public Dog(String name) {this.name = name;}public void bark() {System.out.println(name + " is barking!");}
}public class Main {public static void main(String[] args) {// 声明对象变量Dog myDog;// 创建对象并将引用赋值给对象变量myDog = new Dog("Buddy");myDog.bark();}
}

在上述代码中,Dog myDog; 声明了一个 Dog 类型的对象变量 myDogmyDog = new Dog("Buddy"); 将创建的 Dog 对象的引用赋给了 myDog 变量,之后就可以通过 myDog 来调用 Dog 对象的方法。  

对象和对象变量的区别

  1. 存储内容不同

    • 对象:对象是在堆内存中实际分配的一块内存区域,包含了对象的属性值等具体数据。
    • 对象变量:对象变量存储的是对象在堆内存中的引用(地址),它位于栈内存中。
  2. 生命周期不同

    • 对象:对象的生命周期从使用 new 关键字创建开始,直到没有任何对象变量引用它,并且被 Java 的垃圾回收机制回收为止。
    • 对象变量:对象变量的生命周期取决于它的作用域。当对象变量超出其作用域时,它就会被销毁,但对象本身不一定被销毁,只要还有其他对象变量引用它。
  3. 操作方式不同

    • 对象:对象本身不能直接进行操作,需要通过对象变量来访问和操作对象的属性和方法。
    • 对象变量:可以通过对象变量来调用对象的方法、访问对象的属性等。
  • 需要注意的是,对象变量并没有实际包含一个对象,它只是引用一个对象。 
  • 在java中,任何对象变量的值都是对存储在另一个地方的某个对象的引用。

注:很多人误以为 Java 对象变量等同于 C++ 引用。实则不然,C++ 无 null 引用且引用不可赋值。Java 对象变量类似 C++ 对象指针,如 Java 的 Date birthday; 等同于 C++ 的 Date* birthday; ,且二者用 new 初始化语法相近。变量复制后,二者指向同一对象指针,Java 的 null 引用对应 C++ 的 NULL 指针。

this关键字

在 Java 中,this关键字是一个引用,指向当前对象的实例,主要有以下几种用法:

引用当前对象的成员变量

当类中方法的局部变量和成员变量同名时,根据就近原则,方法会优先使用局部变量。若想访问被覆盖的成员变量,则需使用this前缀。例如:

public class Teacher { private String name; private double salary; private int age; public Teacher(String name,double salary,int age) { this.name = name; this.salary = salary; this.age = age; }
}

上述代码中,构造方法的参数与成员变量同名,通过this.namethis.salarythis.age明确操作的是成员变量。 

调用当前对象的其他方法

this关键字可在方法内部调用当前对象的其他方法,能避免与方法参数或局部变量同名的方法名冲突,确保调用的是当前对象的方法。示例如下:

public class Dog { public void jump() { System.out.println("正在执行jump方法"); } public void run() { this.jump(); System.out.println("正在执行run方法"); }
}
访问本类的构造方法

this()用于访问本类的构造方法,且必须是构造方法中的第一条语句。例如:

public class Student { String name; public Student() { this("张三"); } public Student(String name) { this.name = name; } public void print() { System.out.println("姓名:" + name); }
}

无参构造方法Student()中,this("张三")调用了有参构造方法Student(String name)

实现链式调用

在方法返回this关键字,可实现链式调用,即能在同一个对象上连续调用多个方法。示例:

public class Calculator { private int result; public Calculator add(int number) { this.result += number; return this; } public Calculator subtract(int number) { this.result -= number; return this; } public int getResult() { return this.result; }
} 
// 链式调用示例 
Calculator calculator = new Calculator(); 
calculator.add(5).subtract(3); 
int result = calculator.getResult(); 

上述代码中,addsubtract方法都返回this,实现了链式调用。

 

此外,使用this关键字还有一些注意事项:

  • 不能在静态方法中使用,因为静态方法属于类本身,而非任何对象。
  • this关键字的值不能被赋值给另一个变量,因其只是一个引用,不是对象。
  • 应避免滥用,以免影响代码的可读性和可维护性。
  • this可以区分成员变量和局部变量。

构造方法

构造方法注意事项

1. 构造方法的定义- 如果没有定义构造方法,系统将给出一个默认的无参数构造方法。 - 如果定义了构造方法,系统将不再提供默认的构造方法。

2. 构造方法的重载 - 带参构造方法和无参数构造方法,两者方法名相同,但是参数不同,这叫做构造方法的重载。

3. 推荐的使用方式- 无论是否使用,都手动书写无参数构造方法,和带全部参数的构造方法。

无参数构造方法

如果类中没有定义任何构造方法,Java 编译器会自动提供一个默认的无参数构造方法。当然,也可以手动定义无参数构造方法。示例如下:

class Book {String title;int pageCount;// 无参数构造方法public Book() {title = "默认书名";pageCount = 0;}public void displayInfo() {System.out.println("书名: " + title);System.out.println("页数: " + pageCount);}
}public class Main {public static void main(String[] args) {// 创建Book对象时,调用无参数构造方法Book myBook = new Book();myBook.displayInfo();}
}

 在上述代码中,Book类定义了一个无参数构造方法,在创建Book对象时,该构造方法会被调用,将title初始化为 “默认书名”,pageCount初始化为 0。

带全部参数构造方法

带参数的构造方法用于在创建对象时,为对象的成员变量赋初始值。示例如下:

class Person {String name;int age;String address;// 带全部参数构造方法public Person(String name, int age, String address) {this.name = name;this.age = age;this.address = address;}public void showInfo() {System.out.println("姓名: " + name);System.out.println("年龄: " + age);System.out.println("地址: " + address);}
}public class Main {public static void main(String[] args) {// 创建Person对象时,调用带全部参数构造方法Person person = new Person("张三", 25, "北京市");person.showInfo();}
}

这里Person类的构造方法接受nameageaddress三个参数,在创建Person对象时,通过传递相应的参数来初始化对象的成员变量。

构造方法重载

一个类中可以有多个构造方法,只要它们的参数列表不同,这就是构造方法重载。示例如下:

class Circle {double radius;String color;// 无参数构造方法public Circle() {radius = 1.0;color = "红色";}// 带一个参数构造方法public Circle(double radius) {this.radius = radius;color = "蓝色";}// 带两个参数构造方法public Circle(double radius, String color) {this.radius = radius;this.color = color;}public void printInfo() {System.out.println("半径: " + radius);System.out.println("颜色: " + color);}
}public class Main {public static void main(String[] args) {// 使用不同的构造方法创建对象Circle circle1 = new Circle();Circle circle2 = new Circle(2.5);Circle circle3 = new Circle(3.0, "绿色");circle1.printInfo();circle2.printInfo();circle3.printInfo();}
}

 在Circle类中,定义了三个构造方法,分别是无参数、带一个参数、带两个参数的构造方法。通过构造方法重载,可以根据不同的需求,以不同的方式来创建Circle对象。

标准的javabean类

JavaBean 是一种符合特定编程规范的 Java 类,在 Java 开发中用于封装数据和提供访问数据的方法,方便在不同组件间传递数据等。

在java中:

  1. 类是公共的(public):保证其他类能够访问该 JavaBean 类。
  2. 有一个公共的无参构造方法:便于在反射等机制以及框架(如 Spring)创建对象时使用,比如在框架初始化对象实例时,会首先调用这个无参构造方法。
  3. 属性私有(private):对数据进行封装,保证数据的安全性,防止外部直接访问和修改。
  4. 通过公共的 getter 和 setter 方法访问属性:提供了受控的方式来访问和修改私有属性,同时也可以在这些方法中添加业务逻辑,比如数据验证等。
组成部分
  1. 私有属性:用于存储数据,例如:
private String name;
private int age;

上述代码中,name和age就是JavaBean类的私有属性。 

 2. 无参构造方法

public MyBean() {
}

无参构造方法在创建对象时若没有传入参数,会默认初始化对象的属性。

3. getter 方法:用于获取私有属性的值,命名规范是get加上属性名,且首字母大写(对于布尔类型属性,若属性名是is开头,则 getter 方法为is属性名),例如: 

public String getName() {return name;
}
public int getAge() {return age;
}

4.setter 方法:用于设置私有属性的值,命名规范是set加上属性名,且首字母大写,例如:

public void setName(String name) {this.name = name;
}
public void setAge(int age) {this.age = age;
}

 一个完整的JavaBean示例如下:

public class Person {// 私有属性private String name;private int age;// 无参构造方法public Person() {}// getter方法public String getName() {return name;}public int getAge() {return age;}// setter方法public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}
}

在使用时,可以:

public class Main {public static void main(String[] args) {Person person = new Person();person.setName("Alice");person.setAge(25);System.out.println("姓名:" + person.getName() + ",年龄:" + person.getAge());}
}
注意事项
  • 类名需要见名知意。
  • 成员变量使用private修饰。
  • 提供至少两个构造方法: 无参构造方法。 带全部参数的构造方法。
  • 成员方法: 提供每一个成员变量对应的setXxx()/getXxx()。 如果还有其他行为,也需要写上。

Java 内存分配区域

Java 内存主要分为以下几个区域:

  • 栈(Stack):方法运行时所进入的内存,局部变量也是在这里存储。每个方法在执行时会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。方法执行结束,栈帧就会被销毁。例如,在一个方法中定义的int num = 10;num这个局部变量就存储在栈内存中。
  • 堆(Heap)new出来的对象和数组等都在堆内存中开辟空间并产生地址。堆是 Java 内存管理的核心区域,是被所有线程共享的一块内存区域,其生命周期从 JVM 启动开始,直到 JVM 停止。对象的实例化、内存分配等操作都在堆中进行,比如new Student();创建的学生对象就存放在堆内存中。
  • 方法区(Method Area):字节码文件加载时进入的内存,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。例如HelloWorld.classTest.class等字节码文件在加载时就会进入方法区。另外,像static修饰的静态变量也存储在方法区。
  • 本地方法栈(Native Method Stack):与虚拟机使用的本地方法相关,为 Native 方法服务。比如 Java 调用 C 或 C++ 的本地代码时,相关的内存操作就在本地方法栈进行。
  • 寄存器:用于存储指令、操作数等,是 CPU 内部的高速存储区域,与 Java 内存模型的关系相对间接,主要供 CPU 快速访问数据。

一个对象的内存分配过程(以Student s = new Student();为例)

  1. 加载 class 文件:JVM 首先会查找并加载Student类的字节码文件(.class文件)到方法区,解析类的元数据信息,如类的字段、方法等。
  2. 申明局部变量:在栈内存中声明一个名为s的局部变量,此时它还没有指向任何有效的对象。
  3. 在堆内存中开辟一个空间:使用new关键字在堆内存中为Student对象分配一块内存空间,这块空间用于存储对象的实例变量等数据。
  4. 默认初始化:堆内存中为对象分配的空间会进行默认初始化,比如对于基本数据类型的成员变量,int类型默认初始化为0boolean类型默认初始化为false等;对于引用类型的成员变量,默认初始化为null
  5. 显示初始化:按照类中成员变量定义时的赋值语句进行初始化,例如private int age = 18;,如果有这样的定义,此时age就会被初始化为18
  6. 构造方法初始化:调用Student类的构造方法,对对象进行进一步的初始化操作,构造方法中可以对成员变量进行赋值等操作。
  7. 将堆内存中的地址值赋值给左边的局部变量:把在堆内存中创建的Student对象的地址赋值给栈内存中的局部变量s,此时s就指向了堆内存中的Student对象,后续就可以通过s来操作该对象。

多个对象引用指向同一个对象的内存情况

假设有以下代码:

Student s1 = new Student();
Student s2 = s1;
  • 首先按照上述单个对象创建过程,new Student();在堆内存中创建一个Student对象,同时在栈内存中创建局部变量s1并指向堆中的对象。
  • 执行Student s2 = s1;时,在栈内存中又创建了一个局部变量s2,并将s1中存储的对象地址赋值给s2,这样s1s2都指向了堆内存中的同一个Student对象。此时,如果通过s1修改对象的属性,s2访问该对象时也会看到属性的变化,因为它们指向的是同一个对象。

不同对象的内存情况

当有多个不同对象创建时,比如:

Student s1 = new Student();
Student s3 = new Student();
  • 每次执行new Student();都会在  堆内存中开辟独立的空间创建新的Student对象。
  • 栈内存中分别有s1s3两个局部变量,它们各自指向堆内存中不同的Student对象,这两个对象的属性相互独立,修改s1指向对象的属性不会影响s3指向的对象。

相关文章:

java基础语知识(8)

类之间的关系 在类之间,最常见的关系有: 依赖(“uses-a”);聚合(“has-a”);继承(“is-a”)。 依赖:一种使用关系,即一个类的实现需要另一个类的协助&#x…...

室内定位精度方案对比

室内定位精度方案对比:成本、开发难度与精度的权衡 索引 引言 Wi-Fi 定位方案 定位原理 成本分析 开发难度 定位精度 蓝牙定位方案 定位原理 成本分析 开发难度 定位精度 超宽带(UWB)定位方案 定位原理 成本分析 开发难度 定…...

Pytorch深度学习教程_5_编写第一个神经网络

欢迎来到《pytorch深度学习教程》系列的第五篇!在前面的四篇中,我们已经介绍了Python、numpy及pytorch的基本使用,并在上一个教程中介绍了梯度。今天,我们将探索神经网络,对于神经网络进行概述并进行简单的实践学习 欢…...

ImportError: cannot import name ‘FixtureDef‘ from ‘pytest‘

错误信息表明 pytest 在尝试导入 FixtureDef 时出现了问题。通常是由于 pytest 版本不兼容 或 插件版本冲突 引起的。以下是详细的排查步骤和解决方案: 1. 检查 pytest 版本 首先,确认当前安装的 pytest 版本。某些插件可能需要特定版本的 pytest 才能…...

改BUG:Mock测试的时候,when失效

问题再现: 这里我写了一测试用户注册接口的测试类,并通过when模拟下层的服务,但实际上when并没有奏效,还是走了真实的service层的逻辑。 package cn.ac.evo.review.test;import cn.ac.evo.review.user.UserMainApplication; imp…...

【自动化脚本工具】AutoHotkey (Windows)

目录 1. 介绍AutoHotkey2. 功能脚本集锦2.1 桌面键盘显示 1. 介绍AutoHotkey 支持Windows安装使用,下载地址为:https://www.autohotkey.com/ 2. 功能脚本集锦 2.1 桌面键盘显示 便于练习键盘盲打 脚本地址:https://blog.csdn.net/weixin_6…...

专题--Linux体系

Linux体系结构相关| ProcessOn免费在线作图,在线流程图,在线思维导图 ProcessOn是一个在线协作绘图平台,为用户提供强大、易用的作图工具!支持在线创作流程图、思维导图、组织结构图、网络拓扑图、BPMN、UML图、UI界面原型设计、iOS界面原型设计等。同时…...

【DeepSeek】Mac m1电脑部署DeepSeek

一、电脑配置 个人电脑配置 二、安装ollama 简介:Ollama 是一个强大的开源框架,是一个为本地运行大型语言模型而设计的工具,它帮助用户快速在本地运行大模型,通过简单的安装指令,可以让用户执行一条命令就在本地运…...

Spring AI + Ollama 实现调用DeepSeek-R1模型API

一、前言 随着人工智能技术的飞速发展,大语言模型(LLM)在各个领域的应用越来越广泛。DeepSeek 作为一款备受瞩目的国产大语言模型,凭借其强大的自然语言处理能力和丰富的知识储备,迅速成为业界关注的焦点。无论是文本生…...

如何在本地和服务器新建Redis用户和密码

文章目录 一. Redis安装二. 新建Redis用户,测试连接2.1 本地数据库2.2 线上数据库2.2.1 安装和配置2.2.2 测试连接 三. 配置四. 分布式 一. Redis安装 Redis安装 可以设置开机自动启动,也可以在去查看系统服务,按[win R],输入命…...

jmeter接口测试(一)

一、什么是接口测试?为什么要做接口测试? 接口测试:就是测试项目和项目之间,模块和模块之间,组件和组件之间的数据交互和权限鉴定(鉴权)。 前后端分离:前后端联调。mock模拟&#x…...

Java-11

淘天集团2025届春季校园招聘在线笔试-研发 1。设有一个顺序共享栈storageArray[70],其中栈X的栈顶指针top1的初值为-1,栈Y的栈顶指针top2的初值为70,通过不断进行入栈操作,直到storageArray数组已满,此时top1 top2 …...

js中常用方法整理

数据类型 typeOf()Number()parseInt()parseFloat()- * / %检测数据类型转换为数字转换为整数类型转换为浮点类型非加法的数字运算toString()Boolean()String()转换为字符串,不能转换undefined/null字符串拼接转换为布尔类型转换为字符串、所有…...

umi react+antd 判断渲染消息提示、input搜索、多选按钮组

记得map里返回的每层遍历结构都要带上key(图里没加,最近在接手react,熟悉中......

Day15-后端Web实战-登录认证——会话技术JWT令牌过滤器拦截器

目录 登录认证1. 登录功能1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 测试 2. 登录校验2.1 问题分析2.2 会话技术2.2.1 会话技术介绍2.2.2 会话跟踪方案2.2.2.1 方案一 - Cookie2.2.2.2 方案二 - Session2.2.2.3 方案三 - 令牌技术 2.3 JWT令牌2.3.1 介绍2.3.2 生成和校…...

【嵌入式常用工具】Srecord使用

文件格式 -Intel 表示hex格式-Motorola 表示S19格式-BINary 表示bin格式 截取指定地址段 srec_cat input.s19 -Motorola -crop 0x80010000 0x80380000 -output output.s19 -Motorola -address-length4填充指定地址段 srec_cat input.s19 -Motorola -fill 0xFF 0x100 0x200 …...

SwiftUI基础组件之HStack、VStack、ZStack详解

文章目录 引言一、HStack(水平堆栈)1.1 基本概念1.2 基本创建1.3 常用属性1.3.1 spacing1.3.2 alignment 二、VStack(垂直堆栈)2.1 基本概念2.2 基本创建2.3 常用属性2.3.1 spacing2.3.2 alignment 三、ZStack(深度堆栈…...

第2章 深入理解Thread构造函数

Thread的构造函数。 2.1 线程的命名 在构造一个Thread时可以为其命名。 2.1.1 线程的默认命名 下面构造函数中,并没有为线程命名。 Thread() Thread(Runnable target) Thread(ThreadGroup group, Runnable target)打开源码会看到 public Thread(Runnable targe…...

PLC扫描周期和工作原理

可编程逻辑控制器(PLC)的运行原理和扫描周期是其实现工业自动化的核心机制。以下从运行原理、扫描周期组成、关键特性及优化方向等方面进行详细阐述: 一、PLC运行原理 PLC采用**循环扫描(Cyclic Scan)**的工作模式&am…...

玩转Docker | 使用Docker部署本地自托管reference速查表工具

玩转Docker | 使用Docker部署本地自托管reference速查表工具 前言一、Reference介绍Reference简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署reference服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问reference应用五、测试与…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

什么是EULA和DPA

文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...