面试问答总结之Java进阶

文章目录

  • 🐒个人主页
  • 🏅JavaEE系列专栏
    • 📖前言:
    • 🎀注解Annotaion (java标注)
      • 🐕内置注解
      • 🐕元注解
    • 🎀对象克隆
      • 🐕如何实现克隆
        • 🐕如何实现深克隆?
        • 🏨统一建模语言(Unified Modeling Language,UML)
      • 🐕类与类关系
      • 🐕面向对象设计原则
        • 🪂 单一职责原则:
        • 🪂 开闭原则:
        • 🪂里氏替换原则:“多态”
        • 🪂接口隔离原则:
        • 🪂依赖倒置原则:
        • 🪂迪米特原则:“封装”
        • 🪂组合复用原则:
    • 🎀Java 设计模式(java design patterns)
      • 🐕为什么要学习设计模式
      • 🪀单例模式:
      • 🪀工厂模式:
      • 🪀原型模式:
      • 🪀代理模式:
      • 🪀模板模式:
      • 🪀策略模式:
    • 🎇持续更新...

🐒个人主页

🏅JavaEE系列专栏

📖前言:

本篇博客主要总结面试中对java进阶部分的考察点

🎀注解Annotaion (java标注)

java中的类,方法,变量,参数和包 都可以使用注解,在编译期间或运行期间会对执行注解的类进行解析,完成特定的功能。

🐕内置注解

在这里插入图片描述

🐕元注解

在这里插入图片描述
在这里插入图片描述

🎀对象克隆

将一个对象数据 复制到另一个对象中去,克隆分为浅克隆和深克隆。浅克隆与深克隆的区别是一个对象的引用属性 复制到另一个对象中去时,只把引用属性地址复制了过去,这叫浅克隆。返回一个新对象。

🐕如何实现克隆

在类上面实现一个 Cloneable 接口,再重写Object类中的Clone()方法
在这里插入图片描述

🐕如何实现深克隆?

方式1: 将引用属性的类也实现 Cloneable 接口,重写clone()方法,再到上一级的克隆方法中调用引用属性类的克隆方法,实现深克隆。 缺点:如果层级太多,深克隆很麻烦。
方式2: 通过序列化方式 对象的输 入输出流,引用类都实现Serializable 接口
在这里插入图片描述

🏨统一建模语言(Unified Modeling Language,UML)

UML建模语言是通过图形符号来帮助开发者表示各个模块、类之间的关系的建模语言。
类图:显示类与类之间的内部关系结构,不显示类中的属性

🐕类与类关系

根据类与类之间的耦合度从弱到强排列,UML 中的类图有以下几种关系:
依赖关系:通过一个类A的属性、方法来调用另一个类B的方法、属性,称A依赖B
关联关系

单向关联:类B作为类A的一个引用变量
双向关联:类B作为类A的一个引用变量,同时类A也作为类B的一个引用变量
自关联:类A内部有一个类A的引用变量

聚合关系:强关联关系,整体与部分的关系,但是部分可以脱离整体而存在。(学校与教师)
组合关系:强关联关系,整体与部分关系,部分不能脱离整体而存在(头和嘴)

继承关系:类继承类
实现关系:类实现类
其中继承和实现的耦合度相等,它们是最强的

🐕面向对象设计原则

🪂 单一职责原则:

一个类只负责一个功能领域内相应的职责,不要负责太多,否则内部耦合性太高,不利于扩展。–提倡“低内聚,高耦合”

🪂 开闭原则:

对扩展开放,对修改关闭。在扩展性能时,不建议修改原来的代码,建议新创建一个类来实现新功能,不改动原来的代码。(生产新产品汽车,创建新类继承Abstract Car实现功能即可 )。

🪂里氏替换原则:“多态”

就是在调用父类的地方,我们可以调用子类对象(多态的思想)。子类重写父类方法,可能会对子类自己原来调用父类方法的执行结果产生影响。
继承优点: 代码可服用性(子类可用父类方法)、可拓展性(方法重写、子类可扩展新方法)
继承缺点: 继承是侵入性的,就必须拥有父类的属性和方法,体系结构复杂。耦合性高(如果修改父类的方法可能会对子类造成影响)

🪂接口隔离原则:

每个接口只实现单一特定的功能,不要把许多功能设计到一个接口中,可以设计多个接口来定义多个功能。
可以引入“适配器类…mouseAdapter”

🪂依赖倒置原则:

如果有多个同类型的事物时,应该要抽取出来一个公共类。
具体实现细节应该要依赖抽象,具体类依赖抽象类、接口。

🪂迪米特原则:“封装”

尽可能的封装类的信息,对外界只提供public方法,不泄漏其他信息。可以给内部类、属性进行信息共享,尽可能降低类与类之间的耦合度。

🪂组合复用原则:

在某些情况下,A类中只想用到B类中的某个属性、方法
首先考虑组合、聚合关系,在A中关联B,或者方法中依赖B
其次才考虑继承(因为关联关系的继承耦合性大于组合、聚合)
在这里插入图片描述

🎀Java 设计模式(java design patterns)

设计模式概念最早出现在建筑领域,后来被引入到了软件设计领域。是之前的程序员在实际开发中为了解决经常出现的问题而制定的一系列的解决方案。

🐕为什么要学习设计模式

设计模式是面向对象设计原则的实际应用,通过学习设计模式,可以更好的理解系统的架构,理解封装、继承、多态和类与类之间的关系,去提升代码可复用性、可扩展性、可维护性(对于后期项目添加新功能时,改动成本最低)。

🪀单例模式:

解决一个类在程序中保证只能创建一个对象。(任务管理器窗口、控制面板、系统设置,java中的Runtime类-饿汉式单例)
懒汉单例: 第一次类加载时,不创建对象,只有第一次调用对外部提供的创建对象的方法时,才进行创建。
懒汉式单例存在线程安全问题,

如果有两个线程同时进入创建对象的方法中,此时还没有初始化对象,就可能初始化两个对象。如果给方法加synchronized会导致线程访问效率太低,所以这里用到了 双重检索单例 + volatile关键字来解决这个问题。
在这里插入图片描述
在这里插入图片描述

饿汉单例: 第一次类加载时就创建对象,以后直接调用不会创建新的对象,不会存在线程安全问题。但是类初始化阶段创建对象,会延长类初始化的时间。

🪀工厂模式:

简单工厂模式: 有一个工厂类负责生产某一类的产品,这一类的产品会抽取出来一个抽象公共类、或接口,把创建对象与使用对象分离开(Spring框架就是这个思想)它不属于23种设计模式,因为他工厂内代码写死,不满足开闭原则
在这里插入图片描述

工厂方法模式: 在简单工厂模式的基础上,工厂类也进行抽象,一类抽象产品对应一类抽象工厂,是一类具体产品对应一个具体实施的工厂,扩展产品类只需要添加一个生产新产品的工厂和一个新产品类即可。满足开闭原则缺点:增加了额外的代码量。
在这里插入图片描述
抽象工厂模式: 对于工厂方法模式,一个类对应一个产品,但是哪怕产品与产品之间使用联系的,也必须一个类对应一个工厂。(华为手机、华为汽车…)如果产品属于一个“系列”(公司),那么可以按“系列”来划分工厂,一个系列工厂可以生产不同类型、属于公司旗下的产品。抽象工厂定义产品类型,具体工厂实施。
在这里插入图片描述

🪀原型模式:

创建多个相同的对象,每次使用new开销比较大,因为每个对象里面的内容一样,所以我们可以先创建一个对象,其余的使用对象克隆来实现。这样速度很快。

在这里插入图片描述

在这里插入图片描述

🪀代理模式:

目标对象的代理人,(汽车厂中介),除了实现目标对象功能外还能实现一些额外的功能。使目标对象与添加新的功能相隔离,降低耦合度。
静态代理: 需要实现接口 来重写里面的方法并添加相关服务。满足开闭原则,添加一类目标,可以添加一个代理类。不太适合框架使用(代码是写死的,不灵活,不能对任意类代理)。
在这里插入图片描述

动态代理: 我们不需要手动的创建代理类,只需要编写一个动态处理器即可,由动态处理器创建代理对象,代理对象再执行功能。分为jdk代理、cglib代理
jdk代理: 动态代理的实现方式是通过反射来实现的,动态处理器需要实现InvocationHandler接口,实现获取代理对象的方法,传入参数为目标类的类加载器, 获取目标类的接口、动态处理器,从而生成一个代理对象。代理对象再使用invok()方法执行相关功能。缺点:目标对象仍然需要实现接口
在这里插入图片描述
在这里插入图片描述
cglib代理: 引入此jar包后,它底层采用了字节码技术,为目标类创建一个子类,并在子类中采用方法拦截技术拦截父类调用的所有方法,顺便植入横切逻辑代码(AOP)。目标类不能是final修饰的,否则会报错。
如果方法被final/satic修饰或私有化,则此方法不会被子类拦截(因为没有被继承)。即不会执行额外的代理服务。
spring中两种动态代理的方式都实现了,它会根据目标类是否实现了接口,来选择使用哪一种动态代理。 默认采用cglib代理方式。

🪀模板模式:

将一段流程,(预约、挂号、诊断、出院)流程固定的写到父类里面,像“诊断” 每个人看病的情况都不一样,就定义一个默认方法/抽象方法,用一个子类来重写一下即可。
在这里插入图片描述

🪀策略模式:

在这里插入图片描述

(剩下的设计模式就不列举了…)

🎇持续更新…

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

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

相关文章

从零开始学习PX4源码2(PX4姿态误差计算)

目录 文章目录 目录摘要1.源码1.1源码路径1.2源码程序1.3源码功能 2.源码分析 摘要 本节主要记录PX4姿态误差计算过程,欢迎批评指正。 1.源码 1.1源码路径 PX4-Autopilot/src/modules/mc_att_control/AttitudeControl/AttitudeControl.cpp1.2源码程序 matrix::…

[项目设计] 从零实现的高并发内存池(三)

🌈 博客个人主页:Chris在Coding 🎥 本文所属专栏:[高并发内存池] ❤️ 前置学习专栏:[Linux学习] ⏰ 我们仍在旅途 ​ 目录 4.CentralCache实现 4.1 CentralCache整体架构 4.2 围绕Span的相关设计…

STM32CubeIDE基础学习-基础外设初始化配置

STM32CubeIDE基础学习-基础外设初始化配置步骤 前言 前面的文章介绍了基础工程的创建步骤,这篇文章就接着在基础工程的基础上来配置相关外设了,下面以STM32F103C8T6的主芯片为例进行简单配置。 基础工程创建步骤回顾 具体的配置步骤流程如下&#xff1…

使用git的小笔记

平时工作中使用git存储项目代码, 常用的命令 拉取仓库代码 git clone http://100.100.100.100:9080/my_test/test.git 拉取到以后, 先切换到自己的分支 git checkout my_name 一顿魔改代码 然后 add 新增的文件或者修改的文件 git add * 然后提交 并写…

美国和中国互相竞争的计算机(大脑)都由哪些东西组成

计算机基础 本章要点 -> 计算机的发展史 -> 计算机的分类 -> PC系统的组成 一 计算机的发展 1946年2月14日,在美国宾夕法尼亚大学,众所周知的世界上 第一台电子数字计算机ENIAC诞生 计算机发展至今,共经历了以下几个阶…

netlink原理及应用

什么是netlink netlink是一种基于网络的通信机制,允许内核内部、内核与用户态应用之间甚至用户态应用之间进行通信;netlink的主要作用是内核与用户态之间通信;它的思想是,基于BSD的socket使用网络框架在内核和用户态之间进行通信…

docker安装ES和kibana

文章目录 一、安装Elasticsearch1. 安装Elasticsearch2. 安装IK分词器3. elasticsearch-head 监控的插件4. 配置跨域 二、安装kibana 提示:以下是本篇文章正文内容,下面案例可供参考 一、安装Elasticsearch 1. 安装Elasticsearch 安装Elasticsearch参…

揭秘麦肯锡的方法:产品经理解决问题指南

您是否想知道世界上最成功的产品经理如何始终如一地提供不仅满足而且超出预期的解决方案?秘密可能就在于世界上最负盛名的咨询公司之一麦肯锡公司所磨练的方法论。本文深入探讨了麦肯锡的问题解决流程,该流程专为希望提升水平的产品经理量身定制。 01. 麦…

java 面试题总结

1锁粗化和锁消除&#xff0c;锁膨胀和锁升级的区别。 https://www.cnblogs.com/xuxinstyle/p/13387778.html .无锁 < 偏向锁 < 轻量级锁 < 重量级锁 &#xff0c;说的时候不要忘记说无锁状态 2.Map 的实现&#xff0c;线程安全的实现 1、ConcurrentHashMap在JDK 1.7…

【AI视野·今日CV 计算机视觉论文速览 第300期】Fri, 1 Mar 2024

AI视野今日CS.CV 计算机视觉论文速览 Fri, 1 Mar 2024 Totally 114 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers DistriFusion: Distributed Parallel Inference for High-Resolution Diffusion Models Authors Muyang Li, Tianle Cai, J…

国创证券|AI手机PC概念拉升,福蓉科技4连板,思泉新材大涨

AI手机PC概念大幅走高&#xff0c;到发稿&#xff0c;思泉新材涨近15%&#xff0c;盘中一度涨停&#xff1b;道明光学、福蓉科技均涨停&#xff0c;诚迈科技涨近8%&#xff0c;亿道信息涨逾6%。 值得注意的是&#xff0c;福蓉科技已接连4个交易日涨停。公司4日晚间发布危险提示…

【c++】STL--List的实现

目录 一. List的数据结构 二. List实现的基本框架 1. list的结点结构类 2. List的迭代器类 正向迭代器 反向迭代器 3. List操作接口的实现 1. 默认成员函数 构造函数 和 析构函数 拷贝构造函数 和 赋值运算符重载 2. 修改相关函数接口 insert 和 erase …

pytorch统计属性

目录 1.normal2. mean, sum, min, max, prod3.argmin, argmax4. topk kthvalue5. compare6.norm 1.normal torch.normal(mean, std, *, generatorNone, outNone) → Tensor返回一个张量&#xff0c;其中的每个元素随机来自独立的标准正态分布。这些分布具有给定的均值和标准差…

12-Linux部署Zookeeper集群

Linux部署Zookeeper集群 简介 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、分布式同步、组服务等。…

入门LLMs开发 — LangChain

像OpenAI的GPT-4这样的大型语言模型&#xff08;LLMs&#xff09;已经风靡全球。它们可以自动执行各种任务&#xff0c;如回答问题、翻译语言、分析文本等。LLMs是第一种真正感觉像“人工智能”的机器学习类型。 然而&#xff0c;在将LLMs应用于实际产品时仍然存在挑战。特别是…

特氟龙塑料试剂瓶对比普通塑料和玻璃试剂瓶的优势

试剂瓶作为实验室中常备器皿耗材之一&#xff0c;主要用来盛放和储存样品、试剂&#xff0c;根据使用条件不同&#xff0c;也可叫取样瓶、样品瓶、储样瓶、广口瓶等。 根据瓶口口径不同&#xff0c;可分为广口瓶和窄口瓶&#xff0c;广口瓶口径较大&#xff0c;主要用于储存固…

Vue.js 实用技巧:深入理解 Vue.mixin

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

JProfiler详解 JVM性能监测内存泄露分析工具

JProfiler详解 JProfiler简介主要功能特点使用场景注意事项使用案例使用步骤Could not verify ssh-ed25519 host key with fingerprint 问题解决内存泄露分析 JProfiler简介 JProfiler是一款业界领先的Java性能分析工具&#xff0c;由ej-technologies公司开发&#xff0c;专门…

【亲测】注册Claude3教程,解决Claude3被封号无法发送手机验证码

【亲测】注册Claude3教程&#xff1a;解决无法发送手机验证码的问题 Anthropic 今日宣布推出其最新大型语言模型&#xff08;LLM&#xff09;系列——Claude 3&#xff0c;这一系列模型在各种认知任务上树立了新的性能标准。Claude 3 系列包括三个子模型&#xff1a;Claude 3 …

微服务架构SpringCloud(2)

热点参数限流 注&#xff1a;热点参数限流默认是对Springmvc资源无效&#xff1b; 隔离和降级 1.开启feign.sentinel.enabletrue 2.FeignClient(fallbackFactory) 3.创建一个类并实现FallbackFactory接口 4.加入依赖 <!--添加Sentienl依赖--><dependency><gro…