开发者

java常见面试题及答案汇总

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

              开篇说明

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

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

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

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

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

              一、封装 继承 多态

              1.封装

              • 封装是什么:

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

              • 关键字:private。

                被private修饰的成员,只能在本类进行访问,针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作

                “get变量名()”方法,用于获取成员变量的值,方法用public修饰。

                “set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰。

              • this关键字

                构造方法只能调用一次,在创建对象的时候调用。

                在成员方法中:谁调用这个方法,那么this就指向那个对象。

                在构造方法中:this指向新创建的那个对象

                this 关键字主要应用:

                成员变量 成员方法、其它构造方法。

              • 封装思想

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

              • 封装原则

                将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问

                成员变量private,提供对应的getXxx()/setXxx()方法

              • 封装好处

                通过方法来控制成员变量的操作,提高了代码的安全性

                把代码用方法进行封装,提高了代码的复用性

                隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。

              2.继承

              • 继承是什么:

                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 多态性的典型例子,即子类可以覆盖父类的方法来改变行为。

              形成多态的三个条件:

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

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

              • 重载

                重载是指在同一个类中定义多个方法,它们具有相同的名字但参数列表有所不同。主要用于提供相同功能的不同实现。

                注意的是 和返回值没有关系,

                方法的签名是名字是名字和参数列表,不包括返回值。

                重载通常用于提供同一操作的不同实现,例如构造函数的重载,不同类型输入的处理等。

              • 重写

                在子类中定义一个与父类方法具有相同签名(方法名、参数列表)的方法,方法返回类型与父类一直,或者是其子类。

                且子类方法定义的访问修饰符,不能比父类更编程客栈严格。例如父类方法是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.对于 GETjs 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据)表示成功;

              对于 POST,浏览器先发送 header,服务器响应 100, 浏览器再继续发送 data编程客栈,服务器响应 200 (返回数据)。

              总结

              到此这篇关于java常见面试题及答案的文章就介绍到这了,更多相关java常见面试题内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

              0

              上一篇:

              下一篇:

              精彩评论

              暂无评论...
              验证码 换一张
              取 消

              最新开发

              开发排行榜