java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java常见面试题

java常见面试题及答案汇总

作者:意疏

本文提供Java面试题集锦,涵盖封装、继承、多态等核心概念,旨在帮助求职者全面复习,提升面试表现,从基础知识到实际应用,内容丰富,适合各类求职者,需要的朋友可以参考下

开篇说明

本面试题集锦旨在为即将参加Java相关职位面试的求职者提供一个全面的复习指南。通过精心挑选和编排的题目,帮助求职者系统地回顾和巩固所学知识,提升面试应对能力。

每一道题目都经过深思熟虑,旨在模拟真实面试场景中的问题,既考察了基础知识的掌握程度,也挑战了应聘者的实际应用能力和创新思维。我们希望通过这些题目,能够激发求职者的思考,帮助他们在面试中展现出最佳的自己。

无论你是初出茅庐的应届生,还是经验丰富的职场老手,本面试题集锦都将是你备战Java面试的宝贵资源。我们期待每一位求职者都能通过这份指南,找到适合自己的职位,开启职业生涯的新篇章。

并且这个文章一直在添加、随时更新,希望可以和你一起进步。

祝你面试顺利,前程似锦!

一、封装 继承 多态

1.封装

2.继承

3.多态

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(); // 输出 "吃饭"
    }
}

形成多态的三个条件:

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

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

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各有什么区别

四、泛型的概念和作用

泛型可以把类型当作参数一样传递,使得像一些集合类可以明确存储的对象类型,不用显示地强制转化(在没泛型之前只能是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 (返回数据)。

总结

到此这篇关于java常见面试题及答案的文章就介绍到这了,更多相关java常见面试题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文