第二次面试总结 - 宏汉科技 - Java后端开发
🧸欢迎来到dream_ready的博客,📜相信您对专栏 “本人真实面经” 很感兴趣o (ˉ▽ˉ;)
专栏 —— 本人真实面经,更多真实面试经验,中大厂面试总结等您挖掘
目录
总结 (非详细)
面试内容(提问内容) - 带答案
1、字符串相关的函数
2、抽象类和接口的区别
3、Java有几种创建线程池的方式,分别是什么,有什么不同
4、什么是回调函数
5、什么是函数式接口,函数式接口与普通接口的区别
6、 什么是反射
7、Java中的集合
详细总结(注意事项)
总结 (非详细)
- 面试结果:非常不好
- 面试内容:Java基础八股
- 原因:Java基础相关八股文太差
面试内容(提问内容) - 带答案
- 字符串相关的函数
- 抽象类和接口的区别
- Java有几种创建线程池的方式,分别是什么,有什么不同
- 什么是回调函数
- 什么是函数式接口,函数式接口与普通接口的区别
- 什么是反射
- Java中的集合
1、字符串相关的函数
- 创建字符串
String str = "hello" // 直接赋值创建字符串
String str = new String("Hello") // 使用构造函数创建字符串对象
- 获取字符串长度
int length = str.length() // 获取字符串长度
- 获取指定位置的字符
char ch = str.charAt(index) // 获取指定位置的字符
- 查找子字符串的位置
int index = str.indexOf("hello world") // 查找子字符串的位置
- 判断是否包含子字符串
boolean contains = str.contains("substring") // 判断是否包含子字符串
- 替换字符串中的内容
String replaced = str.replace("old", "new") // 替换字符串中的内容
- 截取子字符串
Strin sub = str.substring(startIndex, endIndex) // 截取子字符串
- 字符串拼接
String concat = str.concat(" World") // 字符串拼接
- 使用指定分隔符连接多个字符串
String joined = String.join("-", "Hello", "World") // 使用指定分隔符连接多个字符串
- 根据指定分隔符拆分字符串为数组
String[] parts = str.split("delimiter") // 根据指定分隔符拆分字符串为数组
- 去除字符串首尾空白字符
String trimmed = str.trim() // 去除字符串首尾空白字符
- 字符串大小写转换
String upper = str.toUpperCase() // 转换为大写
String lower = str.toLowerCase() // 转换为小写
- 判断字符串是否为空
boolean isEmpty = str.isEmpty() // 判断字符串是否为空(更常用)
boolean isBlank = str.isBlank() // 判断字符串是否为空(Java11 新增)
- 将其他类型转换为字符串
基本上的万能方法: String.valueOf(需要转换的变量名)
以及 toString 方法,只不过什么.toString , .toString的前缀各有不同
int num = 10;
String str = String.valueOf(num); // 将整数类型(int、long)转换为字符串
// 或者
String str = Integer.toString(num); // 将整数类型(int、long)转换为字符串double num = 10.5;
String str = String.valueOf(num); // 将浮点数类型(float、double)转换为字符串
// 或者
String str = Double.toString(num); // 将浮点数类型(float、double)转换为字符串boolean flag = true;
String str = String.valueOf(flag); // 将Boolean类型转换为字符串char ch = 'A';
String str = String.valueOf(ch); // 将字符类型转换为字符串// 除基本数据类型外,其他类型可以使用对象的toString()方法
Object obj = new Object();
String str = obj.toString(); // 将其他类型转换为字符串
- 将字符串转换为其他类型
String str = "123";
int intValue = Integer.parseInt(str); // 字符串转换为整数String str = "1234567890";
long longValue = Long.parseLong(str); // 字符串转换为长整数字符串转换为浮点数
String str = "3.14";
float floatValue = Float.parseFloat(str); // 字符串转换为 float
double doubleValue = Double.parseDouble(str); // 字符串转换为 double
String str = "true";
boolean boolValue = Boolean.parseBoolean(str); // 字符串转换为布尔值
字符串转换为自定义对象
引入Jackson 或 FastJson依赖,使用这其中的内置函数,需要注意的是这个被转换的字符串本身就要是JSON格式的字符串,要和对象中的属性对应,具体操作此处不再展示,用时查询即可
2、抽象类和接口的区别
抽象类
特点:
- 可以包含抽象方法和非抽象方法
- 可以有成员变量
- 可以有构造方法
- 通过 “extends” 关键字被子类继承
- 不能被实例化,只能作为其他类的父类,子类必须实现(覆盖)其抽象方法
用法:
- 适合用于需要某些默认实现的情况
- 用于定义类的层次结构,提供一些通用行为
接口:
特点:
- 只能包含抽象方法(Java8+可以有默认方法和静态方法)
- 不能有成员变量(Java8+可以有静态常量)
- 不能有构造方法
- 通过 “implements” 关键字被类发现
- 可以多继承,一个类可以实现多个接口
用法:
- 用于定义一组相关的方法,而不包含实现
- 用于实现多继承,使类具有多种类型特征
- 用于实现不同类之间的通用协议
- 可以多继承,一个类可以实现多个接口
如何选择使用抽象类还是接口
如果你需要提供一些默认实现,或者需要在未来扩展更多的方法,可以使用抽象类
如果你需要定义一组方法的契约,而不关心具体实现,并且需要支持多继承特性,可以使用接口
有时候也可以将抽象类和接口结合使用,使用接口定义契约,使用抽象类提供默认实现
3、Java有几种创建线程池的方式,分别是什么,有什么不同
有好多种,甚至我感觉应该没有明确的数字来确定Java有几种创建线程池的方式,因为有些是JavaJDK提供的,有些是某些框架提供的
下面说一下我了解的常见的五种方式
3.1、“Executors” 工厂类(常用) - 精简
“newFixedThreadPool(int nThreads)” :创建一个固定大小的线程池,线程数量固定不变
代码举例:(private是权限修饰符,可更改)
private ExecutorService executorService = Executors.newFixedThreadPool(8);
“newCachedThreadPool()”:创建一个根据需要自动扩展的线程池,线程数量可以根据任务的多少来进行动态调整
“newSingleThreadExecutor()”:创建一个单线程的线程池,保证任务按顺序执行,这些方法返回“ExecutorService”接口的实例,可以用于提交任务、关闭线程池等操作
3.2、“ThreadPoolExecutor类”(常用) - 细节
“ThreadPoolExecutor” 类提供了更灵活的线程池创建方式,可以自定义线程池的配置
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, // 核心线程数maximumPoolSize, // 最大线程数keepAliveTime, // 线程空闲时间TimeUnit.MILLISECONDS, // 时间单位new LinkedBlockingQueue<Runnable>() // 任务队列 );
通过 “ThreadPoolExecutor” 类,可以灵活地配置核心线程数、最大线程数、线程空闲时间、任务队列等
3.3、Spring框架提供的线程池(光Spring创建线程的方式就有好几种,虽然都与TaskExecutor接口有关系)
Spring 框架提供了 TaskExecutor 接口来管理线程池,以及一些实现了这个接口的具体线程池实现,例如使用 “ThreadPoolTaskExecutor”进行线程池的管理和配置
示例代码如下:
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;// 创建 ThreadPoolTaskExecutor 对象 ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();// 设置线程池属性 taskExecutor.setCorePoolSize(5); taskExecutor.setMaxPoolSize(10); taskExecutor.setQueueCapacity(25);// 设置其他属性...// 初始化线程池 taskExecutor.initialize();// 提交任务给线程池执行 taskExecutor.execute(() -> {// 执行的任务逻辑 });
3.4、“ScheduledExecutorService” 接口
用于执行延迟任务或定期任务
“newScheduledThreadPool(int corePoolSize)”:创建一个可调度的线程池,可以执行定时或延迟任务
3.5、ForkJoinPool
用于执行 Fork-Join 任务,通过拆分任务并行执行来提高性能
不同的线程池创建方式适用于不同的场景和需求,可以根据具体的应用情况选择合适的方式创建线程池
4、什么是回调函数
回调函数是一种常见的编程概念,它在事件驱动编程、异步编程等场景下非常常见,指的是在特定条件满足或事件发生时执行的函数。在编程中,回调函数通常作为参数传递给其他函数,以便在需要时被调用执行
举个最简单的示例,在图形化界面编程和前端中,就经常用到回调函数,比如当用户点击按钮时,可以将处理点击事件的函数作为回调函数传递给按钮的事件监听器。当按钮被点击时,事件监听器会调用这个回调函数
又比如我之前写过一个mq的项目,里面我专门定义了一个函数式接口来存放回调函数,因为函数式接口与普通接口不同,其中只可以有一个抽象方法,虽然定义接口时不可以直接写方法体,但可以有参数,而且后续使用时可以用Lambda表达式等方式实现函数式接口。我当时直接把这个接口当作参数,new出来后直接大括号,在里面把回调函数实现了,然后把这整个当作参数传递了,还挺方便的
5、什么是函数式接口,函数式接口与普通接口的区别
函数式接口是Java中的一个特殊类型的接口,它仅包含一个抽象方法(除了默认方法、静态方法或来自 “Object” 类的 “public” 方法)。函数式接口可以被Lambda表达式实现(口语化,不需要记:当然,也可以后续new接口的时候,在小括号内加个大括号,大括号内放重写的方法)
函数式接口特点:
- 单一抽象方法:函数式接口只包含一个抽象方法。他的特点是只能有一个抽象方法,但可以包含多个默认方法,静态方法或来自 “Object” 类的 “public” 方法
- @FunctionalInterface注解:函数式接口通常都会使用 “FunctionalInterface” 注解标识。这个注解可以让编译器帮助检查这个接口是否符合函数式接口的定义
- Lamabda表达式支持:函数式接口可以被Lambda表达式所实现。Lambda表达式提供了一种简洁的方式来创建函数式接口的实例
注:也可以通过其他方式实现
普通接口特点:
- 多个抽象方法:普通接口可以包含多个抽象方法
- 没有 @FunctionalInterface 注解:普通接口没有 @FunctionalInterface 注解的限制,它可以包含多个抽象方法,并且不要求只有一个抽象方法
函数式接口和普通接口在设计和使用上有明显的差异,函数式接口更注重于函数式编程,鼓励使用 Lambda 表达式和函数式思维。而普通接口则更通用,可以包含多个方法,用于更广泛的场景。其实相对于两者的格式,往往是两者的使用场景不同而造成我们关注的真正意义上的 “不同”
6、 什么是反射
反射是Java语言的特征之一,它允许运行中的Java程序对自身进行检查,或者说 “自审”,并能直接操作程序的内部属性和方法(当然,反射并不是Java独有的,许多编程语言都提供了反射功能)
通俗地讲,一提到反射,我们就可以想到镜子。镜子可以明明白白地照出我是谁,还可以照出别人是谁。反映到程序中,反射就是用来让开发者知道这个类中有什么成员,以及别的类中有什么成员
其实反射的经典用处之一在于通过反射实现某些本不可能实现的功能,我们知道private修饰的属性是只能在类和对象内部访问的,但是有些时候我们需要获得这个“私有的”方法或属性,但是又不想破坏这个属性的修饰权限和范围,那我们就可以使用反射动态地获取到这个类的信息,并能够进行访问甚至修改
其实,我们常见的Spring托管对象的操作和JUnit框架的某些操作等本质也是利用了反射
可以说,反射无处不在,只是我们真正敲出明面上就是反射的代码少
注:反射是面试经常考的,而且相关的知识有特别多,真正想细致地去了解反射以及反射的用法等需要专门去搜寻
7、Java中的集合
Java集合分三种,分别是 List、Set、Map,这三种集合适用于不同的场景
- List:适用于有序,可重复的集合
- Set:适用于不可重复集合
- Map:适用于键值对的存储
注:通常List与Map最为常用
- List 常见的实现类:ArrayList(列表) 、 LinkedList(链表)
- Set 常见的实现类:HashSet、LinkedHashSet和TreeSet
- Map 常见的实现类:HashMap 、 TreeMap 与 HashTable
上面的实现类大多都是线程不安全的,因此,Java也提供了对应的线程安全版本:
- 比如 List 中的 Victor、CopyOnWriteArrayList等
- Set本身就用的少,所以线程安全的Set实体类用的更少,我确实没太记得住,个人感觉记这个不如到时候查询性价比高(面试可以这样说,一般不会让面试官感觉你不会)
- 比如Map中的HashTable,当然这个太古老了,用的很少,但是另一个 ConcurrentHashMap 用的非常多,ConcurrentHashMap 也是线程安全的,当然,也有其他实现方式,看具体使用情况选择合适的实现类就好
详细总结(注意事项)
关于第一个问题 “字符串相关的函数” ,当时回答了几个经典的,比如 valueOf 等,下意识地忽略了简单的length、 contains等,平常使用的时候下意识就写出来了,有的写代码过程中没有想起来也直接查询后就使用了,所以答得并不好
关于第二个问题 “抽象类和接口的区别”,这个答得还可以,但是面试的时候,确实有些平常都知道的东西没想起来(这个问题其实真的属于纯八股了)
关于第三个问题 “Java有几种创建线程池的方式,分别是什么,有什么不同”,这个答得就非常不好了,真的平常光知道用了
关于第四个问题和第五个问题 “什么是回调函数”, “什么是函数式接口,函数式接口与普通接口的区别” 确实当场没想起来
关于第六个问题 “什么是反射”,我当时回答了反射怎么用,什么时候用,为什么要用,也都回答的可以,但面试官说这不是他想听到的,他想听到的只是反射的定义,好吧~ 这个怪我自己,平时确实没注意这些八股,只知道用了
关于第七个问题 “Java中的集合”,只能说回答的勉强凑合,忘记List、Set、Map都是集合了
面试官如果问Spring的八股,我还能答得不错;如果问我项目,我能答得非常优秀,但他直接就不问我项目,开场我自我介绍,就主要说了我项目能力比较好,然后他来了句 “好,那我既然看你一直在讲你的项目,那今天咱不提问项目,提问点Java基础”,然后 我就挂了~
个人情绪等无关重要的在此就不总结了,最后提一句话,即便简历不怎么样,也能搞几次大厂面试的机会,所以面试更重要的说白了就是八股,其次算法和项目,项目反而是最不重要的
加油背八股!
🧸正是时间好,过年发的此篇文章,在此祝大家新的一年 万事顺遂
相关文章:

第二次面试总结 - 宏汉科技 - Java后端开发
🧸欢迎来到dream_ready的博客,📜相信您对专栏 “本人真实面经” 很感兴趣o (ˉ▽ˉ;) 专栏 —— 本人真实面经,更多真实面试经验,中大厂面试总结等您挖掘 目录 总结 (非详细) 面试内容(提问内容) - 带答案…...

GPT-4:人工智能的新纪元与未来的无限可能
在人工智能的发展史上,GPT-4的问世标志着一个新的里程碑。作为最新一代的自然语言处理模型,GPT-4不仅在技术上取得了突破,更在应用层面展现了前所未有的潜力。本文将探讨GPT-4的核心技术、应用场景以及它对未来社会的潜在影响。 GPT-4的技术…...

2.右值引用和移动语义
文章目录 右值引用和移动语义&&的特性右值引用优化性能,避免深拷贝移动(move )语义forward 完美转发emplace_back 减少内存拷贝和移动unordered container 无序容器map和unordered_map的差别内部实现机理不同优缺点以及适用处 小结优缺点以及适用处 小结 代…...

深入浅出线程原理
Linux 中的线程本质 线程接口由 Native POSIX Thread Library 提供,即:NPTL 库函数 线程被称为轻量级进程 (Light Weight Process) 每一个线程在内核中都对应一个调度实体,拥有独立的结构体 (task_struct) 内核设计:一个进程对…...

openssl3.2 - 官方demo学习 - saccept.c
文章目录 openssl3.2 - 官方demo学习 - saccept.cEND openssl3.2 - 官方demo学习 - saccept.c 建立TLSServer(使用了证书, 和证书中的私钥), 接收客户端的连接, 并将客户端发来的信息打印到屏幕 笔记 /*! \file saccept.c */ /*! \brief 建立TLSServer(使用了证书, 和证书中…...

JavaScript基础(26)_dom增删改练习
<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><title>DOM增删改练习</title><link rel"stylesheet" href"../browser_default_style/reset.css"><style>table {borde…...

mac上部署单体hbase
1. 简介 HBase 是一个开源的、分布式的、版本化的典型非关系型数据库。它是 Google BigTable 的开源实现,并且是 Apache 基金会的 Hadoop 项目的一部分1。HBase 在 Hadoop Distributed File System (HDFS) 上运行,作为一个列式存储非关系数据库管理系统…...

【RV1126 学习】SDK/ U-Boot/kernel/rootfs 编译学习
文章目录 RV1126芯片介绍rv1126 模块代码目录相关说明 SDK 包下的脚本使用build.sh 脚本使用envsetup.sh 脚本使用mkfirmware.sh 脚本使用rkflash.sh 脚本使用 U-Boot 编译和配置uboot 的配置修改编译操作 kernel 的修改编译rootfs 编译和配置buildroot 配置busybox 配置 RV112…...

Golang 使用 AST 获取方法和参数名以及应用举例
背景 在做一些自动生成的代码工作时,有时需要知道方法以及对应的参数名 如果仅是方法,利用反射机制就可以解决 而参数名,程序编译后,已经丢失 可以通过 AST 事先获取方法的参数名 有了方法、参数名,加上反射&…...

DC-DC变换集成电路芯片B34063——工作电压范围宽,静态电流小
B34063为一单片DC-DC变换集成电路,内含温度补偿的参考电压源(1.25V)、比较器、能有效限制电流及控制工作周期的振荡器,驱动器及大电流输出开关管等,外配少量元件,就能组成升压、降压及电压反转型DC-DC变换器。 主要特点: ● 工作…...

强力推荐:本地文件加密软件—超详细加密步骤来了!
在数字化时代,数据安全问题日益受到人们的关注。 为了保护个人和企业的重要信息不被泄露,越来越多的人开始使用文件加密软件。 尤其是常常会有数据泄露风险的企业更是需要一款非常给力的加密工具来保护企业数据安全。 一、选择合适的加密软件 在选择加…...

在qml中,ListModel可以与WorkerScript一起使用,从多个线程访问列表模型
在QML中,您可以使用ListModel和WorkerScript一起实现多线程访问列表模型。以下是一个简单的例子,演示了如何在QML中使用这两个元素: import QtQuick 2.15 import QtQuick.Controls 2.15ApplicationWindow {visible: truewidth: 400height: 3…...

rocketmq实现延迟消息
SpringBoot整合RocketMQ发送延时消息 springboot rocketmq 延迟消息 Windows下RocketMQ安装及可视化界面搭建 Java 客户端 RocketMQ延迟消息 项目背景 项目中有延时消息的需求,综合考量RocketMQ比较适合。 RocketMQ支持多维度的延迟级别 支持多种消息类型 基…...

vue倒计时60秒改变按钮状态效果demo(整理)
你可以使用Vue的计时器和绑定状态的方法来实现这个功能。 首先,在data中添加一个计时器countdown,初始值为0。 data() {return {countdown: 0} }<template><div><button click"startCountdown" :disabled"countdown > …...

多区域isis配置实验
一、预习: IS-IS:Intermediate System to Intermediate System,中间系统到中间系统,是ISO为它的CLNP(ConnectionLess Network Protocol)设计的一种动态路由协议,后来为了提供对IP路由的支持&…...

Ubuntu 22.04.3 LTS arm64 aarch64 ISO jammy-desktop-arm64.iso 下载
Ubuntu 22.04.3 LTS (Jammy Jellyfish) Daily Build 参考 Are there official Ubuntu ARM / aarch64 desktop images? - Ask Ubuntu...

软件测试面试必备知识
随着软件测试领域对于技术要求越来越清晰,到现在测试人员在市场上的岗位需求也变得越来越复杂。极大部分的企业都开始对自动化测试岗位有了更多的需要。自然而然,面试就相对于非常重要了。 网络上有着各式各样的测试框架的存在,我也不知道我…...

4.4 媒资管理模块 - 分布式任务处理介绍、视频处理技术方案
媒资管理模块 - 视频处理 文章目录 媒资管理模块 - 视频处理一、视频转码1.1 视频转码介绍1.2 FFmpeg 基本使用1.2.1 下载安装配置1.2.2 转码测试 1.3 工具类1.3.1 VideoUtil1.3.2 Mp4VideoUtil1.3.3 测试工具类 二、分布式任务处理2.1 分布式任务调度2.2 XXL-JOB 配置执行器 中…...

K8S集群重新初始化--详细过程
K8S集群重新初始化 0、当前环境1、master节点1.1、在master节点执行下面reset命令:1.2、手动清除配置信息,这一步很关键:1.3、重新引导集群1.4、创建配置目录,并复制权限配置文件到用户目录下:1.5 查看集群状态1.6 安装…...

服务器 Linux常见指令
删除文件 删除文件 单个删除:rm -f 文件名 rm -f 2018_12_26.stderrout.log.060121612 --执行完成即将这个文件删除删除文件夹 rm -rf 路径/目录名tar命令 压缩 tar -cvf [文件名].tar [文件目录] //打包成.tar文件 tar -jcvf [文件名].tar.bz2 [文件目录]…...

C++合并K个有序链表
本篇博客介绍如何使用C合并k个有序链表,在代码中会用到std::priority_queue,首先需要介绍一下std::priority_queue的用法,介绍完std::priority_queue后将介绍如何使用std::priority_queue来辅助合并k个有序链表。 一、C priority_queue用法介…...

win10在启动游戏时报错,提示“d3dx9_25.dll文件丢失”,怎么办?d3dx9_25.dll丢失如何自动修复
一、d3dx9_25.dll文件是什么? d3dx9_25.dll是DirectX的一部分,DirectX是一种由微软开发的专门处理与多媒体、游戏程序和视频相关的应用程序接口。d3dx9_25.dll文件是DirectX9中一个重要的dll文件,主要负责处理3D图形程序,作用是帮…...

16. 蒙特卡洛强化学习基本概念与算法框架
文章目录 1. 是什么2. 有何优点3. 基本概念3.1 立即回报3.2 累积回报3.3 状态值函数3.4 行为值函数3.4 回合(或完整轨迹,episode)3.5 多个回合(或完整轨迹)的描述 4.MC强化学习问题的正式描述5. 蒙特卡洛(M…...

QT中程序执行时间精准计算的三种方法及对比
一.QT程序在提升程序性能的调试中经常要计算一段程序的执行时间,下面介绍两种简单的实现方式,精确度都可以达到ms。 1.方式一 (1)代码: #include <QDateTime> qDebug() << "Current_date_and_tim…...

js下载方法分享*
JavaScript可以使用浏览器的API实现文件的下载,以下是一种常用的方法: 假设你已经有了一个文件 URL,你可以创建一个新的 a 标签,并将 href 属性设置为文件的 URL,然后模拟点击这个标签以开始下载。 function downloa…...

C# Stopwatch类_性能_时间计时器
文章只含部分属性方法等,有想了解全面的在下面链接中可以查看:.NET API browser Stopwatch 类 (System.Diagnostics) | Microsoft Learn 一、什么是Stopwatch Stopwatch:提供一组方法和属性,可以准确的测量运行时间。使用的时候需…...

鸿蒙原生应用再添新丁!天眼查 入局鸿蒙
鸿蒙原生应用再添新丁!天眼查 入局鸿蒙 来自 HarmonyOS 微博1月12日消息,#天眼查启动鸿蒙原生应用开发#作为累计用户数超6亿的头部商业信息查询平台,天眼查可以为商家企业,职场人士以及普通消费者等用户便捷和安全地提供查询海量…...

HarmonyOS4.0——ArkUI应用说明
一、ArkUI框架简介 ArkUI开发框架是方舟开发框架的简称,它是一套构建 HarmonyOS / OpenHarmony 应用界面的声明式UI开发框架,它使用极简的UI信息语法、丰富的UI组件以及实时界面语言工具,帮助开发者提升应用界面开发效率 30%,开发…...

基于模块自定义扩展字段的后端逻辑实现(二)
目录 一:创建表 二:代码逻辑 上一节我们详细讲解了自定义扩展字段的逻辑实现和表的设计,这一节我们以一个具体例子演示下,如何实现一个订单模块的自定义扩展数据。 一:创建表 订单主表: CREATE TABLE t_order ( …...

图像中部分RGB矩阵可视化
图像中部分RGB可视化 今天室友有个需求就是模仿下面这张图画个示意图: 大致就是把图像中的一小部分区域的RGB值可视化了一下。他居然不知道该怎么画,我寻思这不直接秒了。 import cv2 as cv import numpy as np import matplotlib.pyplot as pltclass …...