学习 Java 几个月了,最近在看面试题。
看着那些拷问灵魂的问题,一问接着一问,不知不觉之间又掉了几根头发……
我想,不如来个刺激的。索性将所有的面试题,分类整理一下。无非就是各种定义、作用、区别、原理。
套用最近比较火的一个梗,小朋友你是否有许多问号?
各种“什么是?”
说起“什么是”,想起一个非常经典的笑话:
面试官:熟悉哪种语言
应聘者:Java。
面试官:知道什么叫类么
应聘者:我这人实在,工作努力,不知道什么叫累
面试官:知道什么是包?
应聘者:我这人实在, 平常不带包, 也不用公司准备了
面试官:知道什么是接口吗?
应聘者:我这个人工作认真。从来不找借口偷懒
面试官:知道什么是继承么
应聘者:我是父母都是普通人,没什么可以继承的
面试官:知道什么叫对象么?
应聘者:知道,不过我工作努力,上进心强,暂时还没有打算找对象。
面试官:知道多态么?
应聘者:知道,我很保守的。我认为让心爱的女人为了自已一时的快乐去堕胎是不道德的行为!
请问这和Java有什么关系。
Java 面向对象
什么是对象?什么是类?
- 对象:是对客观世界中实体的抽象。对象通过属性和方法描述实体的状态的行为。
- 类:是具有相同属性和方法的多个对象的抽象。类可以看做是对象的模板。
什么是抽象?什么是封装?什么是继承?成么是多态?
- 抽象:将实体的状态和行为,抽象为属性和方法。
- 封装:把实现细节隐藏起来,对外仅提供特定功能的访问。
- 继承:子类继承父类,就具有了父类的属性和方法。子类还可以对父类方法进行重写,以及添加新的属性和方法。
- 继承可以提高代码的复用性。
- 继承是运行时多态的前提。
- 多态:多态是指对不同的对象调用相同的方法,会有不同的响应。广义的多态分为编译时多态和运行时多态。
- 编译时多态:编译时多态是通过方法的重载实现的,在编译期进行方法的静态绑定。
- 运行时多态:运行时多态是通过方法的重写实现的,在运行期进行方法的动态绑定。
- 运行时多态的三个必要条件:
- 继承:子类继承父类
- 重写:子类重写父类方法
- 向上造型:父类引用指向子类对象
- 即便子类重写了父类的方法。此时调用的方法,是父类的方法,
- 若想调用子类重写后的方法,就需要用到向下转型。
什么是向上造型?什么是向下转型?
首先明确一点,子类对象可以直接赋值给父类引用。而父类对象不可以直接赋值给子类引用。 这点在逻辑上也很好理解:鸟类是动物,但动物不一定是鸟类。
-
向上造型,就是把子类对象赋值给父类引用,把子类对象当做父类对象来使用。
-
向下转型,就是把子类对象的父类引用,通过类型强转,重新转换为子类类型,赋值给子类的引用。
什么是静态变量?什么是实例变量?
- 被 static 修饰的变量。在类加载的时候,就会为静态变量分配一块儿内存空间。静态变量优先于实例对象而存在,只能被静态方法或静态块访问,不能被实例方法访问。
- 实例变量从属于某个具体实示例对象,不同对象的实例变量一般不同。
什么是重载?什么是重写?
- 重载:一个类中有多个方法名相同,参数列表不同的方法。
- 重写:发生在子父类中,是指子类对父类的方法进行重新实现。方法名和参数列表都必须相同。
什么是接口?什么是抽象类?
- 接口是抽象方法的集合,通常用来提供一种统一的功能。
- 抽象类是用 abstract 关键字修饰的类,跟一个普通的类没有本质区别,只是说抽象类他可以在里面定义抽象方法。
什么是内部类?什么是嵌套类?
内部类(InnerClass),定义在类里面的类,称为内部类。
根据官方的说法,首先有一个嵌套类(NestClass)的概念。嵌套类就是类里面嵌套一个类。嵌套类分为静态嵌套类和非静态嵌套类。静态嵌套类完全可以独立存在,只是借外部类的壳儿用一下。非静态嵌套类就是俗称的内部类,必须依附于外部类的存在而存在。
所以广义的内部类分为四种:
- 静态嵌套类
- 成员内部类
- 局部内部类
- 匿名内部类
什么是静态代码块儿?
用 static 修饰的代码块,类加载的时候执行一次,优于其他函数执行。静态代码块,就是用来给类初始化的。
什么是 Lambda 表达式?
Lambda 表达式,就是匿名函数,有些语言中也叫闭包。
它体现了 Java 中“函数是一等公民”的思想。函数也是有类型的,可以作为变量使用,作为参数传入,作为返回值返回。
Java SE
什么是序列化?什么是反序列化?
- 序列化是指,将内存中的 Java 对象转换为二进制字节存到硬盘上的过程。
- 反序列化是指,从硬盘上读取二进制字节,转换为内存中对象的过程。
什么是队列?什么是栈?
- 队列:是一种受限的线性表。它只允许在表的前端执行删除操作,在表的后端执行插入操作。执行删除操作的一端称为队列的头,执行插入操作的称为队尾。采用先入先出的原则。有一个形象的例子就是,买饭排队。
- 栈:也是一种受限的线性表,它只允许在表的一端进行插入和删除操作。这一端被称为栈顶。另一端叫栈底。插入操作,被称为进栈、入栈、压栈。删除操作叫出栈、退栈、弹栈。有一个形象的例子就是,垒砖块儿。
什么是 GC ?
Garbage Collection,垃圾回收。Java 提供了垃圾自动回收机制,定期清除那些已经没有引用的对象所占的内存。提高了程序的安全性,也省去了程序员的麻烦。
什么是反射?
反射:一种机制,可以在程序运行的时候,动态地获取程序的信息,修改自己的行为。具体表现为:
- 在运行时判断任意一个对象所属的类型,解析类的内部结构。
- 动态加载类型、创建对象。
- 动态访问对象的属性和方法。甚至是私有属性。
什么是进程?什么是线程?
- 进程是一个已经运行的程序单位。
- 线程是进程中的一个顺序执行流程,是操作系统能够调度的最小单位。
什么是 TCP
TCP transmission Control Protocol, 传输控制协议。
- 是面向连接的可靠数据传输协议,TCP会确保数据可靠地传输到对方。
- 建立连接---数据传输---关闭连接
- HTTP的底层采用了 TCP 协议
- Java 的 Socket 和 ServerSocket 封装了 TCP 通讯过程。
什么是节点流?什么是过滤流?
- 节点流:有明确的数据源,读取和写出的是基本的字节。
- 过滤流:依赖于其他流,不能单独使用。并且头提供了高级功能,使用起来更加方便。
前端和数据库
HTML 是什么?
Hyper Text Markup Language,超文本标记语言。创建网页,添加内容。
CSS 是什么?
Cascading Style Sheets,层叠样式表。控制网页的样式和布局。
JS 是什么?
JavaScript, 一种脚本语言,为网页添加行为和动态效果。
什么是 BOM? 什么是 DOM?
JavaScript 由三部分组成, ECMAScript, BOM, DOM.
- ECMAScript 是语言规范,描述了 JS 的语法和基本对象。
- DOM 是文档对象模型,处理网页内容,是 W3C 的标准。
- BOM 是浏览器对象模型,与浏览器进行交互的接口。如:菜单栏,地址栏,前进后退按钮,滚动条,右键菜单,窗口宽高等。
BOM 的 Window 对象是一个全局对象。包含了 document、location、navigator、screen、history、frames 等。其中 document 是 DOM 的根节点。
什么是 SQL?
Structured Query Language,结构化查询语言。用来操作关系型数据库的语言。 包括 DDL、DML、DQL、DCL。
数据库中事务是什么?
数据库中事务(Transaction),是指作为单个逻辑单元存在的一系列数据操作,这写操作要么全部执行,要么一个都不执行。
什么是数据库中索引?
索引是数据库表中用来排序的结构,可以通过索引预先排好顺序,方便检索数据。常见的 index.
什么是主键?
主键是确定一条数据的唯一标识。保证数据的完整性。
什么是外键?
表的外键,是另一张表的主键。外键用来与另一张表建立联系。
什么是约束?
约束是对表字段数据的一种限制。
Java EE
什么是 JDBC?
Java Date Base Connectivity, Java 数据库连接,是 Java 提供的一套,连接数据库的规范。
什么是 Servlet?
Servlet 是运行在 Web 服务器上的小服务程序,是用来处理业务的,可以动态地生成 Web 内容。servlet 没有 main方法,不能独立运行。必须放在 servlet 容器中。
什么是 Servlet容器?
Servlet容器,从字面上理解就是 Servlet 的容器。容器里面存放各种 Servlet。容器是 Web 服务器的一部分,他可以接收客户端发来的请求,然后根据请求, 调用 servlet 的 service() 方法,进行业务处理。处理完业务之后向客户端响应数据。
什么是 Tomcat?
Tomcat是一个免费开源的 Servlet 容器。
什么是 JSP?
JavaServerPages 是 Sun 公司主导简历的一套动态网页技术规范。
什么是隐含对象?
隐含对象又称内置对象,是指不加声明就可以在 JSP 脚本页面中使用的对象。
框架
什么是 Java Bean?
实际开发中,一套框架会用到不同的组件。 对于一些共有类,程序中各个组件都会用到。 为了使得这些类在各个组件之间兼容使用,各个组件约定了一套规范。
这种规范,一般是:
- 属性用 private 修饰
- 提供共有的 setter getter 方法。
- 提供默认的构造方法
- 实现 Serializable 接口
满足这种规范的类就叫 Java Bean。
什么是 Spring?
Spring 是 Java 平台的一个开源的全栈应用程序框架和控制反转容器实现。具有低耦合性和高扩展性。
什么是控制反转? 什么是依赖注入?
- 控制反转(Ioc):一种解耦的思想。将对象之间的依赖关系,交给容器来管理。
- 依赖注入(DI):一种设计模式,实现控制反转的方式之一。先解释一下依赖。A 类里有 B 类的实例。就称A类B类有一个依赖。A 类通过外部传入一个 B类的实例,而不是A 类中自己实例化一个 B类。这就叫依赖注入。依赖注入有多种方式。
什么是 MVC?
MVC 软件架构模式,按照业务逻辑、数据、界面显示将代码进行分离。
- M Model 模型:模型处理程序的逻辑。模型还用来存储数据。
- V View 视图:处理显示的部分,视图中显示的内容源自于模型中的数据。
- C Controller 控制器:Controller 在中间,一端连着视图,处理用户输入,另一端连着模型,向模型发送数据。
什么是 SpringMVC ?
Spring MVC 是 Spring 的一个子项目,是实现了 MVC 架构的框架。
什么是 SpringBoot ?
SpringBoot 在 SpringMVC 的基础上,对第三方技术进行了整合,可以自动配置默认的依赖,不需要 xml 等配置文件,还提高了安全性。 就是方便我们快速构建项目的。是一个快速开发的工具包。 可以这样理解:
SpringBoot extends SpringMVC extends Spring
什么是 MyBatis?
Mybatis 是一个 Java 持久化框架,它通过 XML 配置文件,把对象和 SQL 语句关联起来。
什么是 Ajax?
Asychronous JavaScrpt and XML(异步的JavaScript 和 XML)。 是一种改善用户体验的技术,利用 ajax 对象向服务器发送请求,浏览器返回一些关键数据,浏览器将这些数据呈现在页面上。 虽然 Ajax 中的 x 代表的是 XML,但是由于 json 相较于 XML 更加轻量。 JSON 的使用更为普遍。