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

【Java】抽象类和接口

抽象类和接口

  • 抽象类
    • 抽象类的概念
    • 抽象类语法
    • 抽象类的注意事项
    • 抽象类的作用
  • 接口
    • 接口的概念
    • 语法规则
    • 接口使用
    • 接口注意
    • 实现多个接口
    • 接口间的继承
    • 接口使用实例
      • 给对象数组排序
      • Clonable 接口和深拷贝
        • 浅拷贝
        • 深拷贝
  • 抽象类和接口的区别

抽象类

抽象类的概念

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 比如:
在这里插入图片描述
这里的车就可以看作一个抽象类,他没有足够的信息来描绘一个具体的对象

公交车 大卡车 摩托车 小轿车都是车 所以他们之间是继承关系

在这里插入图片描述
像这种没有实际工作的方法, 我们可以把它设计成一个 抽象方法(abstract method), 包含抽象方法的类我们称为 抽象类(abstract class)

抽象类语法

在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。

public abstract class Shape {public abstract void draw();//抽象方法不能写具体的实现public static void area(){System.out.println("面积");}//抽象类也是类 内部可以定义普通方法和属性甚至是构造方法
}

抽象类的注意事项

  1. 抽象类和抽象方法都是使用abstract修饰的
  2. 抽象类不能进行实例化 但是普通类可以
  3. 抽象类中不一定包含抽象方法,但包含抽象方法的类 一定是抽象类
  4. 抽象类中可以定义成员变量和成员方法、
  5. 当一个普通类继承了抽象类 此时再普通类中必须重写抽象类中的抽象方法
  6. 抽象类最大的意义就是被继承
  7. 当一个抽象类B继承一个抽象类A,此时又有一个普通类C继承抽象类B,此时在C中必须重写抽象类A和B中所有的抽象方法
  8. 满足重写的要求
  9. 抽象类中可以存在构造方法,在子类实例化的的时候,会帮助父类成员进行初始化

抽象类的作用

抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法.

但是有一个疑问 普通的类也可以被继承 普通的方法也可以被重写 为什么必须使用抽象类和抽想法呢???

确实如此. 但是使用抽象类相当于多了一重编译器的校验

使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成. 那么此时如果不小心误用成父类了, 使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题.

接口

接口的概念

在现实生活中,接口的例子比比皆是,比如:笔记本上的USB口,电源插座等。

电脑的USB口上,可以插:U盘、鼠标、键盘…所有符合USB协议的设备
电源插座插孔上,可以插:电脑、电视机、电饭煲…所有符合规范的设备
通过上述例子可以看出:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。
在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。

语法规则

接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口

public interface 接口名称{
// 抽象方法public abstract void method1(); // public abstract 是固定搭配,可以不写public void method2();abstract void method3();void method4();// 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁
}

接口使用

接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。

public class 类名称 implements 接口名称{// ...
}

注意:子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系

举个例子

public interface USB {void openDevice();void closeDevice();
}//接口public class Mouse implements USB {@Overridepublic void openDevice() {System.out.println("打开鼠标");}@Overridepublic void closeDevice() {System.out.println("关闭鼠标");}public void click(){System.out.println("鼠标点击");}
}//鼠标类public class keyBoard implements USB{@Overridepublic void openDevice() {System.out.println("打开键盘");}@Overridepublic void closeDevice() {System.out.println("关闭键盘");}public void inPut(){System.out.println("键盘输入");}
}//键盘类public class Computer {public void powerOn() {System.out.println("打开电脑");}public void powerOff() {System.out.println("关闭电脑");}public void usbDevice(USB usb) {usb.openDevice();if (usb instanceof Mouse) {Mouse mouse = (Mouse) usb;//向下转型mouse.click();}else if(usb instanceof keyBoard){keyBoard keyboard = (keyBoard) usb;keyboard.inPut();}usb.closeDevice();}
}//电脑类public class TestComputer {public static void main(String[] args) {Computer computer = new Computer();computer.powerOn();System.out.println("==========================");//使用鼠标设备computer.usbDevice(new Mouse());System.out.println("==========================");//使用键盘设备computer.usbDevice(new keyBoard());System.out.println("==========================");computer.powerOff();}
}//测试类

运行结果
在这里插入图片描述

接口注意

接口其实就是对一个标准的规范 可以看作是抽象类的进一步抽象

  1. 接口是interface定义的
  2. 接口中不可以有被实现的方法,但是有两种方法需要注意 一个是静态方法可以被实现 另一个是default关键字修饰的也可以被实现
  3. 接口中的方法默认是public abstract修饰的
  4. 接口中的成员变量默认是 public static final修饰的
  5. 接口也不可以通过new实例化
  6. 类和接口之间用关键字implements进行关联 看作是类实现了接口
  7. 当一个类实现一个接口后 这个类必须重写接口中的抽象方法
  8. 当借口中存在default方法 可以选择重写 也可以不重写
  9. 不管是接口还是抽象类 仍然可以发生向上转型
  10. 子类实现接口方法时 方法一定是被public修饰的
  11. 接口中不能有构造方法和代码块
  12. 一个类如果不想实现接口的方法可以定义为抽象类

实现多个接口

在Java中,类和类之间是单继承的,一个类只能有一个父类,即Java中不支持多继承,但是一个类可以实现多个接口。下面通过类来表示一组动物.

public abstract class Animals {protected String name;public Animals(String name) {this.name = name;}
}//父类
public interface IFlying {void fly();
}
public interface ISwimming {void swim();
}
public interface IRunning {void run();
}//接口们
public class Cat extends Animals implements IRunning{//猫是一个动物且会跑public Cat(String name) {super(name);}@Overridepublic void run() {System.out.println("猫正在用四条腿跑步");}
}
public class Fish extends Animals implements ISwimming{//鱼是一个动物且会游泳public Fish(String name) {super(name);}@Overridepublic void swim() {System.out.println("鱼正在游泳");}
}
public class Dog extends Animals implements ISwimming,IRunning{//狗是一个动物且会游泳和跑步@Overridepublic void swim() {System.out.println("狗正在狗刨式游泳");}@Overridepublic void run() {System.out.println("狗正在用四条腿跑");}public Dog(String name) {super(name);}
}

接口间的继承

在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到多继承的目的。

接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字

public interface IAmphibious extends IRunning,ISwimming {
//两栖类接口继承跑和游泳的接口
}//此时狗这个方法就可以不用实现游泳和跑的接口 直接实现两栖类的接口即可
public class Dog extends Animals implements IAmphibious{@Overridepublic void swim() {System.out.println("狗正在狗刨式游泳");}@Overridepublic void run() {System.out.println("狗正在用四条腿跑");}public Dog(String name) {super(name);}
}

接口使用实例

给对象数组排序

public class Student {//学生类private String name;private int score;public Student(String name, int score) {this.name = name;this.score = score;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", score=" + score +'}';}
}public class Test {public static void main(String[] args) {Student[] students = new Student[3];students[0] = new Student("zhansgan",85);students[1] = new Student("lisi",70);students[2] = new Student("wangwu",90);Arrays.sort(students);//这里能够给数组排序吗?}
}

我们可以想到这样排序是不现实的 因为我们并没有告诉编译器我们应该是按照名字排序还是按照成绩来排序 所以我们预测会抛出异常

运行结果
在这里插入图片描述
解决办法就是让Student类实现 Comparable接口 并实现其中的compareTo方法

public class Student implements Comparable{//实现Comparable接口private String name;private int score;public Student(String name, int score) {this.name = name;this.score = score;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", score=" + score +'}';}@Overridepublic int compareTo(Object o) {Student s = (Student)o;
//        if (this.score > s.score) {
//            return -1;
//        } else if (this.score < s.score) {
//            return 1;
//        } else {
//            return 0;
//        }
//可以使用注释掉的if else方法也可以使用下面的return返回的方法return s.score - this.score;}
}

运行结果
在这里插入图片描述
可以看到确实以成绩进行了排序

在 sort 方法中会自动调用 compareTo 方法. compareTo 的参数是 Object , 其实传入的就是 Student 类型的对象.然后比较当前对象和参数对象的大小关系(按分数来算).

为了进一步加深对接口的理解, 我们可以尝试自己实现一个 sort 方法来完成刚才的排序过程(使用冒泡排序)

public class Test {public static void sort(Student[] students) {for (int i = 0; i < students.length - 1; i++) {for (int j = 0; j < students.length - 1 - i; j++) {if (students[j].compareTo(students[j+1]) > 0){//这里是student[j]调用的compareTo方法所以this.就是student[j];//参数是student[j + 1] 所以Object o接收的就是student[j + 1]Student temp = students[j];students[j] = students[j + 1];students[j + 1] = temp;}}}}public static void main(String[] args) {Student[] students = new Student[3];students[0] = new Student("zhansgan", 85);students[1] = new Student("lisi", 70);students[2] = new Student("wangwu", 90);sort(students);//调用自己实现的冒泡排序System.out.println(Arrays.toString(students));}
}

Clonable 接口和深拷贝

Java 中内置了一些很有用的接口, Clonable 就是其中之一.

Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 “拷贝”. 但是要想合法调用 clone 方法, 必须要
先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常.

public class Student {//实现一个学生类private String name ;private int score;public Student(String name, int score) {this.name = name;this.score = score;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", score=" + score +'}';}
}public class test {public static void main(String[] args) {Student student1 = new Student("zhangsan",85);Student student2 = student1.clone();//这里会报错}
}

我们写出上述代码发现会报错
在这里插入图片描述
编译器提示clone方法是被protected修饰的
我们可以跳转到clone方法的实现
在这里插入图片描述
protected修饰的在不同包中的子类去访问通常要使用super
我们在这里可以重写这个方法
在这里插入图片描述
编译器默认生成了这段代码 他其实什么都没有干 只是调用了父类的clone方法
在这里插入图片描述
此时就是异常的问题了
在这里插入图片描述
我们只需要把异常写到main方法后面就可以解决
在这里插入图片描述
此时报错信息变为类型的问题 编译器提示我们这里需要一个Student类型但是我们提供了一个Object的类型 我们只需要强制类型转换
在这里插入图片描述
我们发现这里没有报错信息表示可以运行
在这里插入图片描述
当我们运行时发现又报错了 提示我们克隆不支持异常
在这里插入图片描述
我们只需要实现Cloneable接口 这个接口又是什么呢?
在这里插入图片描述
我们可以看到这个接口什么也没有 这叫做标记接口
当我们实现了这个接口后 发现没有报错了

public class Student implements Cloneable{private String name ;private int score;public Student(String name, int score) {this.name = name;this.score = score;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", score=" + score +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class test {public static void main(String[] args) throws CloneNotSupportedException {Student student1 = new Student("zhangsan", 85);Student student2 = (Student) student1.clone();System.out.println(student1.toString());System.out.println(student2.toString());}
}

在这里插入图片描述
运行结果
在这里插入图片描述

浅拷贝

我们在原有代码的基础上新增一个Money类 并在Student中实例化

我们想让student2在克隆student1时将Money类实例化的也克隆进去

我们首先想到刚才的操作 第一步实现Cloneable接口 第二步重写clone方法

class Money implements Cloneable{public int money;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class Student implements Cloneable {private String name;private int score;public Money m = new Money();public Student(String name, int score) {this.name = name;this.score = score;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", score=" + score +", m=" + m +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class testStudent {public static void main(String[] args) throws CloneNotSupportedException {Student student1 = new Student("zhangsan",85);Student student2 = (Student) student1.clone();System.out.println(student1.m.money);System.out.println(student2.m.money);student1.m.money = 55;System.out.println(student1.m.money);System.out.println(student2.m.money);}
}

运行结果
在这里插入图片描述
我们发现在修改student1时 student2也发生了改变 这明显是不符合逻辑的
**重新思考我们的代码 我们只是给Money做了克隆的前置任务 实际上并没有克隆 **
在这里插入图片描述
如图所示 我们只是复制了Student 中的所有 包括我们实例化Money的地址 意味着即使我们复制后student2也是保存的同一个m的地址 所以我们改变student1的m 通过student2调用m调用的是同一个m 就出现了运行时的结果 这也就是浅拷贝

深拷贝

通过对浅拷贝的认识 深拷贝的理解也就很简单

还是上面这个例子 我们不想要student1和student2都调用同一个m 该如何实现

我们只需要在上面那个代码重写clone方法做一点改动

改动前
在这里插入图片描述

改动后

在这里插入图片描述
在这里插入图片描述
这样就是深拷贝 将所有类全部复制一份

抽象类和接口的区别

在这里插入图片描述
主要认清抽象类和接口的意义

抽象类表示是什么 例如猫属于动物 大卡车属于车

接口表示什么会干什么 例如猫会跑 狗既会跑也会游泳

这也可以体现出为什么只能单继承 但是却可以实现多个接口 因为一个类一定不是只会干一种事情 抽象类的意义就是被继承

相关文章:

【Java】抽象类和接口

抽象类和接口抽象类抽象类的概念抽象类语法抽象类的注意事项抽象类的作用接口接口的概念语法规则接口使用接口注意实现多个接口接口间的继承接口使用实例给对象数组排序Clonable 接口和深拷贝浅拷贝深拷贝抽象类和接口的区别抽象类 抽象类的概念 在面向对象的概念中&#xff…...

Lora:Low-Rank Adapation of Large Language models

Lora&#xff1a;Low-Rank Adapation of Large Language modelsIntroductionMethodExperiment代码Introduction 这篇论文最初与21.06上传与arXiv&#xff0c;作者指出在当时&#xff0c;NLP的一个重要范式是先训练一个通用领域的模型然后在通过微调适应不同的领域与数据&#…...

洛谷-P8466 [Aya Round 1 A] 幻想乡扑克游戏

题目&#xff1a;P8466 [Aya Round 1 A] 幻想乡扑克游戏 题目描述&#xff1a; 题目描述 斗地主是一种使用 &#xfffd;A 到 &#xfffd;K 加上大小王的共 5454 张扑克牌来进行的游戏&#xff0c;其中大小王各一张&#xff0c;其它数码牌各四张。在斗地主中&#xff0c;牌的…...

HBase性能优化方法总结

1. 表的设计 1.1 Pre-Creating Regions 默认情况下&#xff0c;在创建HBase表的时候会自动创建一个region分区&#xff0c;当导入数据的时候&#xff0c;所有的HBase客户端都向这一个region写数据&#xff0c;直到这个region足够大了才进行切分。一种可以加快批量写入速度的方…...

Linux基础内容(16)—— 文件系统

Linux基础内容&#xff08;15&#xff09;—— 缓冲区https://blog.csdn.net/m0_63488627/article/details/129824563?spm1001.2014.3001.5501 目录 1.基础知识 2.磁盘的存储原理 1.物理结构 2.存储结构 3.逻辑结构 1.基础知识 之前介绍的全是进程打开的文件是如何执行…...

Vue自定义事件

自定义事件 ​ 通以上代码不难发现&#xff0c;数据项在Vue的实例中&#xff0c; 但删除操作要在组件中完成&#xff0c; 那么组件如何才能删除Vue实例中的数据呢?此时就涉及到参数传递与事件分发了&#xff0c; Vue为我们提供了自定义事件的功能很好的帮助我们解决了这个问题…...

Java SE 基础 (6) 第一个Java程序

开发环境已经搭建完毕&#xff0c;可以开发我们第一个Java程序了。 Java程序开发三步骤&#xff1a;编写、编译、运行。 编写Java源程序 public class HelloWord {public static void main(String[] args) {System.out.println("HelloWord!");} } 第一个 HelloWo…...

P1004 [NOIP2000 提高组] 方格取数

题目描述 设有 &#xfffd;&#xfffd;NN 的方格图 (&#xfffd;≤9)(N≤9)&#xff0c;我们将其中的某些方格中填入正整数&#xff0c;而其他的方格中则放入数字 00。如下图所示&#xff08;见样例&#xff09;: 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0…...

Leetcode.1024 视频拼接

题目链接 Leetcode.1024 视频拼接 Rating &#xff1a; 1746 题目描述 你将会获得一系列视频片段&#xff0c;这些片段来自于一项持续时长为 time秒的体育赛事。这些片段可能有所重叠&#xff0c;也可能长度不一。 使用数组 clips描述所有的视频片段&#xff0c;其中 clips[i…...

20个华为路由器常用的Python脚本,网工写自动化脚本时候可以参考!

你好&#xff0c;这里是网络技术联盟站。 昨天给大家介绍了10个华为交换机的Python脚本&#xff1a; 10个华为华为交换机常用的Python脚本&#xff0c;网络工程师收藏&#xff01; 大家反响不错&#xff0c;后期我会陆续出一下思科、H3C、锐捷等厂商的脚本&#xff0c;前期会…...

【kubernetes云原生】k8s资源管理命令与Namespace使用详解

目录 一、前言 二、k8s概述 三、k8s常用操作管理命令 3.1 kubectl 命令用法 3.2 常用控制台管理命令演示 3.2.1 获取全部节点信息 3.2.2 获取当前集群下全部pod 3.2.3 查看某个pod信息 3.2.4 获取当前集群下的所有namespace信息 3.2.5 查看当前集群下已创建的资源 3…...

String源码深度刨析

前言 我们将从源码角度深度分析特点&#xff0c;来提升对他们的了解以及设计。 String、StringBuilder、StringBuffer的常见面试题及四大区别可以参考&#xff1a;String、StringBuilder、StringBuffer的四大区别解析 String public final class Stringimplements java.io.Se…...

FreeRTOS - 消息队列

一.消息队列的概念及应用消息队列&#xff08;queue&#xff09;&#xff1a;可以在任务与任务间、中断和任务间传递消息&#xff0c;实现任务接收来自其他任务或中断的不固定的消息1.1任务需求1、使用消息队列检测串口输入2、通过串口发送字符串openled1&#xff0c;openled2&…...

怎样正确做 Web 应用的压力测试?

环境 首先环境是非常重要的&#xff0c;需要尽可能跟生产环境靠近。 比方说&#xff0c;使用同样的nginx版本&#xff0c;php的话需要启用fpm&#xff0c;zend-optimizer等等&#xff0c;参数配置也最好跟生产环境保持一致。 当然&#xff0c;php的版本更加需要保持一致&#x…...

php mysql大学生求职招聘资源信息网zkfdzkf67a8

1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户。 2&#xff0e;系统用户管理&#xff1a;不管是…...

2023上海市“星光计划”职业院校技能大赛 网络安全竞赛试题任务书

2023上海市“星光计划”职业院校技能大赛 网络安全竞赛试题任务书 A模块基础设施设置/安全加固&#xff08;200分&#xff09; 一、项目和任务描述&#xff1a; 假定你是某企业的网络安全工程师&#xff0c;对于企业的服务器系统&#xff0c;根据任务要求确保各服务正常运行&…...

Spring事务源码:创建代理类

参考文章&#xff1a; 《Spring事务源码解析之tx:annotation-driven标签解析》 《Spring 源码解析—事务执行》 参考资料&#xff1a; 《Spring AOP源码&#xff1a;开启注解读取》 《Spring AOP源码2&#xff1a;查找增强器》 《Spring AOP源码3&#xff1a;实现代理》 …...

java14 使用增强的模式匹配切换表达式

野旷天低树&#xff0c;江清月近人。——唐代杜甫《月夜忆舍弟》 使用增强的模式匹配切换表达式(Switch Expressions with Enhanced Pattern Matching) Java 14中引入的“Switch Expressions with Enhanced Pattern Matching”这个功能。 这个功能可以让我们在使用switch cas…...

python【正则表达式】

正则表达式 1.正则的作用 正则表达式式一种可以让复杂的字符串变得简单的工具。 写正则表达式的时候就是用正则符号来描述字符串规则。 2.正则语法 需要导入模块 from re import fullmatch, findall, search2.1.第一类&#xff1a;匹配类符号 1&#xff09;普通字符—在…...

Ubuntu常见系统问题解决方式

Ubuntu常见系统问题解决方式Ubuntu每次开机后提示检测到系统程序出现问题的解决方法Ubuntu循环登陆问题问题描述原因解决方法文件夹打开缓慢Ubuntu启动后GUI界面卡住不动Ubuntu18.04使用过程中常遇到的问题Ubuntu每次开机后提示检测到系统程序出现问题的解决方法 首先&#xf…...

C/C++中的虚拟内存

文章目录一、虚拟内存二、C中的虚拟内存分配模型三、C中的虚拟内存分配模型四、堆区和栈区的区别一、虚拟内存 虚拟内存是一种实现在计算机软硬件之间的内存管理技术&#xff0c;它将程序使用到的内存地址&#xff08;虚拟地址&#xff09;映射到计算机内存中的物理地址&#…...

Qt C++与Python混合编程:补充错误

在提示中&#xff0c;需要引用Python.h&#xff0c;出现错误。 1、找不到Python.h 如果是pro工程&#xff0c;需要在里面配置&#xff1b; INCLUDEPATH /Users/xinnianwang/opt/anaconda3/include LIBS /Users/xinnianwang/opt/anaconda3/lib 如果是CMakeLists.txt需要配…...

2023-04-01:当Go语言遇见FFmpeg视频解码器,使用Go语言改写decode_video.c文件,提升视频解码效率与开发体验。

2023-04-01&#xff1a;当Go语言遇见FFmpeg视频解码器&#xff0c;使用Go语言改写decode_video.c文件&#xff0c;提升视频解码效率与开发体验。 答案2023-04-01&#xff1a; 步骤如下&#xff1a; 1.导入必要的依赖库&#xff0c;包括 fmt、os、unsafe 和其它 FFmpeg 库相关…...

Solidity 学习笔记

主要参考网上资料学习&#xff0c;个人学习笔记有删改&#xff0c;参考出处在文末列出。 0 基础 IDE: remixType Bool: bool public _bool true; 默认false;整型&#xff1a;int、uint、uint256&#xff0c;默认0;地址类型&#xff1a;address&#xff0c;分为 payable 和普…...

ThreadLocal原理

关键点总结&#xff1a; ThreadLocal更像是对其他类型变量的一层包装&#xff0c;通过ThreadLocal的包装使得该变量可以在线程之间隔离和当前线程全局共享。在Thread中有一个threadLocals变量&#xff0c;类型为ThreadLocal.ThreadLocalMap&#xff0c;ThreadLocalMap中key是Th…...

串操作指令详解 MOVS,LODS,STOS,CMPS,SCAS,REP

指令包括&#xff1a;MOVS&#xff0c;LODS&#xff0c;STOS&#xff0c;CMPS&#xff0c;SCAS&#xff0c;REP 串的概念&#xff1a;串是连续存放再内存中的字节块或字块。每个串有一个起始地址和长度&#xff0c; 待操作的数据串称为源串&#xff0c;目的地址称为目标串 目录…...

Java实现判断素数

1 问题 判断101-200之间有多少个素数&#xff0c;并输出所有素数。 2 方法 package homework04; public class Test05 { public static void main(String[] args) { for (int i 101; i < 201; i) { boolean flag true; for (int j 2; j…...

PHP初级教程------------------(2)

目录 运算符 赋值运算符 算术运算符 比较运算符 逻辑运算符 连接运算符 错误抑制符 三目运算符 自操作运算符 ​编辑 计算机码 位运算符 运算符优先级 流程控制 控制分类 顺序结构 分支结构 If分支 ​ Switch分支 循环结构 For循环 while循环 do-while循环 循环控制 ​ …...

【SQL开发实战技巧】系列(三十五):数仓报表场景☞根据条件返回不同列的数据以及Left /Full Join注意事项

系列文章目录 【SQL开发实战技巧】系列&#xff08;一&#xff09;:关于SQL不得不说的那些事 【SQL开发实战技巧】系列&#xff08;二&#xff09;&#xff1a;简单单表查询 【SQL开发实战技巧】系列&#xff08;三&#xff09;&#xff1a;SQL排序的那些事 【SQL开发实战技巧…...

springBoot自动配置过程介绍

什么是自动配置 以前整合spring mybatis框架时候&#xff0c;需要加很多的bean, 比如说sqlSessionFactory等等 现在springboot帮我们干了&#xff0c;我们只需要引入对应的starter就可以了。 springBoot可以帮我们配置好了一些bean. 如mysql, mogondb相关操作等等&#xff…...