java常见面试题汇总

在这里插入图片描述
🌏个人博客主页:意疏-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 {@Overridevoid 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 {@Overridepublic 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.mzph.cn/bicheng/52193.shtml

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

相关文章

初始化列表 / 隐式转换 / 静态

目录 初始化列表隐式转换单参数的隐式类型转换多参数的隐式类型转换explicit关键字 static 初始化列表 大部分时候成员变量在对象实例化的时候调用构造函数就整体定义了,注意此时只有定义,不算初始化。而定义后的值的值是在构造函数里面给的。我们知道构…

<数据集>无人机航拍不同高度牧羊识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:6065张 标注数量(xml文件个数):6065 标注数量(txt文件个数):6065 标注类别数:1 标注类别名称:[sheep] 序号类别名称图片数框数1sheep6065149785 使用标注工具&…

Macos M1 IDEA本地调试 HBase 2.2.2

# 1. 前提 执行 mvn clean package assembly:single -DskipTests没问题,并在hbase-assembly/target目录下生成hbase-2.2.2-bin.tar.gz 文件夹 证明Maven 下载依赖没问题 1.1 报错 1 这里应该是报错找不到 com.google.protobuf:protoc:exe:osx-aarch_64:3.5.1 …

入门STM32—外部中断

外部中断的存在使得微控制器能够及时响应外部事件,避免频繁的轮询操作,从而提高系统的实时性、效率和低功耗性能。 1.什么是外部中断? 外部中断是指微控制器接收到外部引脚的信号变化时触发的中断。STM32F103系列微控制器支持多个外部中断线…

鸿蒙(API 12 Beta3版)【DRM会话管理(C/C++)】数字版权保护开发

DRM会话管理(MediaKeySession)支持媒体密钥管理及媒体解密等,MediaKeySession实例由系统管理里的MediaKeySystem实例创建和销毁。 开发步骤 导入NDK接口,接口中提供了DRM相关的属性和方法,导入方法如下。 #include &…

学习嵌入式第二十九天

ipc进程间通信方式 PC,即进程间通信(Inter-Process Communication),是操作系统中不同进程之间交换数据的一种机制。以下是一些常见的IPC方式: 管道:用于父子进程或兄弟进程之间的通信。消息队列&#xff…

selenium-java实现自动登录跳转页面

如果要一直刷新一个网页,总不能人工一直去点,所以想到大学时候学过selenium技术,写个脚本来一直刷新,因为经常写java语言,所以选用java语言来写 实验环境 注意,需要先准备好Google浏览器和Chrome-Driver驱…

ffmpeg6.1集成Plus-OpenGL-Patch滤镜

可参考上一篇文章。ffmpeg6.1集成ffmpeg-gl-transition滤镜-CSDN博客 安装思路大致相同, 因为 Plus-OpenGL-Patch也是基于 ffmpeg 4.x 进行开发的,所以在高版本上安装会有很多报错。 这是我安装后的示例,需要安装教程或者改代码可私信我。 …

记录一次 Redis 优化发送数据(使用管道批量传送)

一 项目背景 此前的项目中,鉴于客户方服务器的安全配置对 MQ 中间件有所限制,我们只得采用 Redis 的 list 作为简易的 MQ 来传送报文数据。然而,近段时间客户关闭了相关端口,导致大量数据积压,需要进行补发。在补发过程…

大数据背景下基于Python的牛油果销售数据可视化分析

注:源码在最后,只是一次实验记录,不合理的地方自行修改。 一 研究背景及意义 21世纪以来,随着科学技术的进步,人们的生活水平也随之大幅提升提高。在科技和经济快速发展下,全球已经进入了大数据时代。大数…

8.21-部署eleme项目

1.设置主从从mysql57服务器 (1)配置主数据库 [rootmsater_5 ~]# systemctl stop firewalld[rootmsater_5 ~]# setenforce 0[rootmsater_5 ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.serv…

使用 Fyne 构建 GUI 应用:设置标签文本和自增计数器

引言 Fyne 是一个用 Go 语言编写的跨平台 GUI 框架,它提供了一套丰富的组件来帮助开发者快速构建出漂亮的用户界面。在本文中,我们将通过一个简单的案例来演示如何使用 Fyne 创建 GUI 应用程序,该程序包含设置标签文本和自增计数器的功能。 …

「字符串」前缀函数|KMP匹配:规范化next数组 / LeetCode 28(C++)

目录 概述 思路 核心概念:前缀函数 1.前缀函数 2.next数组 1.考研版本 2.竞赛版本 算法过程 构建next数组 匹配过程 复杂度 Code 概述 为什么大家总觉得KMP难?难的根本就不是这个算法本身。 在互联网上你可以见到八十种KMP算法的next数组…

项目1 物流仓库管理系统

一、项目概述 本项目旨在开发一个功能全面的物流仓库管理系统,以数字化手段优化仓库作业流程,提高管理效率。系统集成了前端用户交互界面与后端数据处理逻辑,涵盖了从用户注册登录、订单管理、货单跟踪到用户信息维护等多个核心业务模块。通…

基于django的学生作业提交与管理系统,有管理后台,可作为课设使用

在本项目中,我们设计并实现了一个基于Django框架的学生作业提交与管理系统,旨在为教师和学生提供一个高效、便捷的作业管理平台。Django作为一个高效的Web框架,因其强大的功能和灵活的架构,使得本系统能够快速开发并扩展。 系统功…

Maven的简单使用

Maven使用 Maven的作用1. 自动构建标准化的java项目结构(1) 项目结构① 约定目录结构的意义② 约定大于配置 (2)项目创建坐标坐标的命名方法(约定) 2. 帮助管理java中jar包的依赖(1) 配置使用依赖引入属性配置 (2) maven指令(3) 依赖的范围(4) 依赖传递(…

【密码学】密钥管理:②密钥分配

一、密钥分配的定义 密钥分配是密钥管理生命周期中最重要的部分,密钥分配方案研究的是密码系统中密钥的分发和传送问题。从本质上讲,密钥分配为通信双方建立用于信息加密、解密签名等操作的密钥,以实现保密通信或认证签名等。 (1…

win10蓝牙只能发送,无法接收

给win10升了级,到22H2,蓝牙出了问题 以前接收,就是默认直接就可以接收。现在只能发送,无法接收。 在网上找了很多办法都没奏效,目前的方法是, 每次接收,都要操作一次,而不是自动接…

leetcode-538. 把二叉搜索树转换为累加树

题目描述 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下,二叉搜索树满足下列约束…

计量自动化终端上行通信规约

物理层 TCP 和 UDP 的传输接口 该类接口的登录链接和心跳检测采用链路测试服务,链路测试周期可设定。 参见 TCP/IP 协议规范。 串行通信传输接口 字节传输按异步方式进行,它包含 8 个数据位、1 个起始位“0”、1 个偶校验位 P 和 1 个停止位“1”。 …