java常见面试题汇总

news2024/11/28 3:31:45

在这里插入图片描述
🌏个人博客主页:意疏-CSDN博客
在这里插入图片描述

希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏支持一下笔者吧~

阅读指南:

  • 开篇说明
    • 一、封装 继承 多态
      • 1.封装
      • 2.继承
      • 3.多态
    • 二、什么是重载,什么是重写
    • 三、Javafinal、finally、finzlize各有什么区别
    • 四、泛型的概念和作用
    • 五、TCP/IP 协议
    • 六、get和post区别


开篇说明

本面试题集锦旨在为即将参加Java相关职位面试的求职者提供一个全面的复习指南。通过精心挑选和编排的题目,帮助求职者系统地回顾和巩固所学知识,提升面试应对能力。
每一道题目都经过深思熟虑,旨在模拟真实面试场景中的问题,既考察了基础知识的掌握程度,也挑战了应聘者的实际应用能力和创新思维。我们希望通过这些题目,能够激发求职者的思考,帮助他们在面试中展现出最佳的自己。
无论你是初出茅庐的应届生,还是经验丰富的职场老手,本面试题集锦都将是你备战Java面试的宝贵资源。我们期待每一位求职者都能通过这份指南,找到适合自己的职位,开启职业生涯的新篇章。
并且这个文章一直在添加、随时更新,希望可以和你一起进步。
祝你面试顺利,前程似锦!

一、封装 继承 多态

1.封装

  1. 封装是什么:
    封装是一种面向对象编程的概念,指将数据和对数据的操作(方法)打包在一起,形成一个独立的单元。封装的目的是将数据和方法封装在一个对象内部,只暴露必要的接口给外部使用,隐藏对象的内部细节和实现方式。通过封装,可以提高代码的可维护性、可重用性和安全性。封装的关键是将相关的数据和方法进行组织和管理,形成一个统一的整体。

  2. 关键字:private。
    被private修饰的成员,只能在本类进行访问,针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作
    “get变量名()”方法,用于获取成员变量的值,方法用public修饰。
    “set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰。

  3. this关键字
    构造方法只能调用一次,在创建对象的时候调用。
    在成员方法中:谁调用这个方法,那么this就指向那个对象。
    在构造方法中:this指向新创建的那个对象
    this 关键字主要应用:
    成员变量 成员方法、其它构造方法。

  4. 封装思想
    是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的

  5. 封装原则
    将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
    成员变量private,提供对应的getXxx()/setXxx()方法

  6. 封装好处
    通过方法来控制成员变量的操作,提高了代码的安全性
    把代码用方法进行封装,提高了代码的复用性
    隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。

2.继承

  1. 继承是什么:
    Java中的继承是面向对象编程(AOP)的一个核心概念,它允许新创建的类(统称为子类或者派生类)继承现有类(成为父类或基类)的属性和方法。
    通过继承,子类可以复用、拓展和修改父类的行为,提高了代码的复用性,实现了多态。
    需要注意的是
    Java只支持单继承、即一个父类只能继承一个直接父类。但是通过接口(interface),Java实现了多继承的功能。

3.多态

  • 多态是什么:
    多态是一种抽象行为,它的主要作用是让程序员可以面对抽象编程而不是具体的实现类,这样子写出来的代码拓展性会更强。
    咱们来举个例子:
    YiShu yshu = new School();
    这里YiShu是一个父类,含有一个工作的方法,Student重写工作方法,比如吃饭
class YiShu {
    void eat() {
        System.out.println("日常工作");
    }
}

class Student extends YiShu {
    @Override
    void eat() {
        System.out.println("吃饭");
    }
}

public class Test {
    public static void main(String[] args) {
        YiShu yiShu = new Student();
        yiShu.eat(); // 输出 "吃饭"
    }
}
  • 在使用时,对象都是YiShu,但是new不同的实现类,表现的形式不同,这也就从字面上解释了什么是多态。
    这里我们定义了基类 YiShu:
    包含一个名为 eat 的空方法,该方法打印出 “日常工作”。
    定义了派生类 Student:
    Student 类继承自 YiShu。
    重写了 eat 方法,并在其中打印 “吃饭”。
    Test 类中的 main 方法:
    创建了一个 YiShu 类型的引用变量 yiShu。
    实际上,通过这个引用变量指向的是 Student 类的一个新实例。
    调用 eat 方法时,Java 会查找实际对象类型 (Student) 中的方法实现,而不是引用类型 (YiShu) 的实现。
    因此,当调用 yiShu.eat() 时,尽管是通过 YiShu 类型的引用调用的,但由于多态的特性,实际上执行的是 Student 类中的 eat 方法,所以输出为 “吃饭”。
    这是 Java 多态性的典型例子,即子类可以覆盖父类的方法来改变行为。

形成多态的三个条件:

  1. 继承:必须存在有继承关系的子类和父类。这是实现多态的基础,因为多态依赖于不同类之间的相似性,即它们共享一个共同的超类(父类)。
  2. 方法重写:子类需要重写父类中的方法。这意味着子类提供了与父类中同名方法不同的实现,从而使得在运行时能够根据对象的实际类型选择合适的方法版本。
  3. 父类引用指向子类对象:使用父类类型的引用变量指向子类对象。这样,在调用方法时,会根据实际对象的类型决定调用哪个版本的方法,这就是动态绑定或多态性的体现

二、什么是重载,什么是重写

  1. 重载
    重载是指在同一个类中定义多个方法,它们具有相同的名字但参数列表有所不同。主要用于提供相同功能的不同实现。
    注意的是 和返回值没有关系,
    方法的签名是名字是名字和参数列表,不包括返回值。
    重载通常用于提供同一操作的不同实现,例如构造函数的重载,不同类型输入的处理等。

  2. 重写
    在子类中定义一个与父类方法具有相同签名(方法名、参数列表)的方法,方法返回类型与父类一直,或者是其子类。
    且子类方法定义的访问修饰符,不能比父类更严格。例如父类方法是protected那么子类方法不能是private,但可以是public
    子类方法抛出的异常必须与父类一致,或者是其父类异常的子类。

重写通常用于在子类中提供的父类方法的具体实现,以实现多态性。例如,子类对父类方法进行拓展或修改以适应特定需求。

class YiShu {
     public void eat() {
        System.out.println("日常工作");
    }
}

class Student extends YiShu {
    @Override
    public void eat() {
        System.out.println("吃饭");
    }
}

public class Test {
    public static void main(String[] args) {
        YiShu yiShu = new Student();
        yiShu.eat(); // 输出 "吃饭"
    }
}

这里@Override 注解的主要作用是帮助确保正确实现了方法覆盖,并提高了代码的可读性和健壮性。表明 Child 类中的 display() 方法是为了覆盖 Parent 类中的相应方法。


三、Javafinal、finally、finzlize各有什么区别

  • final:用于类、方法和变量,表示不可改变或者不可继承
  • final是一个关键字,其可以用来修饰变量,方法以及类等,被修饰之后的部分
  • finally:用于try-catch块中,无论是否抛出异常,finally块中的代码总会被执行。
  • finalize:是Object类中的方法,供垃圾收集器在回收对象之前调用,但由于自身的局限以及不确定性,不推荐使用。

四、泛型的概念和作用

泛型可以把类型当作参数一样传递,使得像一些集合类可以明确存储的对象类型,不用显示地强制转化(在没泛型之前只能是Object,然后强制转换)。


五、TCP/IP 协议

首先
TCP协议是一个面向连接的、可靠的传输协议,它提供一种可靠的字节流,能保证数据完整、无损并且按顺序到达。
TCP尽量连续不断地测试网络的负载并且控制发送数据的速度以避免网络过载。另外,TCP试图将数据按照规定的顺序发送。
面向连接:数据传输之前客户端和服务器端必须建立连接
可靠的:数据传输是有序的 要对数据进行校验
TCP三次握手
为了保证客户端和服务器端的可靠连接,TCP建立连接时必须要进行三次会话,也叫TCP三次握手,进行三次握手的目的是为了确认双方的接收能力和发送能力是否正常。

最开始的时候客户端和服务器都是处于CLOSED关闭状态。主动打开连接的为客户端,被动打开连接的是服务器。
TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了 LISTEN 监听状态
第一次握手 TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT 同步已发送状态
第二次握手 TCP服务器收到请求报文后,如果同意连接,则会向客户端发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了 SYN-RCVD 同步收到状态
第三次握手 TCP客户端收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED已建立连接状态 触发三次握手
简单解释:
第一次握手: 客户端向服务器端发送报文,证明客户端的发送能力正常
第二次握手:服务器端接收到报文并向客户端发送报文,证明服务器端的接收能力、发送能力正常
第三次握手:客户端向服务器发送报文,证明客户端的接收能力正常
通俗解释:
以电话通联为例:老王给老汪打电话建立通信
老王:老汪老汪,听到请回答。
老汪:老王收到,声音接受正常。
老王:受到收到,保持通联。
必须触发三次握手的主要原因是防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。

TCP的四次挥手
数据传输完毕后,终止TCP连接,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。
第一次挥手 客户端发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态
第二次挥手 服务器端接收到连接释放报文后,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT 关闭等待状态
第三次挥手 客户端接收到服务器端的确认请求后,客户端就会进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文,服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
第四次挥手 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态,但此时TCP连接还未终止,必须要经过2MSL后(最长报文寿命),当客户端撤销相应的TCB后,客户端才会进入CLOSED关闭状态,服务器端接收到确认报文后,会立即进入CLOSED关闭状态,到这里TCP连接就断开了,四次挥手完成
客户端等待2MSL主要原因是为了保证客户端发送那个的第一个ACK报文能到到服务器,因为这个ACK报文可能丢失,并且2MSL是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃,这样新的连接中不会出现旧连接的请求报文。

六、get和post区别

1.get请求一般是去取获取数据(其实也可以提交,但常见的是获取数据);
post请求一般是去提交数据。
2.get因为参数会放在url中,所以隐私性,安全性较差,请求的数据长度是有限制的,
不同的浏览器和服务器不同,一般限制在 2~8K 之间,更加常见的是 1k 以内;
post请求是没有的长度限制,请求数据是放在body中;
3.get请求刷新服务器或者回退没有影响,post请求回退时会重新提交数据请求。
4.get请求可以被缓存,post请求不会被缓存。
5.get请求会被保存在浏览器历史记录当中,post不会。get请求可以被收藏为书签,因为参数就是url中,但post不能。它的参数不在url中。
6.get请求只能进行url编码(appliacation-x-www-form-urlencoded),post请求支持多种(multipart/form-data等)。

深入理解
1.GET 和 POST都是http请求方式, 底层都是 TCP/IP协议;通常GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包(但firefox是发送一个数据包),
2.对于 GET 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200
(返回数据)表示成功;
对于 POST,浏览器先发送 header,服务器响应 100, 浏览器再继续发送 data,服
务器响应 200 (返回数据)。

在这里插入图片描述


意气风发,漫卷疏狂
学习是成长的阶梯,每一次`的积累都将成为未来的助力。我希望通过持续的学习,不断汲取新知识,来改变自己的命运,并将成长的过程记录在我的博客中

如果我的博客能给您带来启发,如果您喜欢我的博客内容,请不吝点赞、评论和收藏,也欢迎您关注我的博客。
您的支持是我前行的动力。听说点赞会增加自己的运气,希望您每一天都能充满活力!

愿您每一天都快乐,也欢迎您常来我的博客。我叫意疏,希望我们一起成长,共同进步。
logo
我是意疏 下次见!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

非极大值抑制(Non-Maximum Suppression,简称 NMS)

本文为专栏《Python三维点云实战宝典》系列文章,专栏介绍地址“【python三维深度学习】python三维点云从基础到深度学习_python3d点云从基础到深度学习-CSDN博客”。配套书籍《人工智能点云处理及深度学习算法》提供更加全面和系统的解析。 非极大值抑制&#xff08…

揭开数字化转型的神秘面纱

​在当今快速发展的时代,数字化转型已成为众多企业和组织追求的目标。然而,对于许多人来说,数字化转型仍然笼罩着一层神秘的面纱。本研究报告旨在揭开数字化转型的神秘面纱,深入探讨其内涵、重要性以及实施策略。 一、数字化转型的…

开始尝试从0写一个项目--后端(四)

借出,归还,管理 学生和管理员登录分离 学生登录到用户界面 管理员到后台 后台和用户分离 添加代码 sems-server/src/main/java/com/ljc/controller/user/UserStudentController.java package com.ljc.controller.user;import com.ljc.constant.Jwt…

【PyCharm】配置“清华镜像”地址(pip源)

文章目录 前言一、清华镜像是什么?二、pip是什么?三、具体步骤1.复制镜像地址2.打开PyCharm,然后点击下图红框的选项3.在弹出的新窗口点击下图红框的选项进行添加4.在URL输入框中粘贴第一步复制的地址,名字可以不更改,…

leetcode371. 两整数之和,位运算

leetcode371. 两整数之和 给你两个整数 a 和 b ,不使用 运算符 和 - ​​​​​​​,计算并返回两整数之和。 示例 1: 输入:a 1, b 2 输出:3 示例 2: 输入:a 2, b 3 输出:5 …

【Axure高保真原型】中继器表格——标签使用情况案例

今天和大家分享中继器表格——标签使用情况案例的原型模板,效果包括: 模糊搜索——输入标签编号或者标签名称,可以快速查找对应的数据 排序——点击排序按钮,可以按升序或降序排列 分页——点击上拉列表,可以选择表格…

gpu压力测试工具----gpu_burn的使用

背景: 我们平时想做gpu的压力测试,需要一个简单的可以一键执行的工具来测试,主要要来打满gpu的使用率和显存,这里以8卡4090机器为测试机,驱动版本550.54.14,cuda版本12.3。 开源方案: gpu-burn一…

oauth2.0学习

一、授权码模式 时序图 1、用户访问第三方服务,如果用到需要授权服务提供授权的资源,第三方服务生成获取授权码请求(附带回调地址和用户在授权服务的确认身份的信息)并页面发起请求 2、第三方授权服务根据请求生成对应的登录地址…

c++ 谷歌的招聘 题解

题目描述 2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘 内容超级简单,就是一个以 .com 结尾的网址,而前面的网址是一个 1010 位素数,这个素数是自然常数 e 中最早出现的 10 位连续数字 能找出这个素数的人,就可以通过访问谷歌的这个网站进…

MySQL 亿级数据平滑迁移实战

作者:来自 vivo 互联网服务器团队- Li Gang 本文介绍了一次 MySQL 数据迁移的流程,通过方案选型、业务改造、双写迁移最终实现了亿级数据的迁移。 一、背景 预约业务是 vivo 游戏中心的重要业务之一。由于历史原因,预约业务数据表与其他业务…

springcloud集成seata实现分布式事务

Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 官网:Apache Seata 文章目录 一、部署1.下载2.修改配置,nacos作注册中心,db存储 二、集成到springcloud项目1.引入依赖2.修改…

go设计模式——单例模式

概念 单例是一种创建型设计模式,它确保一个类在整个程序运行期间只有一个实例,并提供一个全局访问点来使用该实例。虽然单例模式在某些情况下非常有用,例如管理全局配置、日志记录或资源共享,但它也带来了与全局变量相似的问题。…

【CSS】什么是1px问题,前端如何去解决它,如何画出0.5px边框?

1px 问题概述 在移动端开发中,1px 的边框在高 DPI 屏幕上可能会显得过粗,这是因为移动设备的像素密度(DPI)通常比传统的计算机屏幕高。在高 DPI 屏幕上,1px 实际上可能会被渲染为 2px 或更多,这使得边框看…

华为手机换ip地址怎么换?手机换ip地址有什么影响

在数字化时代,网络已成为我们生活中不可或缺的一部分。无论是日常沟通、工作学习还是娱乐休闲,我们都离不开互联网。然而,随着网络安全问题的日益突出,如何保护个人隐私和信息安全成为了用户关注的焦点。更换手机IP地址作为提升网…

Vue3+Vite 解决“找不到模块“@/components/xxx.vue”或其相应的类型声明 ts(2307)”

1. 安装插件 pnpm i types/node -D2. 修改vite.config.ts文件 import path from path;resolve: {alias: {"": path.resolve(__dirname,"./src"),},},3. 修改tsconfig.app.json文件 别人教的都是修改tsconfig.json文件,但是我发现可能是因为版…

NVF04M录音芯片在宠物喂食器的应用:录音播放功能,内置SPI闪存

在现代社会中,宠物已经成为人们生活中的一部分,而宠物喂食器作为宠物养护的重要工具,也越来越受到人们的关注。为了满足人们对宠物喂食器的多样化需求,九芯电子供应商研发了一款NVF04M录音芯片。它在宠物喂食器中的作用主要是提供…

巧用PDF转Markdown插件,在扣子(Coze)手搓一个有趣好玩的AI Bot

近期,TextIn团队开发的PDF转Markdown插件已经上架Coze平台。 短短的时间内,已经有不少朋友愉快地和我们的工具开始玩耍。今天我们抛砖引玉,介(an)绍(li)几种PDF转Markdown插件的有趣玩法&#…

通用情商智商性格测试ACCESS\EXCEL数据库

今天这个数据库记录数不太多,是个可以进行智商和情商测试的数据,也可以体验比较有趣的测试体验,整个测试主要是以回答不同方面的问题来分析的。智商测试和情商测试均采用国际标准试题,采用国际标准测试题目,通过回答不…

多模态模型评测框架lmms-eval发布!全面覆盖,低成本,零污染

随着大模型研究的深入,如何将其推广到更多的模态上已经成为了学术界和产业界的热点。最近发布的闭源大模型如 GPT-4o、Claude 3.5 等都已经具备了超强的图像理解能力,LLaVA-NeXT、MiniCPM、InternVL 等开源领域模型也展现出了越来越接近闭源的性能。 在…

NSSM 注册exe服务

参考链接:https://www.cnblogs.com/magicMaQaQ/p/18174409 下载NSSM:[NSSM - the Non-Sucking Service Manager](NSSM - the Non-Sucking Service Manager) 解压得到的压缩包 使用管理员权限运行 cmd,来到解压后的目录,执行nssm…