Java软件开发常见面试题及答案.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 软件 开发 常见 试题 答案
- 资源描述:
-
Java软件开发常见面试题及答案 资料仅供参考 Java软件开发常见面试题及答案 时间: -10-14 14:32来源:未知 作者:os 点击: 101 次 1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java 虚拟机是一个能够执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。 Java 被设计成允许应用程序能够运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。 Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其它特性。 2.JDK和JRE的区别是什么? JDK: java开发工具包,包含了JRE、编译器和其它工具(如:javaDOc、java调试器) JRE: java运行环境,包含java虚拟机和java程序所需的核心类库。 如果只是想跑java程序,那么只需安装JRE,如果要写java程序而且运行,那就需要JDK了。 3."static"关键字是什么意思?Java中是否能够覆盖一个private或者是static的方法? 如果一个类的变量或者方法前面有static修饰,那么表明这个方法或者变量属于这个类,也就是说能够在不创立对象的情况下直接使用 当父类的方法被private修饰时,表明该方法为父类私有,对其它任何类都是不可见的,因此如果子类定了一个与父类一样的方法,这对于子类来说相当于是一个新的私有方法,且如果要进行向上转型,然后去调用该“覆盖方法”,会产生编译错误 class Parent { private fun() { ... } } class Child extends Parent { private fun() { ... } } class Test { public static void main(String[] args) { Parent c = new Child(); c.fun(); //编译出错 } } static方法时编译时静态绑定的,属于类,而覆盖是运行时动态绑定的(动态绑定的多态),因此不能覆盖. 4.Java支持的基本数据类型有哪些?什么是自动拆装箱? java支持的基本数据类型有以下9种:byte,shot,int,long,float,double,char,boolean,void. 自动拆装箱是java从jdk1.5引用,目的是将原始类型自动的装换为相对应的对象,也能够逆向进行,即拆箱。这也体现java中一切皆对象的宗旨。 所谓自动装箱就是将原始类型自动的转换为对应的对象,而拆箱就是将对象类型转换为基本类型。java中的自动拆装箱一般发生在变量赋值的过程中,如: Integer object = 3; //自动装箱 int o = object; //拆箱 在java中,应该注意自动拆装箱,因为有时可能因为java自动装箱机制,而导致创立了许多对象,对于内存小的平台会造成压力。 5. 覆盖和重载是什么? 覆盖也叫重写,发生在子类与父类之间,表示子类中的方法能够与父类中的某个方法的名称和参数完全相同,经过子类创立的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。 重载是指在一个类中,能够有多个相同名称的方法,可是她们的参数列表的个数或类型不同,当调用该方法时,根据传递的参数类型调用对应参数列表的方法。当参数列表相同但返回值不同时,将会出现编译错误,这并不是重载,因为jvm无法根据返回值类型来判断应该调用哪个方法。 6.Java支持多继承么?如果不支持,如何实现? 在java中是单继承的,也就是说一个类只能继承一个父类。 java中实现多继承有两种方式,一是接口,而是内部类. //实现多个接口 如果两个接口的变量相同 那么在调用该变量的时候 编译出错 interface interface1 { static String field = "dd"; public void fun1(); } interface interface2 { static String field = "dddd"; public void fun2(); } class child implements interface1,interface2 { static String field = "dddd"; @Override public void fun2() { } @Override public void fun1() { } } //内部类 间接多继承 class Child { class Father { private void strong() { System.out.println("父类"); } } class Mother { public void getCute() { System.out.println("母亲"); } } public void getStrong() { Father f = new Father(); f.strong(); } public void getCute() { Mother m = new Mother(); m.getCute(); } } 7.什么是值传递和引用传递?java中是值传递还是引用传递,还是都有? 值传递 就是在方法调用的时候,实参是将自己的一份拷贝赋给形参,在方法内,对该参数值的修改不影响原来实参,常见的例子就是刚开始学习c语言的时候那个交换方法的例子了。 引用传递 是在方法调用的时候,实参将自己的地址传递给形参,此时方法内对该参数值的改变,就是对该实参的实际操作。 在java中只有一种传递方式,那就是值传递.可能比较让人迷惑的就是java中的对象传递时,对形参的改变依然会影响到该对象的内容。 下面这个例子来说明java中是值传递. public class Test { public static void main(String[] args) { StringBuffer sb = new StringBuffer("hello "); getString(sb); System.out.println(sb); } public static void getString(StringBuffer s) { //s = new StringBuffer("ha"); s.append("world"); } } 在上面这个例子中,当前输出结果为:hello world。这并没有什么问题,可能就是大家平常所理解的引用传递,那么当然会改变StringBuffer的内容。可是如果把上面的注释去掉,那么就会输出:hello.此时sb的值并没有变成ha hello. 假如说是引用传递的话,那么形参的s也就是sb的地址,此时在方法里new StringBuffer(),并将该对象赋给s,也就是说s现在指向了这个新创立的对象.按照引用传递的说法,此时对s的改变就是对sb的操作,也就是说sb应该也指向新创立的对象,那么输出的结果应该为ha world.但实际上输出的仅是hello.这说明sb指向的还是原来的对象,而形参s指向的才是创立的对象,这也就验证了java中的对象传递也是值传递。 8.接口和抽象类的区别是什么? 不同点在于: 接口中所有的方法隐含的都是抽象的。而抽象类则能够同时包含抽象和非抽象的方法。 类能够实现很多个接口,可是只能继承一个抽象类 类如果要实现一个接口,它必须要实现接口声明的所有方法。可是,类能够不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。 抽象类能够在不提供接口方法实现的情况下实现接口。 Java 接口中声明的变量默认都是 final 的。抽象类能够包含非 final 的变量。 Java 接口中的成员函数默认是 public 的。抽象类的成员函数能够是 private,protected 或者是 public 。 接口是绝对抽象的,不能够被实例化(java 8已支持在接口中实现默认的方法)。抽象类也不能够被实例化,可是,如果它包含 main 方法的话是能够被调用的。 9.构造器(constructor)是否可被重写(override)? 构造方法是不能被子类重写的,可是构造方法能够重载,也就是说一个类能够有多个构造方法。 10.Math.round(11.5) 等于多少? Math.round(-11.5)等于多少? Math.round(11.5)==12 Math.round(-11.5)==-11 round 方法返回与参数 最接近的长整数,参数加 1/2 后求其 floor. 11. String, StringBuffer StringBuilder的区别。 tring 的长度是不可变的; StringBuffer的长度是可变的,如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用 StringBuffer,如果最后需要 >String,那么使用 StringBuffer 的 toString() 方法;线程安全; StringBuilder 是从 JDK 5 开始,为StringBuffer该类补充了一个单个线程使用的等价类;一般应该优先使用 StringBuilder 类,因>为它支持所有相同的操作,但由于它不执行同步,因此速度更快。 使用字符串的时候要特别小心,如果对一个字符串要经常改变的话,就一定不要用String,否则会创立许多无用的对象出来. 来看一下比较 String s = "hello"+"world"+"i love you"; StringBuffer Sb = new StringBuilder("hello").append("world").append("i love you"); 这个时候s有多个字符串进行拼接,按理来说会有多个对象产生,可是jvm会对此进行一个优化,也就是说只创立了一个对象,此时它的执行速度要比StringBuffer拼接快.再看下面这个: String s2 = "hello"; String s3 = "world"; String s4 = "i love you"; String s1 = s2 + s3 + s4; 上面这种情况,就会多创立出来三个对象,造成了内存空间的浪费. 12.JVM内存分哪几个区,每个区的作用是什么? java虚拟机主要分为以下一个区: 方法区: 有时候也成为永久代,在该区内很少发生垃圾回收,可是并不代表不发生GC,在这里进行的GC主要是对方法区里的常量池和对类型的卸载 方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后的代码等数据。 该区域是被线程共享的。 方法区里有一个运行时常量池,用于存放静态编译产生的字面量和符号引用。该常量池具有动态性,也就是说常量并不一定是编译时确定,运行时生成的常量也会存在这个常量池中。 虚拟机栈: 虚拟机栈也就是我们平常所称的栈内存,它为java方法服务,每个方法在执行的时候都会创立一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。 虚拟机栈是线程私有的,它的生命周期与线程相同。 局部变量表里存储的是基本数据类型、returnAddress类型(指向一条字节码指令的地址)和对象引用,这个对象引用有可能是指向对象起始地址的一个指针,也有可能是代表对象的句柄或者与对象相关联的位置。局部变量所需的内存空间在编译器间确定 4.操作数栈的作用主要用来存储运算结果以及运算的操作数,它不同于局部变量表经过索引来访问,而是压栈和出栈的方式 5.每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接.动态链接就是将常量池中的符号引用在运行期转化为直接引用。 本地方法栈 本地方法栈和虚拟机栈类似,只不过本地方法栈为Native方法服务。 堆 java堆是所有线程所共享的一块内存,在虚拟机启动时创立,几乎所有的对象实例都在这里创立,因此该区域经常发生垃圾回收操作。 程序计数器 内存空间小,字节码解释器工作时经过改变这个计数值能够选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理和线程恢复等功能都需要依赖这个计数器完成。该内存区域是唯一一个java虚拟机规范没有规定任何OOM情况的区域。 13.如和判断一个对象是否存活?(或者GC对象的判定方法) 判断一个对象是否存活有两种方法: 引用计数法 所谓引用计数法就是给每一个对象设置一个引用计数器,每当有一个地方引用这个对象时,就将计数器加一,引用失效时,计数器就减一。当一个对象的引用计数器为零时,说明此对象没有被引用,也就是“死对象”,将会被垃圾回收. 引用计数法有一个缺陷就是无法解决循环引用问题,也就是说当对象A引用对象B,对象B又引用者对象A,那么此时A,B对象的引用计数器都不为零,也就造成无法完成垃圾回收,因此主流的虚拟机都没有采用这种算法。 2.可达性算法(引用链法) 该算法的思想是:从一个被称为GC Roots的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。 在java中能够作为GC Roots的对象有以下几种: 虚拟机栈中引用的对象 方法区类静态属性引用的对象 方法区常量池引用的对象 本地方法栈JNI引用的对象 虽然这些算法能够判定一个对象是否能被回收,可是当满足上述条件时,一个对象比不一定会被回收。当一个对象不可达GC Root时,这个对象并 不会立马被回收,而是出于一个死缓的阶段,若要被真正的回收需要经历两次标记 如果对象在可达性分析中没有与GC Root的引用链,那么此时就会被第一次标记而且进行一次筛选,筛选的条件是是否有必要执行finalize()方法。当对象没有覆盖finalize()方法或者已被虚拟机调用过,那么就认为是没必要的。 如果该对象有必要执行finalize()方法,那么这个对象将会放在一个称为F-Queue的对队列中,虚拟机会触发一个Finalize()线程去执行,此线程是低优先级的,而且虚拟机不会承诺一直等待它运行完,这是因为如果finalize()执行缓慢或者发生了死锁,那么就会造成F-Queue队列一直等待,造成了内存回收系统的崩溃。GC对处于F-Queue中的对象进行第二次被标记,这时,该对象将被移除"即将回收"集合,等待回收。 14.简述java垃圾回收机制? 在java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。 15.java中垃圾收集的方法有哪些? 标记-清除: 这是垃圾收集算法中最基础的,根据名字就能够知道,它的思想就是标记哪些要被回收的对象,然后统一回收。这种方法很简单,可是会有两个主要问题:1.效率不高,标记和清除的效率都很低;2.会产生大量不连续的内存碎片,导致以后程序在分配较大的对象时,由于没有充分的连续内存而提前触发一次GC动作。 复制算法: 为了解决效率问题,复制算法将可用内存按容量划分为相等的两部分,然后每次只使用其中的一块,当一块内存用完时,就将还存活的对象复制到第二块内存上,然后一次性清楚完第一块内存,再将第二块上的对象复制到第一块。可是这种方式,内存的代价太高,每次基本上都要浪费一般的内存。 于是将该算法进行了改进,内存区域不再是按照1:1去划分,而是将内存划分为8:1:1三部分,较大那份内存交Eden区,其余是两块较小的内存区叫Survior区。每次都会优先使用Eden区,若Eden区满,就将对象复制到第二块内存区上,然后清除Eden区,如果此时存活的对象太多,以至于Survivor不够时,会将这些对象经过分配担保机制复制到老年代中。(java堆又分为新生代和老年代) 标记-整理 该算法主要是为了解决标记-清除,产生大量内存碎片的问题;当对象存活率较高时,也解决了复制算法的效率问题。它的不同之处就是在清除对象的时候现将可回收对象移动到一端,然后清除掉端边界以外的对象,这样就不会产生内存碎片了。 分代收集 现在的虚拟机垃圾收集大多采用这种方式,它根据对象的生存周期,将堆分为新生代和老年代。在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那么这时就采用复制算法。老年代里的对象存活率较高,没有额外的空间进行分配担保,因此能够使用标记-整理 或者 标记-清除。上一篇:如何实现Java多线程 下一篇:没有了展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




Java软件开发常见面试题及答案.doc



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/665182.html