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$A
        System.out.println("aClass.getName() -> " + aClass.getName()); // 打印 qq$A
        System.out.println("aClass.hashCode() -> " + aClass.hashCode()); // 打印557041912

        System.out.println("my.getClass() -> " + my.getClass());// 打印class qq$A
        System.out.println("my.getClass() -> " + my.getClass().getName());// 打印 qq$A
        System.out.println("my.getClass().hashCode() -> " + my.getClass().hashCode());// 打印557041912

        System.out.println("A.class -> " + A.class);// 打印class qq$A
        System.out.println("A.class -> " + A.class.getName());// 打印 qq$A
        System.out.println("A.class.hashCode() -> " + A.class.hashCode());// 打印557041912
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【从零开始入门unity游戏开发之——C#篇46】C#补充知识点——命名参数和可选参数

考虑到每个人基础可能不一样&#xff0c;且并不是所有人都有同时做2D、3D开发的需求&#xff0c;所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要讲解C#的基础语法&#xff0c;包括变量、数据类型、运算符、…

< OS 有关 > 阿里云:轻量应用服务器 的使用 安装 Tailscale 后DNS 出错, 修复并替换 apt 数据源

VPS 配置 主机&#xff1a;vCPU x2, 512MB, 20GB位置&#xff1a;阿里云&#xff0c;日本.东京OS&#xff1a; ubuntu24.20 原因&#xff1a; 这篇是操作过程的记录文章。 2 个月前&#xff0c; 在阿里云买了台 vps 。当时本想放到韩国&#xff0c;因为它离北京近。 但最便…

第6章 ThreadGroup详细讲解(Java高并发编程详解:多线程与系统设计)

1.ThreadGroup 与 Thread 在Java程序中&#xff0c; 默认情况下&#xff0c; 新的线程都会被加入到main线程所在的group中&#xff0c; main线程的group名字同线程名。如同线程存在父子关系一样&#xff0c; Thread Group同样也存在父子关系。图6-1就很好地说明了父子thread、父…

力扣刷题—爬楼梯

文章目录 一、题目二、示例三、解析四、代码 一、题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 二、示例 输入&#xff1a; n 2输出&#xff1a; 2三、解析 用f(x)表示爬到第x级台阶的方…

Python(十七)excel指定列自动翻译成英文

前言 本章主要讲述在excel的指定列后面添加一列&#xff0c;并翻译成英文 一、效果图 二、代码 实际需求&#xff1a; # -*- codeing utf-8 -*- # time: 2025/1/16 16:32 # Author : Mikasa # # Aim&#xff1a;自动将客户发的货物清单里的商品名称&#xff0c;翻译成英文…

JavaEE

一.web开发概述 1.服务器 解释1&#xff1a;服务器是一款软件&#xff0c;可以向其他发送请求&#xff0c;服务器会做出一个响应。可以在服务器中部署文件&#xff0c;让其他人访问。 解释2&#xff1a;也可以把运行服务器软件的计算机称为服务器 2.安装服务器 Tomcat官方…

基于海思soc的智能产品开发(高、中、低soc、以及和fpga的搭配)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 市场上关于图像、音频的soc其实非常多&#xff0c;这里面有高、中、低档&#xff0c;开发方式也不相同。之所以会这样&#xff0c;有价格的因素&am…

w~深度学习~合集5

我自己的原文哦~ https://blog.51cto.com/whaosoft/13083433 #Agile But Safe 足式机器人领域又一次迎来创新&#xff01;CMU 与 ETH Zurich 团队联合研发了一个名为 「敏捷但安全」&#xff08;ABS&#xff0c;Agile But Safe&#xff09;的新框架&#xff0c;为四足机器…

Excel重新踩坑6:工作实战总结之根据筛选条件求平均成绩

一、前言&#xff1a; 这个博客的实战场景&#xff1a;给了一组学生数据&#xff0c;这些数据中&#xff0c;有全市20个社区&#xff0c;1-9年级的学生各科成绩。要求按照各社区统计1-9年级的所有学生各科平均值。下面首先介绍会用到的一些函数&#xff0c;然后再简单说明实战…

STL容器-- list的模拟实现(附源码)

STL容器-- list的模拟实现&#xff08;附源码&#xff09; List的实现主要考察我们对list这一容器的理解&#xff0c;和代码的编写能力&#xff0c;通过上节对list容器的使用&#xff0c;我们对list容器已经有了一些基本的了解&#xff0c;接下来就让我们来实现一些list容器常见…

PageHelper快速使用

依赖 <!--分页插件PageHelper--> <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.7</version> </dependency>示例 /** * 封装分页结果…

大华Java开发面试题及参考答案 (上)

TCP 的三次握手和四次挥手过程中各个状态的细节是怎样的&#xff1f; TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输层协议&#xff0c;其三次握手和四次挥手过程涉及多个状态&#xff0c;以下是详细的状态细节&#xff1a; 三次握手…

ACL基础理论

ACL ——访问控制列表 ACL属于策略的一种 ACL访问控制列表的作用&#xff1a; 访问控制&#xff1a;在路由器流量流入或流出的接口上&#xff0c;匹配流量&#xff0c;然后执行设定好的动作&#xff1a;permit&#xff08;允许&#xff09;、deny&#xff08;拒绝&#xff…

【陕西省乡镇界】面图层shp格式arcgis数据乡镇名称和编码2020年wgs84坐标无偏移内容测评

标题中的“陕西省乡镇界面图层shp格式arcgis数据乡镇名称和编码2020年wgs84坐标无偏移.zip”表明这是一个地理信息系统&#xff08;GIS&#xff09;的数据集&#xff0c;专为陕西省的乡镇区域设计。该数据集以Shapefile&#xff08;shp&#xff09;格式提供&#xff0c;是GIS领…

简述mysql 主从复制原理及其工作过程,配置一主两从并验证

第一种基于binlog的主从同步 首先对主库进行配置&#xff1a; [rootopenEuler-1 ~]# vim /etc/my.cnf 启动服务 [rootopenEuler-1 ~]# systemctl enable --now mysqld 主库的配置 从库的配置 第一个从库 [rootopenEuler-1 ~]# vim /etc/my.cnf [rootopenEuler-1 ~]# sys…

(一)相机标定——四大坐标系的介绍、对应转换、畸变原理以及OpenCV完整代码实战(C++版)

一、四大坐标系介绍 1&#xff0c;世界坐标系 从这个世界&#xff08;world&#xff09;的视角来看物体 世界坐标系是3D空间坐标&#xff0c;每个点的位置用 ( X w , Y w , Z w ) (X_w,Y_w,Z_w) (Xw​,Yw​,Zw​)表示 2&#xff0c;相机坐标系 相机本身具有一个坐标系&…

Hugging Face功能介绍,及在线体验文生图模型Flux

Hugging Face简介 对于非机器学习或深度学习领域的人士来说&#xff0c;Hugging Face这个名字可能并不耳熟。然而&#xff0c;随着近年来大模型的迅速崛起&#xff0c;相信大家或多或少都有所接触。如果你对这一领域感兴趣&#xff0c;并在GitHub上查阅过一些开源资料&#xf…

华为ENSP:STP和链路聚合的管理与配置

这里将不再过度阐述STP和链路聚合的理论知识&#xff0c;不清楚的同学可以去观看Cisco文章中的理论知识 理论知识https://blog.csdn.net/2301_76341691/article/details/145166547?fromshareblogdetail&sharetypeblogdetail&sharerId145166547&sharereferPC&…

Asp.Net Core 8.0 使用 Serilog 按日志级别写入日志文件的两种方式

1、所需的Nuget包 本文项目的版本是.NET 8.0&#xff0c;如果使用其它版本安装适配版本即可。 Serilog.AspNetCore(8.0.2) Serilog.Sinks.File(5.0.0) Serilog.Expressions(5.0.0) 2、两种配置方式 2.1 代码形式&#xff08;Program.cs&#xff09; 在Program.cs文件中&am…

基于ESP32+VUE+JAVA+Ngnix的一个小型固件编译系统

一、前提 开发ESP32固件时&#xff0c;使用本地环境输出固件时&#xff0c;存在多个开发多种开发平台的问题。会导致最终输出的固件不统一。更可能因为本地的开发环境差异导致固件无法追溯。 基于上述原因&#xff0c;开发了一个小型的固件编译系统。将该系统部署在一台ubutn…