Java面试题总结
来源:互联网 发布:d3.js 可视化介绍 编辑:程序博客网 时间:2024/06/06 11:49
1.接口和抽象类的区别
①抽象类里可以有构造方法,而接口内不能有构造方法。
②抽象类中可以有普通成员变量,而接口中不能有普通成员变量。
③抽象类中可以包含非抽象的普通方法,而接口中所有的方法必须是抽象的,不能有非抽象的普通方法。
④抽象类中的抽象方法的访问类型可以是public ,protected和默认类型,但接口中的抽象方法只有public和默认类型。
⑤ 抽象类中可以包含静态方法,接口内不能包含静态方法。
⑥抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static类型,并且默认为public static类型。
⑦一个类可以实现多个接口,但只能继承一个抽象类。
⑧接口更多的是在系统框架设计方法发挥作用,主要定义模块之间的通信,而抽象类在代码实现方面发挥作用,可以实现代码的重用。
2.Java虚拟机的运行时数据区有几块?线程私有和线程共享区域有哪些?
①程序计数器:线程私有,当前县城执行的字节码的行号指示器。
②虚拟机栈:线程私有,存放基本数据类型、对象引用和returnAddress类型。
③本地方法栈:为虚拟机使用到的Native方法服务。
④Java堆:线程共享,存放对象的实例,也是GC回收器管理的主要区域。
⑤方法区:线程共享,存放已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
⑥运行时常量池:方法区的一部分,存放编译期生成的各种字面量和符号引用。
⑦直接内存:不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,容易引起OOM异常,NIO会调用,不受Java堆大小的限制。
3、面向对象和面向过程的区别:
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
4、Java内存模型
①Java内存模型分为主内存和工作内存两个部分,其中主内存存放变量,工作内存由每个线程创建和管理,保存被该线程使用到的变量的主内存的副本拷贝。变量从主内存复制到工作内存,顺序执行read和load操作,变量从工作内存同步到主内存的时候,顺序执行store和write操作。
对于volatile变量在各个线程的一致性:在各个线程的工作内存中,volatile存在不一致的情况,但在每次使用前都会刷新,执行引擎看不到不一致的情况,因此可以认为不存在一致性问题。
②原子性、可见性和有序性
③先行发生原则
5、Java垃圾回收机制
Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。
System.gc();
Runtime.getRuntime().gc();
上面的方法调用时用于显式通知JVM可以进行一次垃圾回收,但真正垃圾回收机制具体在什么时间点开始发生动作这同样是不可预料的,这和抢占式的线程在发生作用时的原理一样。
6、类加载器,类加载时机
类初始化的时机,有且仅有四个:
A、遇到new、getstatic、putstatic、invokestatic这四条字节码指令的时候。
B、使用java.lang.reflect进行反射调用的时候。
C、当初始化一个类的时候,发现其父类还没有初始化,那么先去初始化它的父类。
D、当虚拟机启动的时候,需要初始化main函数所在的类。
7、Java基本数据类型
boolean(1)、byte(8)、char(16)、short(16)、int(32)、float(32)、long(64)、double(64)
8、Java内存模型
①特点:原子性、可见性、有序性。
A、原子性:read、load、use、store、write,synchronized关键字保证原子性
B、可见性:synchronized、volatile、final保证可见性
C、有序性:synchronized保证有序性
9、Java反射
反射机制指的是程序在运行时能够获取自身的信息。
为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念,
静态编译:在编译时确定类型,绑定对象,即通过。
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。
一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中
它的灵活性就表现的十分明显。
作用:①首先得根据传入的类的全名来创建Class对象。 ②获得类方法的方法。③ 获得类中属性的方法。
缺点:①性能第一:反射包括了一些动态类型,所以JVM无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。我们应该避免在经常被 执行的代码或对性能要求很高的程序中使用反射。②安全限制:使用反射技术要求程序必须在一个没有安全限制的环境中运行。如果一个程序必须在有安全限制的环境中运行,如Applet。③内部暴露:由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用--代码有功能上的错误,降低可移植性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化。
10、Java引用
①假设我们在函数中写了如下这个简单的语句:
StringBuffer str= new StringBuffer("Hello world");
别看这个语句简单,其实包含了如下三个步骤:
首先,new StringBuffer("Hello world")在堆里申请了一坨内存,把创建好的StringBuffer对象放进去。其次,StringBuffer str声明了一个指针。这个指针本身是存储在栈上的(因为语句写在函数中),可以用来指向某个StringBuffer类型的对象。或者换一种说法,这个指针可以用来保存某个StringBuffer对象的地址。最后,当中这个等于号(赋值符号)把两者关联起来,也就是把刚申请的那一坨内存的地址保存成str的值,完成引用。
②final常量的问题
针对引用类型变量的final修饰符也是很多人搞混淆的地方。实际上final只是修饰指针的值(也就是限定指针保存的地址不能变)。至于该指针指向的对象,内容是否能变,那就管不着了。所以,对于如下语句:
final StringBuffer strConst = new StringBuffer();
你可以修改它指向的对象的内容,比如:
strConst.append(" ");
但是不能修改它的值,比如:
strConst = null;
③传参的问题:
例如:System.out.println(str);这个语句又是什么意思捏?这时候就两说了。
第一种理解:可以认为传进函数的是str这个指针,指针说白了就是一个地址的值,说得再白一点,就是个整数。按照这种理解,就是传值的方式。也就是说,参数传递的是指针本身,所以是传值的。
第二种理解:可以认为传进去的是StringBuffer对象,按照这种理解,就是传引用方式了。因为我们确实是把对象的地址(也就是引用)给传了进去。
11、try/catch/finally/return 作用顺序
不管有木有出现异常,finally块中代码都会执行;
当try和catch中有return时,finally仍然会执行;
finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
原文:http://blog.csdn.net/andong154564667/article/details/52243378
- java面试题总结
- java面试题总结
- java面试题总结
- java面试题总结
- java面试题总结
- java面试题总结
- java面试题总结
- Java面试题总结
- java总结面试题
- 总结java面试题
- java面试题总结
- java面试题总结
- java 面试题总结
- java 面试题总结
- java面试题总结
- Java面试题总结
- java面试题总结
- java面试题总结
- 初识正则表达式
- 用Photoshop处理和生成pdf文件
- hdu1231最大连续子序列(dp模板最大连续子序列)
- mysql startservice失败解决方法
- Git解决冲突
- Java面试题总结
- PHP memcache扩展安装 for Windows
- 【知识总结】——URI URL URN
- Secrete Master Plan HDU
- SQL 语句总结
- Eureka Server 搭建部署
- Recyclerview的简单使用
- 缓存那些事
- 详谈内存管理技术(一)