Java面试题总结(不断更新中)

毕业季,对于程序员来说也是不错的找工作的机会,一份好的简历是打开公司大门的钥匙,但能不能进入自己理想的公司,成为其中的一员,在于面试的成败。本文将介绍一些公司面试时提出的常见的面试题,并做一些简单的回答。也为自己找新工作时,不在去对公司提出的问题去东找西找。

一、Java四大特性:抽象,封装,继承,多态。

(1)抽象:从字面意思就可以了解,象就是有点模糊的意思,还没确定好的意思。在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、 设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象,我们不能把它们实例化(拿不出一个具体的东西)所以称之为抽象。打个比方来说:我们要描述“车”,它就是一个抽象,它有质量、体积等一些共性,但又缺乏特性(不确定是什么类型的车(轿车,公交车等),它们有自己的特性),我们拿不出唯一一种能代表车的东西(因为无论是轿车还是公交车都不能代表车),可用抽象类来描述它,所以抽象类是不能够实例化的。当我们用某个类来具体描述“车”时,这个类就可以继承描述“车”的抽象类,从而知道“轿车”是一种“车”。

(2)封装: 隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别。那为什么要封装呢?1.隐藏实现细节。比如你买了一辆车,你只需要知道如何去开,并不需要去了解它的实现原理。2.安全性。比如你在一个程序中对age这个属性进行了私有化操作,并提供了对外的get与set方法,当外界使用set方法为其赋值的时候,你可以在set方法里面做判断,控制在合理范围以内(0-100岁),这样外界就无法随意的进行赋值了。3.代码复用性。比如在工具类中封装的各种方法,你可以在任意地方重复调用,而不用再每处都去实现其细节。4.分工化。封装分为属性封装,方法封装,类封装,插件封装,模块封装,系统封装等等。有利于程序的协助分工,互不干扰,方便了模块之间的相互组合与分解,也有利于代码的调试。

(3)继承:是面向对象最显著的一个特性,继承是从已有的类中派生出新的类称为子类,子类继承父类的数据属性和行为,并能根据自己的需求扩展出新的行为,提高了代码的复用性。简化理解:当两个类具有相同的特征(属性)和行为(方法)时,可以将相同的部分抽取出来放到一个类中作为父类,其它两个类继承这个父类。继承后子类自动拥有了父类的属性和方法,但特别注意的是,父类的私有属性和构造方法并不能被继承。另外子类可以写自己特有的属性和方法,目的是实现功能的扩展,子类也可以复写父类的方法即方法的重写。

(4)多态:相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。另外Java实现多态有三个必要条件:继承、重写、向上转型。继承:在多态中必须存在有继承关系的子类和父类。重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

二、重写与重载的区别(简要回答)。

当一个子类继承一父类,而子类中的方法与父类中的方法的名称,参数个数、类型都完全一致时,就称子类中的这个方法重写了父类中的方法。

对于同一个类,如果这个类里面有两个或者多个重名的方法,但是方法的参数个数、类型、顺序至少有一个不一样,这时候构成方法重载。

三、Java类加载顺序.

一个java文件从被加载到被卸载这个生命过程,总共要经历5个阶段,JVM将类加载过程分为: 
  加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载 
(1)加载 
  首先通过一个类的全限定名来获取此类的二进制字节流;其次将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;最后在java堆中生成一个代表这个类的Class对象,作为方法区这些数据的访问入口。总的来说就是查找并加载类的二进制数据。 
(2)链接: 
  验证:确保被加载类的正确性; 
  准备:为类的静态变量分配内存,并将其初始化为默认值; 
  解析:把类中的符号引用转换为直接引用; 
(3)类的初始化 
(1)类什么时候才被初始化 
  1)创建类的实例,也就是new一个对象 
  2)访问某个类或接口的静态变量,或者对该静态变量赋值 
  3)调用类的静态方法 
  4)反射(Class.forName(“com.lyj.load”)) 
  5)初始化一个类的子类(会首先初始化子类的父类) 
  6)JVM启动时标明的启动类,即文件名和类名相同的那个类 
(2)类的初始化顺序 
  1)如果这个类还没有被加载和链接,那先进行加载和链接 
  2)假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口) 
  3)加入类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句。 
  4)总的来说,初始化顺序依次是:(静态变量、静态初始化块)–>(变量、初始化块)–> 构造器;如果有父类,则顺序是:父类static方法 –> 子类static方法 –> 父类构造方法- -> 子类构造方法 .

四、访问修饰符public,private,protected,以及不写(默认)时的区别?

作用域    当前类  同包 子类 其他

public        √        √       √      √

protected   √        √       √      ×

default        √       √       ×      ×

private       √        ×      ×      ×

类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。

五、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

       是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对象的引用是永远不会改变的。java中只存在值传递,只存在值传递!!!  然而我们经常看到对于对象(数组,类,接口)的传递似乎有点像引用传递,可以改变对象中某个属性的值。但是不要被这个假象所蒙蔽,实际上这个传入函数的值是对象引用的拷贝,即传递的是引用的地址值,所以还是按值传递。

六、String 和StringBuilder、StringBuffer 的区别(简单回答)?

          三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String。原因在于:String是字符串常量,而StringBuffer与StringBuilder是字符串变量。

在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的。

七、列出一些你常见的运行时异常?

ArithmeticException(算术异常)

ClassCastException (类转换异常)

IllegalArgumentException (非法参数异常)

IndexOutOfBoundsException (下表越界异常)

NullPointerException (空指针异常)

SecurityException (安全异常)

八、final, finally, finalize 的区别?

1.final修饰符(关键字)。被final修饰的类,就意味着不能再派生出新的子类,不能作为父类而被子类继承。因此一个类不能既被abstract声明,又被final声明。将变量或方法声明为final,可以保证他们在使用的过程中不被修改。被声明为final的变量必须在声明时给出变量的初始值,而在以后的引用中只能读取。被final声明的方法也同样只能使用,不能重载。

2.inally是在异常处理时提供finally块来执行任何清除操作。不管有没有异常被抛出、捕获,finally块都会被执行。try块中的内容是在无异常时执行到结束。catch块中的内容,是在try块内容发生catch所声明的异常时,跳转到catch块中执行。finally块则是无论异常是否发生,都会执行finally块的内容,所以在代码逻辑中有需要无论发生什么都必须执行的代码,就可以放在finally块中。

3.finalize是方法名。java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者被执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。

希望各位将自己遇见的面试题评论出来,后期我会一一在这里呈现。相互学习,相互进步。

原文地址:https://www.cnblogs.com/zy-l/p/9184274.html

时间: 2024-08-03 19:36:07

Java面试题总结(不断更新中)的相关文章

阿里笔试题(2015)持续更新中

第一次做阿里笔试题,除了ACM题之外从来没有做过校招网络题呀,完全是裸考,总体感觉吧,对于我来说,感觉时间不够用,不是题不会,感觉时间紧,大脑很混乱,总结这一次的笔试题 废话不多说,直接上题和答案 平均每个人逗留时间为20分钟,那么开场前20分钟一共来了400人,且有20个人逗留时间已经到,但他们不一定出去,注意是平均时间,所有博物馆最少应该容纳500人 双向循环列表,从任何一个元素开始可以遍历全部元素 先和后面的元素相连 s->next=p->next; p->next->pre

【福利 】Java面试题最全 (中)

这部分主要是与Java Web和Web Service相关的面试题. 阅读全文 更多: java,java学习,java面试题  http://techfoxbbs.com

大数据面试题汇总(不断更新中)

结合自身面试经历,包括BAT.SF.中信等等公司所做的面试题汇总.主要包括以下几大类: 一.spark相关 1.Spark的Shuffle原理及调优? 2.hadoop和spark使用场景? 3.spark如何保证宕机迅速恢复? 4.hadoop和spark的相同点和不同点? 5.RDD持久化原理? 6.checkpoint检查点机制? 7.checkpoint和持久化机制的区别? 8.Spark Streaming和Storm有何区别?  9.RDD机制?  10.Spark streamin

java面试题 "aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)

题目:"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1) 刚开始可能对这题无从下手,现在就一步步分析 1:首先它是一个字符串,但是要对每个字符进行分析它出现的次数,那么肯定是要进行循环遍历,要进行遍历一般要么是集合,要么是数组,而在这里变成数组比较好, 2:变成数组后,我们可以用一个map集合存储字符和出现的次数也就是说key是Character,value是Integer,然后在遍历的时候拿key获取value值进行

【java基础】java基础知识,持续更新中。。。

目录 1.重写(override)与重载(overloading)的介绍与区别 ----------------------------------------------------------------------------------------------------------------------------------华丽分割线---------------------------------------------------------------------------

面试题整理(持续更新中....)

一. 方法的定义, 方法有哪些调用方式? 概念: 方法是若干语句的功能集合, 方法的定义是不能够直接使用的, 如果使用, 要在main方法中调用 格式: 修饰符(public static)返回值类型 方法名称(参数类型 参数名称, ...) { 方法体; return 返回值; } 修饰符: 现阶段的固定写法 public static 返回值类型: 也就是方法最终产生的数据结果是什么类型 方法名称: 方法的名字, 规则和变量一样, 小驼峰(首写字母小写 其余大写) 参数类型: 进入方法的数据

阿里Java面试题剖析:项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果?

面试原题 项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果? 面试官心理分析 这个问题,互联网公司必问,要是一个人连缓存都不太清楚,那确实比较尴尬. 只要问到缓存,上来第一个问题,肯定是先问问你项目哪里用了缓存?为啥要用?不用行不行?如果用了以后可能会有什么不良的后果? 这就是看看你对缓存这个东西背后有没有思考,如果你就是傻乎乎的瞎用,没法给面试官一个合理的解答,那面试官对你印象肯定不太好,觉得你平时思考太少,就知道干活儿. 面试题剖析 项目中缓存是如何使用的? 这个,需要结合

一文总结软件测试工程师面试前必背的面试题(持续更新中)

一 软件测试基础理论题 常见的测试方法有哪些? 1 从是否关心内部结构来看分为:白盒,黑盒,灰盒 黑盒测试不考虑程序内部结构和逻辑结构,主要是用来测试系统的功能是否满足需求规格说明书.一般会有一个输入值,一个输入值,和期望值做比较. 白盒测试主要应用在单元测试阶段,主要是对代码级的测试,针对程序内部逻辑结构,测试手段有:语句覆盖.判定覆盖.条件覆盖.路径覆盖.条件组合覆盖 灰盒是一种综合测试法,它将黑盒与白盒结合在一起,是基于程序运行时的外部表现又结合内部逻辑结构来设计用例,执行程序并采集路径执

Java学习笔记(持续更新中...)

1.为了继承,一般的规则是:将所有数据成员都指定为private,所有的方法指定为public 2.在继承过程中,需要先声明“新类和旧类相似”,用关键字“extend”实现.这么做,会得到基类中的所有域和方法 3.在继承关系中,如果导出类和基类有相同的方法,但你想在导出类中调用从基类继承来的方法,可以用关键字“super”来表示超类,用表达式“super.functionname()”来调用基类版本的functionname();并且,如果没有默认的基类构造器,或者想用一个带参数的基类构造器,就

Java面试题全集(中)

这部分主要是与Java Web和Web Service相关的面试题. 96.阐述Servlet和CGI的区别? 答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet. 补充:Sun Microsystems公司在1996年发布Servlet技术就是为了和CGI进行竞争,Servlet是一个特殊的Java程