面向对象(基础)特征一:封装性(encapsulation)

文章目录

  • 一、介绍
    • (1)封装性
    • (2)权限修饰符
  • 二、案例
    • (1)案例1
  • 三、练习
    • (1)练习1
    • (2)练习2
    • (3)练习3
    • (4)练习4

面向对象特征之一:封装性

一、介绍

(1)封装性

  1. 为什么需要封装性?
  • 我要用洗衣机,只需要按一下开关和洗涤模式就可以了。有必要了解洗衣机内部的结构吗?有必要碰电动机吗?
  • 我要开车,我不需要懂离合、油门、制动等原理和维修也可以驾驶。

随着我们系统越来越复杂,类会越来越多,那么类之间的访问边界必须把握好,面向对象的开发原则要 遵循“ 高内聚、低耦合 ”。 高内聚、低耦合是软件工程中的概念,也是UNIX 操作系统设计的经典原则。

内聚,指一个模块内各个元素彼此结合的紧密程度;耦合指一个软件结构内不同模块之间互连程度的度量。内聚意味着重用和独立,耦合意味着多米诺效应牵一发动全身。

内聚:把特定的内容封装到不同的类里面,把类里面特定的功能封装到不同的方法当中。

耦合:相互之间要调用的时候,只对外暴露需要用的,不需要使用的细节就不对外暴露了。

理论上:

  • 高内聚类的内部数据操作细节自己完成,不允许外部干涉;
  • 低耦合仅暴露少量的方法给外部使用,尽量方便外部调用。

所谓封装,就是把客观事物封装成抽象概念的类,并且类可以把自己的数据和方法只向可信的类或者对 象开放,向没必要开放的类或者对象隐藏信息。

通俗的说:把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。

(2)权限修饰符

  1. 如何实现数据封装?
    2.1 权限修饰符
    Java规定了4种权限修饰,分别是:private缺省protectedpublic
    image.png
    image.png
    2.2 作用
    我们可以使用4种权限修饰来修饰类及类的内部成员。当这些成员被调用时,体现可见性的大小

:只能使用public缺省修饰
类的内部成员:可以使用4种权限修饰进行修饰。

比如,这里的类用的是“缺省”:

class Animal{   //动物}

这个类用的是“public”:

public class AnimalTest {public static void main(String[] args) {Animal animal1=new Animal();}
}

但是使用“private”就不行,比如:
image.png

private修饰的是类的内部文件,此时AA就是一个类,它对自己可见,而且外边用不了,没有什么作用。

protected也一样,修饰的属性让子类的类能够看到,主要指的是成员,类自己加没有什么意义。

目前写的类是并列关系,都叫外部类,比如下面的AnimalTest类和Animal类:

public class AnimalTest {public static void main(String[] args) {Animal animal1=new Animal();}
}
class Animal{   //动物}

若在Animal类里面再写一个类,这个类就是内部类,内部类可以被四种权限修饰。(后边再说,不着急)

2.3 开发中4种权限使用频率的情况:

比较高:public、private

比较低:缺省、protected

  1. 封装性的体现

场景1:私有化(private)类的属性,提供公共(public)的get和set方法,对此属性进行获取或修改

场景2:将类中不需要对外暴露的方法,设置为private.

场景3:单例模式中构造器private的了,避免在类的外部创建实例。(放到static关键字后讲)

二、案例

(1)案例1

看下面的代码:

package yuyi.exer01.exe01;/*** ClassName: AnimalTest* Package: yuyi.exer01.exe01* Description:** @Author 雨翼轻尘* @Create 2023/10/22 0022 13:29*/
public class AnimalTest {public static void main(String[] args) {Animal animal1=new Animal();animal1.name="金蟾";animal1.legs=4;System.out.println("name="+animal1.name+",legs="+animal1.legs);animal1.eat();}
}
class Animal{   //动物//属性String name;    //名字int legs;   //腿的个数//方法public void eat(){System.out.println("动物觅食");}
}

执行结果
image.png

⚡注意

不能直接在Animal类中写这种语句:System.out.println("动物");

类里面只能有属性和方法,而上面的语句既不算属性,也不算方法,只是一个执行语句,它只能放在方法里面。

class Animal{   //动物//属性String name;    //名字int legs;   //腿的个数System.out.println("动物");	//不能这样写//方法public void eat(){System.out.println("动物觅食");}
}

现在想给legs设置一个判断逻辑,只有正偶数的值才能被输出。

在Animal类中直接判断是不对的,如下:
image.png

但是属性可以在方法里面调用,所以我们可以在Animal类中写一个方法,在方法里面对legs进行逻辑判断。

//设置legs属性值
public void setLegs(int l){if(l>=0&&l%2==0){   //腿的个数为正偶数legs=l;}else{System.out.println("输入数据非法");}
}

在给属性赋值的时候,不需要再直接调用属性了,可以通过刚才的setLegs方法来调用,如下:

 //animal1.legs=4;
animal1.setLegs(4); //若输入的值是正偶数,就能正确输出结果

完整代码:

public class AnimalTest {public static void main(String[] args) {Animal animal1=new Animal();animal1.name="金蟾";//animal1.legs=4;animal1.setLegs(4); //若输入的值是正偶数,就能正确输出结果System.out.println("name="+animal1.name+",legs="+animal1.legs);animal1.eat();}
}
class Animal{   //动物//属性String name;    //名字int legs;   //腿的个数/*不能直接在这里判断if(legs>=0){}*///方法public void eat(){System.out.println("动物觅食");}public void setLegs(int l){if(l>=0&&l%2==0){   //腿的个数为正偶数legs=l;}else{System.out.println("输入数据非法");}}
}

输出结果:
image.png


但是现在我们还是可以直接来调用属性,现在只不过是多了一种方式判断逻辑而已。

那么如何让它彻底不能通过调用属性来给leg赋值?

可以在定义属性的时候,在前面加一个权限修饰符private:(表示将这个属性私有化了,就是将它隐藏起来了,仅限在类的内部看到)

 private int legs;

此时外界(出了Animal类)就看不到legs属性了。

所以直接调用legs属性就不被允许了。如下:
image.png

同时这里的legs也不能用了:
image.png

那怎么办呢?

可以在Animal类中再写一个方法:

//获取legs属性值
public int getLegs(){return legs;
}

这个方法的权限是public,使用范围还是很大的。

现在就可以调用了:

System.out.println("name="+animal1.name+",legs="+animal1.getLegs());

此时编译器看到的就是这个方法的返回值类型(int类型的变量),所以就可以使用了。


整体代码:

package yuyi.exer01.exe01;/*** ClassName: AnimalTest* Package: yuyi.exer01.exe01* Description:** @Author 雨翼轻尘* @Create 2023/10/22 0022 13:29*/
public class AnimalTest {public static void main(String[] args) {Animal animal1=new Animal();animal1.name="金蟾";//因为legs声明为private,是私有的,出了Animal类之外就不能调用了//animal1.legs=4;//只能通过setLegs(),间接对legs属性进行赋值animal1.setLegs(4); //若输入的值是正偶数,就能正确输出结果//System.out.println("name="+animal1.name+",legs="+animal1.legs);System.out.println("name="+animal1.name+",legs="+animal1.getLegs());animal1.eat();}
}
class Animal{   //动物//属性String name;    //名字private int legs;   //腿的个数/*不能直接在这里判断if(legs>=0){}*///方法public void eat(){System.out.println("动物觅食");}//设置legs属性值public void setLegs(int l){if(l>=0&&l%2==0){   //腿的个数为正偶数legs=l;}else{System.out.println("输入数据非法");}}//获取legs属性值public int getLegs(){return legs;}
}

输出结果:
image.png

通过这个例子可以看到,为什么需要将一些必要的结构隐藏起来,因为不希望外边的用户可以随意的调用它,就需要将它私有化。如果外边想用,那就提供相应的方法,在方法里面对私有化的属性进行其他的设置。

权限修饰符的使用,就是封装性的体现。


👻总结

在上述案例中,我们给Animal的对象的legs属性赋值。在实际的常识中,我们知道legs不能赋值为负数的。但是如果
直接调用属性legs,是不能加入判断逻辑的。

那怎么办呢?

将legs属性私有化(private),禁止在Animal类的外部直接调用此属性。

提供给legs属性赋值的setLegs()方法,在此方法中加入legs赋值的判断逻辑if(legs >= 0 && legs % 2 ==0)
将此方法暴露出去,使得在Animal类的外部调用此方法,对legs属性赋值。

提供给legs属性获取的getLegs()方法,此方法对外暴露。使得在Animal类的外部还可以调用此属性的值。

若是在类的外部不想让用户获取legs的值,可以不写getLegs()方法,或者将它的权限修饰符设置为private,如下:

private int getLegs(){return legs;
}

此时getLegs方法对外也不暴露了,在Animal方法外面也就不能调用它了:
image.png

三、练习

(1)练习1

🌋题目描述

创建程序,在其中定义两个类:Person和PersonTest类。定义如下:

用setAge()设置人的合法年龄(0~130),用getAge()返回人的年龄。

在PersonTest类中实例化Person类的对象b,调用setAge()和getAge()方法,体会Java的封装性。

🤺代码

package yuyi.exer01.exe01;/*** ClassName: Person* Package: yuyi.exer01.exe01* Description:*创建程序,在其中定义两个类:Person和PersonTest类。定义如下:* 用setAge()设置人的合法年龄(0~130),用getAge()返回人的年龄。* 在PersonTest类中实例化Person类的对象b,调用setAge()和getAge()方法,体会Java的封装性。** @Author 雨翼轻尘* @Create 2023/10/22 0022 15:02*/
public class Person {//属性private int age;    //不对外暴露//设置age属性public void setAge(int agenumber){if(agenumber>=0&&agenumber<=130){age=agenumber;}else{System.out.println("输入的年龄有误");}}//获取age属性public int getAge(){return age;}
}
class PersonTest{public static void main(String[] args) {//创建Person实例1Person b=new Person();//b.age=21;   //编译不通过b.setAge(22);   //赋值System.out.println(b.getAge()); //获取值}
}

⚡输出结果
image.png

👻注意

可以将这两个方法合并吗?如下:
image.png

现在两个功能合并在一起了,Age方法的耦合度更高,不建议这样来写!

比如之前已经有了一个Person对象,现在我只想看看是多少岁,如果是左边的两种方法,我就可以通过getAge看一下是多少岁。

但如果是右边的Age方法,此时我需要传进一个参数,然后又返回相同的数值,这就违背初衷了。

每一个方法就只单纯的完成一个功能,在实际需要的时候再去组合这些方法完成特定的操作即可。不要刻意合并!!!

(2)练习2

🌋题目描述

【自定义图书类】

设定属性包括:

书名bookName,

作者author,

价格price;

方法包括:

相应属性的get/set方法,

图书信息介绍等。

🤺代码

【book.java】

package yuyi.exer01.exe01;/*** ClassName: book* Package: yuyi.exer01.exe01* Description:* 【自定义图书类】* 设定属性包括:* 书名bookName,* 作者author,* 价格price;* <p>* 方法包括:* 相应属性的get/set方法,* 图书信息介绍等。** @Author 雨翼轻尘* @Create 2023/10/22 0022 15:39*/
public class book {//属性private String bookName; //书名private String author;   //作者private double price;   //价格//方法//1.1设置书名public void setbookName(String b) {//...bookName = b;}//1.2获取书名public String getbookName() {return bookName;}//2.1设置作者public void setauthor(String a) {//...author = a;}//2.2获取作者public String getauthor() {return author;}//3.1设置价格public void setprice(double s) {//...price = s;}//3.2获取价格public double getprice() {return price;}//4.获取图书信息public String showInfo(){return "bookName:"+bookName+",author:"+author+",price:"+price;}
}

【bookTest.java】

package yuyi.exer01.exe01;/*** ClassName: bookTest* Package: yuyi.exer01.exe01* Description:** @Author 雨翼轻尘* @Create 2023/10/22 0022 15:54*/
public class bookTest {public static void main(String[] args) {book book1=new book();book1.setbookName("西游记");book1.setauthor("吴承恩");book1.setprice(30.46);System.out.println(book1.showInfo());}
}

可以使用Ctrl+Alt+L来调整代码格式(idea编译器)

此时我们看到的就是对外暴露的方法。

从后期来看,只要不是一些常量的话,一般都将属性私有化,对外都是暴露方法,通过方法对属性进行修改。

⚡输出结果
image.png

👻注意

每创建一个对象,类里面的属性就会各自持有一份。

现在“封装性”考虑的只是控制这些属性、方法在被访问的时候权限的大小而已。不会影响各个对象属性方法之间的关系,都会各自一份属性方法。

(3)练习3

🌋题目描述

【普通员工类】

(1)声明员工类Employee,

  • 包含属性:姓名、性别、年龄、电话,属性私有化
  • 提供get/set方法
  • 提供String getInfo()方法
    (2)在测试类的main中创建员工数组,并从键盘输入员工对象信息,最后遍历输出
    image.png

image.png

🤺代码

【Employee.java】

package yuyi.exer01.exe01;/*** ClassName: Employee* Package: yuyi.exer01.exe01* Description:*【普通员工类】* (1)声明员工类Employee,* - 包含属性:姓名、性别、年龄、电话,属性私有化* - 提供get/set方法* - 提供String getInfo()方法* (2)在测试类的main中创建员工数组,并从键盘输入员工对象信息,最后遍历输出** @Author 雨翼轻尘* @Create 2023/10/22 0022 16:06*/
public class Employee {//属性private String name;private char sex;private int age;private String number;//方法//1.1设置姓名public void setname(String na){//...name=na;}//1.2获得姓名public String getname(){return name;}//2.1设置性别public void setsex(char se){//...sex=se;}//2.2获得性别public char getsex(){return sex;}//3.1设置年龄public void setage(int ag){//...age=ag;}//3.2获得年龄public int getage(){return age;}//4.1设置电话public void setnumber(String nu){//...number=nu;}//4.2获得电话public String getnumber(){return number;}//String getInfo()public String getInfo(){//return getname()+"\t"+getsex()+"\t"+getage()+"\t"+getnumber();return name+"\t"+sex+"\t"+age+"\t"+number;}
}

【EmployeeTest.java】

package yuyi.exer01.exe01;import java.util.Scanner;/*** ClassName: EmployeeTest* Package: yuyi.exer01.exe01* Description:** @Author 雨翼轻尘* @Create 2023/10/22 0022 18:03*/
public class EmployeeTest {public static void main(String[] args) {//Employee ie=new Employee();//创建Employee[] 假设只有两个员工Scanner scan=new Scanner(System.in);Employee[] ie=new Employee[2];for (int i = 0; i < ie.length; i++) {ie[i]=new Employee();System.out.println("--------添加第"+(i+1)+"个员工--------");System.out.print("姓名:");String name=scan.next();System.out.print("性别:");char sex=scan.next().charAt(0);System.out.print("年龄:");int age=scan.nextInt();System.out.print("电话:");String number=scan.next();//给指定的employee对象的各属性赋值ie[i].setname(name);ie[i].setsex(sex);ie[i].setage(age);ie[i].setnumber(number);}//遍历员工列表System.out.println("---------------员工列表----------------");System.out.println("编号\t姓名\t性别\t年龄\t电话");for (int i = 0; i < ie.length; i++) {System.out.println((i+1)+"\t"+ie[i].getInfo());}System.out.println("---------------员工列表完成----------------");}
}

运行输入:
image.png

⚡输出结果
image.png

(4)练习4

🌋题目描述

测试权限修饰,先忽略protected。

🤸测试

在包test1里面创建一个类Order

ackage yuyi.exer01.exe01.test1;public class Order {//声明不同权限的属性private int orderPrivate;int orderDefault;   //缺省权限public int orderPublic;//声明不同权限的方法private void methodPrivate(){}void methodDefault(){}public void methodPublic(){}}

①在当前类里面

在类的某一个方法内,上面的都可以调用。方法里面可以调属性,调方法。(如下面的test方法)

package yuyi.exer01.exe01.test1;public class Order {//声明不同权限的属性private int orderPrivate;int orderDefault;   //缺省权限public int orderPublic;//声明不同权限的方法private void methodPrivate(){}void methodDefault(){}public void methodPublic(){}public void test(){//调用属性orderPrivate=1;orderDefault=2;orderPublic=3;//调用方法methodPrivate();methodDefault();methodPublic();}}

权限再小,在当前类中也能用。

当前包里面,当前类外面

在当前test1包里面新建一个类OrderTest,调用Order类里面的结构。

public class OrderTest {public static void main(String[] args) {//Order类的权限是public,在各个包里面都能看得见//因为是同一个包下,所以不用importOrder order=new Order();}
}

即使现在的Order类是缺省修饰的,也可以被调用。因为缺省权限是本包内有效。如下:

class Order{//...
}

接下来测试调用属性和方法:

package yuyi.exer01.exe01.test1;/*** ClassName: OrderTest* Package: yuyi.exer01.exe01.test1* Description:** @Author 雨翼轻尘* @Create 2023/10/22 0022 19:45*/
public class OrderTest {public static void main(String[] args) {//Order类的权限是public,在各个包里面都能看得见Order order=new Order();//调用属性order.orderPublic=1;order.orderDefault=2;//order.orderPrivate=3; //不可以调用//调用方法order.methodDefault();order.methodPublic();//order.methodPrivate();    //不可以调用}
}
  • 调用属性

image.png

  • 调用方法

image.png

private修饰符只能在本类里面调用,出了类就不行了。

缺省可以在本包内调用,不会局限于类里面。(缺省就是default,但是现在不这么用了,因为容易和switch…case语句里面的default弄混)

不同包里面

在不同包下面创建文件,现在在test2包下创建OrderTest文件:
image.png

接下来想看一下test1包下的Order类里面的属性和方法在包test2内的OrderTest类中能不能调用。

若此时Order类被缺省修饰,就不能在包test2内的OrderTest类中创建对象了,因为缺省修饰的只能在当前包内使用。

class Order{//...
}

可以看到,如果现在创建Order对象是不可以的:
image.png

所以,Order类的权限要大一点:

public class Order{//...
}

此时不会报错了,但是导包是必须的,如下:
image.png


看一下测试代码:

package yuyi.exer01.exe01.test2;import yuyi.exer01.exe01.test1.Order;/*** ClassName: OrderTest* Package: yuyi.exer01.exe01.test2* Description:** @Author 雨翼轻尘* @Create 2023/10/23 0023 0:04*/
public class OrderTest {public static void main(String[] args) {Order order=new Order();//调用属性order.orderPublic=1;//order.orderPrivate=2;	//不可以//order.orderDefault=3;	//不可以//调用方法order.methodPublic();//order.methodPrivate();	//不可以//order.methodDefault();	//不可以}
}

只有Public修饰可以:
image.png

出了本包之后,不能调用Default和Private。

总结:
在这里插入图片描述
代码敲的比较快,如果文章哪里有误,欢迎指正。

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

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

相关文章

我做不到受每个人喜欢

我做不到受每个人喜欢 我想描述一下昨天发生争吵后我个人的观点&#xff0c;希望能够重新呈现出一种积极的态度。 首先&#xff0c;让我简要梳理一下事件的经过&#xff0c;当天我像往常一样去另一个宿舍找人聊天&#xff0c;可能因为说话声音有点大&#xff0c;坐在我后面的那…

运维:mysql常用的服务器状态命令

目录 1、查询当前服务器运行的进程 2、查询最大链接数 3、查询当前链接数 4、展示当前正在执行的sql语句 5、查询当前MySQL当中记录的慢查询条数 6、展示Mysql服务器从启动到现在持续运行的时间 7、查询数据库存储占用情况 8、查询服务器启动以来的执行查询的总次数 9…

vue3 使用 elementUi: ./lib/theme-chalk/index.css is not exported from package

目录 1. 在 vue3 中使用 element-ui2. 如果启动报错&#xff1a;Module not found: Error: Package path ./lib/theme-chalk/index.css is not exported from package 1. 在 vue3 中使用 element-ui 在 vue3 中使用 element-ui&#xff0c;我们的流程一般是这样的&#xff1a;…

Spark--经典SQL50题

目录 连接数据库准备工作 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数 2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数 3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩 4、查询平均成绩…

开源LLEMMA发布:超越未公开的顶尖模型,可直接应用于工具和定理证明

深度学习自然语言处理 原创作者&#xff1a;Winnie 今天向大家介绍一个新的开源大语言模型——LLEMMA&#xff0c;这是一个专为数学研究而设计的前沿语言模型。 LLEMMA解数学题的一个示例 LLEMMA的诞生源于在Proof-Pile-2数据集上对Code Llama模型的深度训练。这个数据集是一个…

TCP流套接字编程

文章目录 前言TCP 和 UDP 的特点对比TcpEchoServer 服务端实现1. 创建 ServerSocket 类实现通信双方建立连接2. 取出建立的连接实现双方通信3. 服务端业务逻辑实现关闭资源服务端整体代码 TcpEchoClient 客户端实现1. 创建出 Socket 对象来与服务端实现通信2. 实现客户端的主要…

OSI网络分层模型

OSI英文全文是Open System Interconnection Reference Model&#xff0c;翻译成中文就是开放式系统互联通信参考模型。 OSI模型分成了七层&#xff0c;部分层次与 TCP/IP 很像&#xff0c;从下到上分别是&#xff1a; 第一层&#xff1a;物理层&#xff0c;网络的物理形式&…

Mac安装nginx(Homebrew)

查看需要安装 nginx 的信息 brew info nginxDocroot 默认为 /usr/local/var/www 在 /opt/homebrew/etc/nginx/nginx.conf 配置文件中默认端口被配置为8080&#xff0c;从而使 nginx 运行时不需要加 sudo nginx将在 /opt/homebrew//etc/nginx/servers/ 目录中加载所有文件 …

10_集成学习方法:随机森林、Boosting

文章目录 1 集成学习&#xff08;Ensemble Learning)1.1 集成学习1.2 Why need Ensemble Learning?1.3 Bagging方法 2 随机森林(Random Forest)2.1 随机森林的优点2.2 随机森林算法案例2.3 随机森林的思考&#xff08;--->提升学习&#xff09; 3 随机森林&#xff08;RF&a…

解决pip安装包后但是Pycharm检测不到

首先要知道python找包的原理&#xff1a;原理 之后把一下代码打印一下&#xff1a; import sys print(sys.executable)# /usr/bin/python2 print(sys.path)# [/usr/lib/python2.7, /usr/lib/python2.7/dist-packages, /usr/local/lib/python2.7/dist-packages] print(sys.prefi…

CoDeSys系列-2、CoDeSys安装及Windows下创建项目测试

CoDeSys系列-2、CoDeSys安装及Windows下创建项目测试 文章目录 CoDeSys系列-2、CoDeSys安装及Windows下创建项目测试一、前言二、下载及安装三、Windows下软PLC项目创建及运行测试1、创建HMI工程1.1、新建标准工程&#xff1a;1.2、添加可视化对象&#xff1a;1.3、拖动添加拨码…

【C语言小游戏--猜数字】

文章目录 前言1.游戏描述2.代码实现2.1打印菜单2.2构建基础框架2.3玩游戏2.3.1生成随机数2.3.1.1rand()2.3.1.2srand()2.3.1.3time() 2.3.2game() 2.4自己设定猜的次数 3.完整代码 前言 猜数字小游戏是我们大多数人学习C语言时都会了解到的一个有趣的C语言小游戏&#xff0c;下…

Power BI 傻瓜入门 1. 数据分析术语:Power BI风格

本章内容包括&#xff1a; 了解Power BI可以处理的不同类型的数据了解您的商业智能工具选项熟悉Power BI术语 数据无处不在。从你醒来的那一刻到你睡觉的时候&#xff0c;某个系统会代表你收集数据。即使在你睡觉的时候&#xff0c;也会产生与你生活的某些方面相关的数据。如…

react封装一个简单的upload组件(待完善)

目录 react封装一个简单的upload组件component / uploadImg / uploadImg.jsx使用效果 react封装一个简单的upload组件 component / uploadImg / uploadImg.jsx import React, { useState } from react; import { LoadingOutlined, PlusOutlined } from ant-design/icons; imp…

基于SpringBoot的家具商城管理系统

基于SpringBoot的家具商城管理系统的设计与实现【文末源码】 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 家具详情 通知公告 登录界面 管理员界面 摘要 一段关于基于…

Vue3踩坑指南

vue.config.ts不起作用 关于项目 项目使用的还是vue-cli搭建的&#xff0c;底层还是webpack&#xff0c;没有使用新的vite搭建。 踩坑1&#xff1a;vue.config.ts不起作用 我本着既然是vue3 ts的项目&#xff0c;那么为了规范&#xff0c;项目中所有的js文件都得替换成ts文…

浅析人脸活体检测技术的功能及几种分类

在日常生活工作中&#xff0c;出现了人脸验证、人脸支付、人脸乘梯、人脸门禁等等常见的应用场景。这说明人脸识别技术已经在门禁安防、金融行业、教育医疗等领域被广泛地应用&#xff0c;人脸识别技术的高速发展与应用同时也出现不少质疑。其中之一就是人脸识别很容易被照片、…

03、Python 字符串高级用法

目录 Python 字符串高级用法转义字符字符串格式化序列相关的方法大小写相关的方法dir 可以查看某个类的所有方法删除空白查找、替换相关方法 Python 字符串高级用法 转义字符 字符串格式化 序列相关的方法 字符串本质就是由多个字符组成&#xff0c;字符串的本质就是不可变序…

为什么spring默认采用单例bean

概 述 熟悉 Spring开发的朋友都知道 Spring 提供了 5种 scope&#xff0c;分别是&#xff1a; singleton: 单例模式&#xff0c;当spring创建applicationContext容器的时候&#xff0c;spring会欲初始化所有的该作用域实例&#xff0c;加上lazy-init就可以避免预处理&#xf…

antd组件onChange回调,需要立即执行改变value与防抖节省接口开销。

文章目录 普通使用使用防抖节省开销页面功能复杂需要value受控回调需要部分代码立即执行&#xff0c;部分代码防抖延时执行useRefuseCallback 小结 普通使用 当我们使用Antd的input或者select进行搜索时&#xff0c;onChange回调会即时执行。 import { Input } from "an…