20250119面试鸭特训营第27天

更多特训营笔记详见个人主页【面试鸭特训营】专栏

250119

1. 接口和抽象类有什么区别?

接口

  • 接口的设计是自上而下的。
    • 所谓的自上而下指的是:先约定接口,再实现。
    • 我们知晓某一行为,于是基于这些行为约束定义了接口,一些类需要有这些行为,因此实现对应的接口。
  • 接口中的方法默认是 public 和 abstract (但在 Java8 之后可以设置 default 方法或静态方法)。
  • 接口不能包含构造函数,接口中的成员变量默认为 public static final,即常量。
  • 接口可以有多个实现 ,如果多个接口内有相同的默认方法,子类必须重写这个方法,否则编译时会报错。

抽象类

  • 抽象类的设计是自下而上的。
    • 所谓的自下而上指的是:先有一些类,才抽象了共同父类。
    • 我们写了很多类,发现它们之间有共性,有很多代码可以复用,因此将一些公共逻辑封装成一个抽象类,减少代码冗余。
  • 抽象类可以包含 abstract 方法(没有实现)和具体方法(有实现)。它允许子类继承并重用抽象类中的方法实现。
  • 抽象类可以包含构造函数,成员变量可以有不同的访问修饰符(如 private、protected、public),并且可以不是常量。
  • 为避免菱形继承关系产生歧义,抽象类只能是单继承。

表格对比

接口抽象类
设计方案自上而下先定义接口,再实现自下而上先有一些类,抽取共同部分
包含的方法public 和 abstract不能有具体实现可以包含 abstract 方法和具体方法具体方法可以有实现且允许子类重用
构造函数不能包含可以包含,在子类实例化时调用
包含的成员变量public static final必须是常量,必须初始化private、protected、public可以不是常量,可以是变量
多继承支持不支持

2. JDK 动态代理和 CGLIB 动态代理有什么区别?

JDK 动态代理

  • 基于接口,要求代理对象必须实现至少一个接口。
  • 通过反射机制生成实现了指定接口的代理类对象。
  • 只能对实现了接口的类进行代理。

CGLIB 动态代理

  • 基于 ASM 字节码生成工具,通过继承的方式生成目标类的子类来实现代理类,代理对象是原始类的子类,要注意 final 方法。
  • 可以代理没有实现接口的类。

性能对比

  • jdk6 下,在运行次数较少的情况下,jdk动态代理与cglib动态代理差距不明显,当调用次数增加之后,cglib动态代理稍微快一些。
  • jdk7 下,在运行次数较少(1,000,000)的情况下,jdk动态代理比cglib动态代理快了差不多30%,当调用次数增加之后(50,000,000),jdk动态代理比cglib动态代理快了接近 1 倍。
  • jdk8 下,表现和 jdk7 基本一致。

表格对比

特性JDK动态代理CGLIB动态代理
代理方式基于接口,使用反射生成代理对象基于继承,使用字节码技术生成代理对象
是否需要接口必须要求目标类实现至少一个接口不需要接口,可以代理没有接口的类
代理Final类/Final方法支持不支持
适用场景适用于目标类实现了接口的情况,接口驱动的设计适用于目标类没有实现接口的情况,可以代理普通类

3. 你使用过 Java 的反射机制吗?如何应用反射?

定义

  • Java 反射机制是指在运行时动态地获取类的结构信息(如方法、字段、构造函数)、创建对象以及调用对象的属性和方法的机制。
  • Java 反射机制提供了运行时检查 Java 类型信息的能力,让Java 程序可以通过程序获取其本身的信息。
  • Java 的反射机制提供了在运行时动态创建对象、调用方法、访问字段等功能,而无需在编译时知道这些类的具体信息。

优点

  • 可以动态地获取类的信息,不需要在编译时就知道类的信息。
  • 可以动态地创建对象,不需要在编译时就知道对象的类型。
  • 可以动态地调用对象的属性和方法,可以在运行时动态地改变对象的行为。

缺点

  • 由于反射是动态的,所以它的运行效率较低,不如直接调用方法或属性。
  • 由于反射是动态的,所以它会破坏 Java 的封装性,可能会使代码变得复杂和不稳定。

应用场景

  • 动态代理。动态代理可以使用反射机制在运行时动态地创建代理对象,而不需要在编译时就知道接口的实现类
  • 单元测试。JUnit 等单元测试框架可以使用反射机制在运行时动态地获取类和方法的信息,实现自动化测试
  • 配置文件加载。许多框架(如 Spring)使用反射机制来读取和解析配置文件,从而实现依赖注入和面向切面编程等功能

获取类对象的3种方案及代码实现

  • 获取普通的Class对象:
    • 实例.getClass(): 此方式要求必须先有类的实例。
    • 类名.class: 便捷但属于硬编码,对于JDK中内置的类,推荐使用此方式。
    • Class.forName("类全名"): 软编码,需要处理异常,对于自定义类,推荐使用此方式。
  • 获取数组的Class对象:
    • 判断数组的Class对象是否相同的时候,只比较它们的类型和维度。
public class qq {static class A {private int a1;private double a2;private String s3;}public static void main(String[] args) throws ClassNotFoundException {A my = new A();Class<?> aClass = my.getClass();System.out.println("aClass -> " + aClass); // 打印class qq$ASystem.out.println("aClass.getName() -> " + aClass.getName()); // 打印 qq$ASystem.out.println("aClass.hashCode() -> " + aClass.hashCode()); // 打印557041912System.out.println("my.getClass() -> " + my.getClass());// 打印class qq$ASystem.out.println("my.getClass() -> " + my.getClass().getName());// 打印 qq$ASystem.out.println("my.getClass().hashCode() -> " + my.getClass().hashCode());// 打印557041912System.out.println("A.class -> " + A.class);// 打印class qq$ASystem.out.println("A.class -> " + A.class.getName());// 打印 qq$ASystem.out.println("A.class.hashCode() -> " + A.class.hashCode());// 打印557041912}
}

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

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

相关文章

OpenWrt 中使用 LuCI 界面部署 Docker 镜像

本篇博客将介绍如何在 OpenWrt 上使用 LuCI 部署 Docker 镜像&#xff0c;以 "hello-world" 镜像为例。 前提条件 已安装支持 Docker 的 OpenWrt 系统。 Docker 服务已在 OpenWrt 上成功安装并运行。 LuCI Docker 插件&#xff08;luci-app-docker 或类似的管理界…

MySQL 主从复制原理及其工作过程的配置

一、MySQL主从复制原理 MySQL 主从同步是一种数据库复制技术&#xff0c;它通过将主服务器上的数据更改复制到一个或多个从服务器&#xff0c;实现数据的自动同步。 主从同步的核心原理是将主服务器上的二进制日志复制到从服务器&#xff0c;并在从服务器上执行这些日志中的操作…

网络编程-UDP套接字

文章目录 UDP/TCP协议简介两种协议的联系与区别Socket是什么 UDP的SocketAPIDatagramSocketDatagramPacket 使用UDP模拟通信服务器端客户端测试 完整测试代码 UDP/TCP协议简介 两种协议的联系与区别 TCP和UDP其实是传输层的两个协议的内容, 差别非常大, 对于我们的Java来说, …

nginx 配置代理,根据 不同的请求头进行转发至不同的代理

解决场景&#xff1a;下载发票的版式文件&#xff0c;第三方返回的是url链接地址&#xff0c;但是服务是部署在内网环境&#xff0c;无法访问互联网进行下载。此时需要进行走反向代理出去&#xff0c;如果按照已有套路&#xff0c;就是根据不同的访问前缀&#xff0c;跳转不同的…

Unity补充 -- 协程相关

1.协程。 协程并不是线程。线程是主线程之外的另一条 代码按照逻辑执行通道。协程则是在代码在按照逻辑执行的同时&#xff0c;是否需要执行额外的语句块。 2.协程的作用。 在update执行的时候&#xff0c;是按照帧来进行刷新的&#xff0c;也是按照帧执行代码的。但是又不想…

计算机毕业设计Python+卷积神经网络租房推荐系统 租房大屏可视化 租房爬虫 hadoop spark 58同城租房爬虫 房源推荐系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【Golang/nacos】nacos配置的增删查改,以及服务注册的golang实例及分析

前言 本文分析的实例来源于nacos在github上的开源仓库 nacos配置的增删查改 先具体来看一段代码&#xff0c;我将逐步分析每一段的作用 package mainimport ("fmt""time""github.com/nacos-group/nacos-sdk-go/clients""github.com/naco…

AIGC视频生成明星——Emu Video模型

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Meta的视频生成模型Emu Video&#xff0c;作为Meta发布的第二款视频生成模型&#xff0c;在视频生成领域发挥关键作用。 &#x1f33a;优质专栏回顾&am…

5、docker-compose和docker-harbor

安装部署docker-compose 自动编排工具&#xff0c;可以根据dockerfile自动化的部署docker容器。是yaml文件格式&#xff0c;注意缩进。 1、安装docker-compose 2、配置compose配置文件docker-compose.yml 3、运行docker-compose.yml -f&#xff1a;指定文件&#xff0c;up&…

Vue3 nginx 打包后遇到的问题

前端vite文件配置 export default defineConfig({plugins: [vue(),DefineOptions()],base:./,resolve:{alias:{:/src, //配置指向src目录components:/src/components,views:/src/views}},server:{// host:0.0.0.0,// port:7000,proxy:{/api:{target:xxx, // 目标服务器地址 &am…

云上贵州多彩宝荣获仓颉社区先锋应用奖 | 助力数字政务新突破

在信息技术应用创新的浪潮中&#xff0c;仓颉社区吸引了众多企业和开发者的积极参与&#xff0c;已有多个应用成功落地&#xff0c;展现出蓬勃的创新活力。仓颉编程语言精心遴选了在社区建设、应用创新、开源共建、技术布道等方面做出突出贡献的优秀项目应用&#xff0c;并颁发…

强推未发表!3D图!Transformer-LSTM+NSGAII工艺参数优化、工程设计优化!

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Transformer-LSTMNSGAII多目标优化算法&#xff0c;工艺参数优化、工程设计优化&#xff01;&#xff08;Matlab完整源码和数据&#xff09; Transformer-LSTM模型的架构&#xff1a;输入层&#xff1a;多个变量作…

Oracle 可观测最佳实践

简介 Oracle 数据库是一种广泛使用的商业关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由甲骨文公司&#xff08;Oracle Corporation&#xff09;开发。它支持 SQL 语言&#xff0c;能够存储和管理大量数据&#xff0c;并提供高级数据管理功能&#xff0c;如数…

使用docker部署mysql和tomcat服务器发现的问题整理

1、本地访问tomcat时访问不到 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS …

【JavaEE】Spring(1)

一、什么是Spring和SpringBoot Spring是Java应用程序的开发框架&#xff0c;其目的就是为了简化Java开发&#xff1b;SpringBoot是在spring框架的基础上构建的一个快速开发框架&#xff0c;其作用是进一步简化Spring程序开发 二、SpringBoot项目 2.1 创建项目 1. 设置jdk版本…

数据库管理-第285期 Oracle 23ai:深入浅出向量索引(20250117)

数据库管理285期 20245-01-17 数据库管理-第285期 Oracle 23ai&#xff1a;深入浅出向量索引&#xff08;20250117&#xff09;1 HNSW事务支持解读 2 IVF分区支持解读 3 混合向量索引何时选择混合向量索引为何选择混合向量索引 总结 数据库管理-第285期 Oracle 23ai&#xff1a…

LabVIEW电源纹波补偿

在电子设备的电源管理中&#xff0c;电源纹波的存在可能会对设备的稳定性和性能产生负面影响。以某精密电子仪器的电源纹波补偿为例&#xff0c;详细阐述如何运用 LabVIEW 编写程序进行电源纹波补偿。将从电源纹波特点、测量采样、滤波、反馈控制等多个方面展开介绍。 ​ 电源…

Mousetrap:打造高效键盘快捷键体验的JavaScript库

Mousetrap&#xff1a;打造高效键盘快捷键体验的JavaScript库 前言 在当今快节奏的数字世界中&#xff0c;用户对Web应用的交互效率提出了更高的要求。 键盘快捷键作为一种提升操作便捷性和速度的有效手段&#xff0c;被广泛应用于各种应用中。 然而&#xff0c;实现一套稳定…

网络安全 | 什么是正向代理和反向代理?

关注&#xff1a;CodingTechWork 引言 在现代网络架构中&#xff0c;代理服务器扮演着重要的角色。它们在客户端和服务器之间充当中介&#xff0c;帮助管理、保护和优化数据流。根据代理的工作方向和用途&#xff0c;代理服务器可分为正向代理和反向代理。本文将深入探讨这两种…

STM32 学习笔记【补充】(十)硬件I2C读写MPU6050

该系列为笔者在学习STM32过程&#xff08;主线是江科大的视频&#xff09;中的记录与发散思考。 初学难免有所纰漏、错误&#xff0c;还望大家不吝指正&#xff0c;感谢~ 一、I2C 外设简介 I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种多主多从的串行通信协议…