Java常考面试题总结(三)

[v_notice]本文内容来源于网络收集,内容繁杂,难免有误,如果发现错误的地方或者有任何想讨论的问题请在下面留言。[/v_notice]

在Java中,对象什么时候可以被垃圾回收?

当一个对象到GC Roots不可达时,在下一个垃圾回收周期中尝试回收该对象,如果该对象重写了finalize()方法,并在这个方法中成功自救(将自身赋予某个引用),那么这个对象不会被回收。

但如果这个对象没有重写finalize()方法或者已经执行过这个方法,也自救失败,该对象将会被回收。

JVM的永久代中会发生垃圾回收么?

垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。

如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。

这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。

请参考下Java8:从永久代到元数据区

(注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区)

Java中的两种异常类型是什么?他们有什么区别?

Java中有两种异常:受检查的(checked)异常和不受检查的(unchecked)异常。

不受检查的异常不需要在方法或者是构造函数上声明,就算方法或者是构造函数的执行可能会抛出这样的异常,并且不受检查的异常可以传播到方法或者是构造函数的外面。

相反,受检查的异常必须要用throws语句在方法或者是构造函数上声明。

这里有Java异常处理的一些小建议。

Java中Exception和Error有什么区别?

Exception和Error都是Throwable的子类。

Exception用于用户程序可以捕获的异常情况。Error定义了不期望被用户程序捕获的异常。

throw和throws有什么区别?

throw关键字用来在程序中明确的抛出异常,相反,throws语句用来表明方法不能处理的异常。

每一个方法都必须要指定哪些异常不能处理,所以方法的调用者才能够确保处理可能发生的异常,多个异常是用逗号分隔的。

异常处理完成以后,Exception对象会发生什么变化?

Exception对象会在下一个垃圾回收过程中被回收掉。

finally代码块和finalize()方法有什么区别?

无论是否抛出异常,finally代码块都会执行,它主要是用来释放应用占用的资源。

finalize()方法是Object类的一个protected方法,它是在对象被垃圾回收之前由Java虚拟机来调用的。

什么是Applet?

java applet是能够被包含在HTML页面中并且能被启用了java的客户端浏览器执行的程序。

Applet主要用来创建动态交互的web应用程序。

[v_act]java应用小程序,可以直接嵌入到网页中,并能够产生特殊的效果,applet经编译后会产生.class文件,把.class文件嵌入到html页面中,用户在链接网页时,applet便会伴随网页一起下载到用户计算机运行。
applet主要用来创建动态交互的web应用程序。 [/v_act]

解释一下Applet的生命周期

applet可以经历下面的状态:

Init:每次被载入的时候都会被初始化。

Start:开始执行applet。

Stop:结束执行applet。

Destroy:卸载applet之前,做最后的清理工作。

当applet被载入的时候会发生什么?

首先,创建applet控制类的实例,然后初始化applet,最后开始运行。

Applet和普通的Java应用程序有什么区别?

applet是运行在启用了java的浏览器中,Java应用程序是可以在浏览器之外运行的独立的Java程序。

但是,它们都需要有Java虚拟机。

进一步来说,Java应用程序需要一个有特定方法签名的main函数来开始执行。

Java applet不需要这样的函数来开始执行。

最后,Java applet一般会使用很严格的安全策略,Java应用一般使用比较宽松的安全策略。

Java applet有哪些限制条件?

主要是由于安全的原因,给applet施加了以下的限制:

applet不能够载入类库或者定义本地方法。

applet不能在宿主机上读写文件。

applet不能读取特定的系统属性。

applet不能发起网络连接,除非是跟宿主机。

applet不能够开启宿主机上其他任何的程序。

什么是不受信任的applet?

不受信任的applet是不能访问或是执行本地系统文件的Java applet,默认情况下,所有下载的applet都是不受信任的。

从网络上加载的applet和从本地文件系统加载的applet有什么区别?

当applet是从网络上加载的时候,applet是由applet类加载器载入的,它受applet安全管理器的限制。

当applet是从客户端的本地磁盘载入的时候,applet是由文件系统加载器载入的。

从文件系统载入的applet允许在客户端读文件,写文件,加载类库,并且也允许执行其他程序,但是,却通不过字节码校验。

applet类加载器是什么?它会做哪些工作?

当applet是从网络上加载的时候,它是由applet类加载器载入的。

类加载器有自己的java名称空间等级结构。

类加载器会保证来自文件系统的类有唯一的名称空间,来自网络资源的类有唯一的名称空间。

当浏览器通过网络载入applet的时候,applet的类被放置于和applet的源相关联的私有的名称空间中。

然后,那些被类加载器载入进来的类都是通过了验证器验证的。

验证器会检查类文件格式是否遵守Java语言规范,确保不会出现堆栈溢出(stack overflow)或者下溢(underflow),传递给字节码指令的参数是正确的。

applet安全管理器是什么?它会做哪些工作?

applet安全管理器是给applet施加限制条件的一种机制。

浏览器可以只有一个安全管理器。

安全管理器在启动的时候被创建,之后不能被替换覆盖或者是扩展。

什么是布局管理器?

布局管理器用来在容器中组织组件。

滚动条(Scrollbar)和滚动面板(JScrollPane)有什么区别?

Scrollbar是一个组件,不是容器。

而ScrollPane是容器。ScrollPane自己处理滚动事件。

java swing 之JScrollPane面板

在设置界面时,可能会遇到在一个较小的容器窗体中显示一个较大部分的内容,这时可以使用JScrollPane面板,JscrollPane面板是带滚动条的面板,也是一种容器,但是常用于布置单个控件,并且不可以使用布局管理器。

如果需要在JScrollPane面板中放置多个控件,需要将多个控件放置到JPanel 面板上,然后将JPanel面板作为一个整体控件添加到JScrollPane控件上。

哪些Swing的方法是线程安全的?

只有3个线程安全的方法: repaint(), revalidate(), and invalidate()。

Swing的规则是:一旦Swing组件被具现化(realized),所有可能影响或依赖于组件状态的代码都应该在事件派发线程中执行。所以有这3个线程安全的方法:repaint(),revalidate(),andinvalidate()。

[v_notice]本文内容来源于网络收集,内容繁杂,难免有误,如果发现错误的地方或者有任何想讨论的问题请在下面留言。[/v_notice]

本站所有文章均由网友分享,仅用于参考学习用,请勿直接转载,如有侵权,请联系网站客服删除相关文章。若由于商用引起版权纠纷,一切责任均由使用者承担
极客文库 » Java常考面试题总结(三)

欢迎加入「极客文库」,成为原创作者从这里开始!

立即加入 了解更多