Java面试题-基础

本文深入探讨了面向对象的四大特征:抽象、封装、继承和多态,并通过实例解释了这些概念。接着,讲解了final、finally和finalize的区别,以及int与Integer在Java中的差异。此外,对比了重载和重写,抽象类与接口的异同,以及反射的用途和实现。同时,介绍了自定义注解的应用场景,HTTP请求GET和POST的区别,session与cookie的差异,以及session在分布式处理中的解决方案。最后,阐述了MVC设计思想以及equals和==的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 面向对象的特征

面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段的产物。

面向对象的4大特征:抽象、封装、继承、多态

  • 抽象:是对现实世界理解和抽象,将一类对象的共同特征总结抽取,只关注对象的属性、行为。

    比如“”,这一对象,如何抽象呢?

    ​ 属性:姓名、性别、年龄等等。

    ​ 行为:行走、跑步、吃饭等等。

    那么我们就可以将现实世界中的“”,抽象为一个具有name、sex、age属性、walk()、run()、eat()行为的human对象。

  • 封装:是将具体细节隐藏,只提供最简单的访问接口。

    还是以“”举例,“”的减肥行为,需要“管住嘴,迈开腿”,意思就是控制饮食,跑步,具体如何控制饮食,如何跑步,快跑慢跑,我们将控制饮食封装在eatLess()方法内,跑步封装在run()。那么只需调用eatLess()和run(),即可完成减肥行为。这时,将减肥行为封装为loseWeight()方法,当其他人需要减肥时,只需调用loseWeight()方法,隐藏了内部具体操作。

  • 继承:是子类可以直接使用父类的部分数据和方法

    还是以“”举例,上面抽象的时候,将“人”抽象为一个具有name、sex、age属性、walk()、run()、eat()行为的human对象。

    “人”可以分为“成年人”、“未成年人”,那么“成年人”、“未成年人”就可以继承“人”的属性和行为,并增加相对应的字段。

    “成年人” extend “人”:具有“人”的所有属性和行为,同时可以新增属性:工作。

    “未成年人” extend “人”:具有”人“的所有属性和行为,同时可以新增属性:年级。

  • 多态:同一类的对象调用相同方法可以表现出不同的行为,它的前提是封装形成独立体,独立体之间存在继承关系,从而产生多态机制。多态是同一个行为具有多个不同表现形式或形态的能力。。

    还是以“”举例,“成年人”、“未成年人”继承了“人”,可以在继承的类中,重写父类方法。如在继承的类实现不同的eat(),“成年人”的eat()为2份,“未成年人”的eat()为1份,虽然二者都是eat()行为,但二者的eat()行为是不同的。

2. final finally finalize的区别

  • final:关键字,用来修饰类的属性、方法的参数、方法、类

    • 修饰类的属性:属性不可变。
    • 修饰方法的参数:属性不可变。
    • 修饰方法:方法不可被覆盖。
    • 修饰:类不可被继承
  • finally:关键字,与try{}catch代码块搭配使用,如论try是否捕获异常,finally始终会被执行到。finally在代码块return前执行。

  • finalize:方法,是Object类的方法,目的是为了清理对象所占资源。在垃圾回收时调用被回收对象的finalize()

    更详细内容:final、finally和finallize的区别

3. int和Integer的区别

int:Java八大基本数据类型的一种。默认值0。

Integer:int的包装类,必须实例化后才能使用。默认值null。

这里涉及到“自动装箱、自动拆箱”的概念。

它是由Java提供的“语法糖”,保证不同的写法在运行时等价。

自动拆箱:自动将包装类对应的基本类型的值返回出来。发生在:包装类给基础类赋值、传承、比较、运算

自动装箱:自动将基本类型转换为对应的包装类。**装箱涉及缓存问题,如果值在缓存中,则取缓存中的值,不会新建对象。**发生在:基础类给包装类赋值、传承

更详细内容:java int和Integer的区别

4. 重载和重写的区别

  • 重载:类中,方法名字相同,参数不同,返回类型可以相同、可以不同。最常见的是构造器的重载

  • 重写:子类重写父类方法。子类对父类的允许访问的方法的实现过程进行重新编写,返回值和行参都不能改变。

更详细内容:重载和重写的区别

5. 抽象类和接口的区别

  • 抽象类:abstract修饰。为了继承而存在。

    • 不能被实例化,只能被继承
    • 不一定含有抽象方法,包含抽象方法的一定是抽象类
    • 抽象方法修饰符只能为:publicprotected
    • 子类继承抽象类,子类必须实现抽象类的抽象方法,否则子类必须也为抽象类
    • Java中仅支持单一继承,不支持多继承。
  • 接口:interface修饰。供外部调用,是对行为的抽象

    • 变量隐式定义为:public static final,方法隐式定义为:public abstract
    • 接口支持继承多个接口
    • 类可以实现多个接口

    更详细内容:抽象类和接口异同点的区别

6. 反射的用途及实现

  • 用途:通过反射机制,运行期间获取对象的类型信息。实现动态获取(运行时获取对象的属性和方法)、动态调用(运行时调用对象的方法)
  • 实现:3种获取对象反射的反射类
    • 对象.getClass()
    • Class.forName(类路径)
    • 类名.class

更详细内容:Java反射

7. 自定义注解的场景及实现

Java语言中的类、方法、变量、参数和包等都可以被标注。和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java虚拟机可以保留标注内容,在运行时可以获取到标注内容。当然它也支持自定义Java标注。

更详细内容:Java自定义注解及使用场景

8. HTTP请求GET和POST的区别

HTTP:超文本传输协议(HTTP),客户端-服务器之间的请求-应答协议。

GET:从指定资源请求数据。

POST:向指定资源提交被处理的数据。

区别

一、URL

  1. GET请求参数附在URL后,以?分割URL参数,多个参数使用&分割。URL编码采用ASCII编码。
  2. POST请求参数在HTTP请求包的包体中,URL不可见。

二、传输数据大小限制

  1. GET请求是对URL添加参数,对于特定的浏览器和服务器会对URL的长度有限制
  2. POST请求参数在HTTP请求包的包体中,一般不会收到浏览器限制,但可能收到服务器的限制

三、安全性

  1. GET请求URL会暴露数据,浏览器缓存可能暴露重要数据。同时可能会有“跨站脚本攻击”

9. session和cookie的区别

先了解session和cookie为何物

session和cookie都是一种会话控制技术,存储会话信息的技术。类似于现实世界中的“钥匙”,钥匙控制房间的关联,人只有通过正确的钥匙才能进入正确的房间。

为何需要Session和Cookie这样的钥匙

HTTP协议是一种无状态的协议。相同两次请求,服务器无法判定请求和之前请求的关系。那么试想下,当登录一个网站后,在网站进行其他操作,服务器如何才能鉴别该操作是登录后的操作还是未登录的操作呢?这时候使用SessionCookie技术,就能够让服务器鉴别出此行为。

Session技术

Session技术是在服务端创建sessionId的空间进行存储会话信息,通过该存储信息鉴别请求。(Session存活时间较短,大部分为30分钟内)

1.客户端发起请求建立连接

2.服务端创建sessionId对应存储信息,相应数据返回sessionId给客户端

3.客户端存储该sessionId,在往后的请求中携带该sessionId。在sessionId失效后,请求将会被拦截,以确保房间不会被外人进入

Cookie技术

Cookie技术是在客户端存储会话信息,通过该存储信息鉴别请求。(一般关闭浏览器,清除缓存Cookie数据清空)

1.客户端发起HTTP请求

2.服务端创建Cookie指令,相应客户端

3.客户端创建Cookie并保存数据,在往后的请求中携带该Cookie

Session与Cookie区别

1.存储数据位置不同:Session存储在服务器,Cookie存储在客户端。

2.对服务器的压力不同:由于存储位置的不同,在高并发下,Session导致服务器压力大。

3.安全性不同:Session存储在服务器,不容易被窃取。Cookie存储在客户端,容易被窃取并产生跨站攻击。

4.存储数据大小不同:Session存储在服务器,根据服务器硬盘限制;Cookie存储在客户端,文本形式(小于4KB)。

10. session分布式处理

如上,SessionId在单机版的服务器上是不会有问题的。但是在分布式情况下,多台服务器间如何解决Sesssion一致性的问题?

  • 方案1:Session粘性

    简单来说就是将请求锁定到一台服务器上。

    具体实现:利用Nginx反向代理,代理多台服务器,采用ip_hash的负载策略,将客户端和服务器进行绑定。这样就不存在Session不一致问题。

    缺点:**ip_hash无法保证后端负载均衡!!!**一旦服务器故障,Session会丢失。

  • 方案2:服务器Session复制

    将服务器的Session发生改变的节点广播给其他节点,实现复制效果,以此保证不同服务器Session同步。

    缺点:广播会占用一定网络,一旦Session需要广播的数据量大,会造成网络堵塞,影响整体性能。

  • 方案3:Session集中管理

    将所有服务器的Session统一管理,如redis进行管理Session。

  • 更多方案

    https://www.cnblogs.com/fengyun2050/p/15753966.html

11. MVC设计思想

什么是MVC

MVC:M-Model模型、V-View-视图、C-Controller-控制器。是程序的架构模式的一种。将程序的输入、处理、输出按照M-C-V进行分层设计。

  • Model模型:核心层,程序需要的数据或信息。
  • Controller控制器:控制层,根据View视图层的输入,选取Model模型层的模型,进行相应的处理。
  • View视图:提供输入以及展现Controller处理结果。

这三层是紧密联系,却又相互独立,达到了软件开发中的高内聚,低耦合的设计理念。

可参考阮一峰的 谈谈MVC模式:http://www.ruanyifeng.com/blog/2007/11/mvc.html

12. equals和==的区别

​ 两者都是实现比较功能,但equals是方法,==是运算符。

​ 具体区别:

  • equals
    • 类没有重写Object.equals()方法:比较对象的内存地址,等价于使用 ==进行比较
    • 类重写Object.equals()方法:常用的String.equals比较的是对象的值
  • ==
    • 基本数据类型:比较对象的值
    • 引用数据类型:比较对象的内存地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值