avatar

zian

A text-focused Halo theme

  • Java
  • 面试
  • 首页
  • C语音
  • liunx
  • 数据结构与算法
  • 控制台
Home Java 基础
文章

Java 基础

Posted 2025-01-31 Updated 2025-01- 31
By Administrator
16~21 min read

面向对象三大特性

封装

类:将不同数据类型组成一个具体的物体。

方法:隐藏实现细节,只管调用即可。

优点:

  • 减少耦合: 可以独立地开发、测试、优化、使用、理解和修改
  • 减轻维护的负担: 可以更容易被程序员理解,并且在调试的时候可以不影响其他模块
  • 有效地调节性能: 可以通过剖析确定哪些模块影响了系统的性能
  • 提高软件的可重用性
  • 降低了构建大型系统的风险: 即使整个系统不可用,但是这些独立的模块却有可能是可用的

继承|实现

通过继承来简化类。

多态

运行时多态有三个条件:

  • 继承
  • 覆盖(重写)
  • 向上转型

使用:

  1. 属性:编译看左边 , 运行看左边 (栈空间会同时存在父类属性和子类属性,但是由于变量实际的数据类型是父类,所以获取到时父类的属性。)
  2. 方法:编译看左边,运行看右边(子类方法进行重写,就虚方法表的覆盖 )

数据类型

基本数据类型的四类八种

数据类型 关键字 内存占用 取值范围
整数 byte 1 负的2的7次方 ~ 2的7次方-1(-128~127)
short 2 负的2的15次方 ~ 2的15次方-1(-32768~32767)
int 4 负的2的31次方 ~ 2的31次方-1
long 8 负的2的63次方 ~ 2的63次方-1
浮点数 float 4 1.401298e-45 ~ 3.402823e+38
double 8 4.9000000e-324 ~ 1.797693e+308
字符 char 2 0-65535
布尔 boolean 1 true,false

SPI机制

# 什么是SPI机制?

SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比如java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是 解耦。

SPI整体机制图如下:

java-advanced-spi-8.jpg

当服务的提供者提供了一种接口的实现之后,需要在classpath下的 META-INF/services/目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类。当其他的程序需要这个服务的时候,就可以通过查找这个jar包(一般都是以jar包做依赖)的 META-INF/services/中的配置文件,配置文件中有接口的具体实现类名,可以根据这个类名进行加载实例化,就可以使用该服务了。JDK中查找服务的实现的工具类是:java.util.ServiceLoader。

理解:就是通过配置和 ServiceLoader 来加载接口的实现类。

# SPI机制的应用?

  • SPI机制 - JDBC DriverManager

在JDBC4.0之前,我们开发有连接数据库的时候,通常会用Class.forName("com.mysql.jdbc.Driver")这句先加载数据库相关的驱动,然后再进行获取连接等的操作。而JDBC4.0之后不需要用Class.forName("com.mysql.jdbc.Driver")来加载驱动,直接获取连接就可以了,现在这种方式就是使用了Java的SPI扩展机制来实现。

  • JDBC接口定义

首先在java中定义了接口 java.sql.Driver,并没有具体的实现,具体的实现都是由不同厂商来提供的。

  • mysql实现

在mysql的jar包 mysql-connector-java-6.0.6.jar中,可以找到 META-INF/services目录,该目录下会有一个名字为 java.sql.Driver的文件,文件内容是 com.mysql.cj.jdbc.Driver,这里面的内容就是针对Java中定义的接口的实现。

  • postgresql实现

同样在postgresql的jar包 postgresql-42.0.0.jar中,也可以找到同样的配置文件,文件内容是 org.postgresql.Driver,这是postgresql对Java的 java.sql.Driver的实现。

  • 使用方法

上面说了,现在使用SPI扩展来加载具体的驱动,我们在Java中写连接数据库的代码的时候,不需要再使用 Class.forName("com.mysql.jdbc.Driver")来加载驱动了,而是直接使用如下代码:

String url = "jdbc:xxxx://xxxx:xxxx/xxxx";
Connection conn = DriverManager.getConnection(url,username,password);
.....

# SPI机制的简单示例?

我们现在需要使用一个内容搜索接口,搜索的实现可能是基于文件系统的搜索,也可能是基于数据库的搜索。

  • 先定义好接口
public interface Search {
    public List<String> searchDoc(String keyword);   
}
  • 文件搜索实现
public class FileSearch implements Search{
    @Override
    public List<String> searchDoc(String keyword) {
        System.out.println("文件搜索 "+keyword);
        return null;
    }
}
  • 数据库搜索实现
public class DatabaseSearch implements Search{
    @Override
    public List<String> searchDoc(String keyword) {
        System.out.println("数据搜索 "+keyword);
        return null;
    }
}
  • resources 接下来可以在resources下新建META-INF/services/目录,然后新建接口全限定名的文件:com.cainiao.ys.spi.learn.Search,里面加上我们需要用到的实现类
com.cainiao.ys.spi.learn.FileSearch
  • 测试方法
public class TestCase {
    public static void main(String[] args) {
        ServiceLoader<Search> s = ServiceLoader.load(Search.class);
        Iterator<Search> iterator = s.iterator();
        while (iterator.hasNext()) {
           Search search =  iterator.next();
           search.searchDoc("hello world");
        }
    }
}

可以看到输出结果:文件搜索 hello world

如果在 com.cainiao.ys.spi.learn.Search文件里写上两个实现类,那最后的输出结果就是两行了。

这就是因为 ServiceLoader.load(Search.class)在加载某接口时,会去 META-INF/services下找接口的全限定名文件,再根据里面的内容加载相应的实现类。

这就是spi的思想,接口的实现由provider实现,provider只用在提交的jar包里的 META-INF/services下根据平台定义的接口新建文件,并添加进相应的实现类内容就好。

Java
License:  CC BY 4.0
Share

Further Reading

Feb 9, 2025

其他

问: git 如何解决分支冲突 查看分支冲突文件 删除冲突代码 重新提交代码 liunx 常用命令 1. chmod 功能:修改文件或目录的权限。 常见用法示例: chmod +x script.sh:为 script.sh 文件添加可执行权限。 chmod 755 file.txt:使用数字模式设

Feb 9, 2025

Elasticsearch 面试

问:你了解 ElasticSearch 吗? 答:了解,ElasticSearch 一个强大的搜索引擎,在失物招领项目中我就使用 ES ,给 ES 安装中文分词器,就可以根据中文词语来检索索引库。Java

Feb 9, 2025

Spring 面试

问:解释 IOC 容器和DI依赖注入 答: IOC容器:控制反转,将创建对象权利交给IOC容器来完成 DI 依赖注入:获取 IOC 中获取创建好的对象,在Spring 常用的依赖注入有: 构造器注入 set 方法注入 @Autowired 注入 使用 IOC容器和DI依赖注入的好处: 降低代码耦合

OLDER

Github

NEWER

Java 集合

Recently Updated

  • 其他
  • Elasticsearch 面试
  • Spring 面试
  • RabbitMQ 面试
  • Redis 面试

Trending Tags

ruoyi docker java

Contents

©2025 zian. Some rights reserved.

Using the Halo theme Chirpy