java 面试题1
什么是面向对象?
面向对象和面向过程的区别:
- 面向过程更注重每一个步骤以及其顺序,面向对象更注重哪些对象,他们具有哪些能力
- 面向过程比较直接,而面向对象更易于复用、扩展和维护
三大特性:
封装:内部细节隐藏 只提供对外的接口
javabean属性只能通过set方法赋值, 不能使用
ClassInstance.filed
直接赋值。
继承:子类共性的方法和属性在父类中体现出来,子类只需要做出特性的扩展即可。
多态:继承,方法重写,父类引用指向子类
JVM 虚拟机栈
java 栈 Oracle frame interpretation
每一个方法被调用时,就有一个新的栈帧被创建。当方法调用完成时,不管是抛出异常还是正常返回栈帧都会被销毁。 栈帧由java虚拟机栈中创建该栈帧的线程来分配。每个栈帧都有自己的本地变量,操作数栈,动态链接(返回方法的值或者抛出的异常)。
局部变量表(Local Variables):每个栈帧都有一个局部变量表(一个数组),可以存放类型为boolean, byte, char, short, int, float, reference, or returnAddress。在32位JVM中long,double类型占用连续两个变量位置。 每一个栈中的变量表从0号位开始,0号位为当前方法的调用者(this),任何局部变量都是从变量表 1号位开始。
操作数栈(Operand Stacks):JVM提供指令加载常量或者值从本地方法列表或者属性到操作数栈。其他Java JVM 可以对操作数栈中的值进行操作(计算),然后弹栈返回结果到操作数栈。操作数栈也用作方法参 数的传递以及 接收方法的返回值。 任何时候每个操作数栈都有自己的深度,long、double都要占用两个单元深度,其他的类型的值占用一个操作数单元。
动态链接(Dynamic Linking):每个栈帧都会引用一个支持动态链接到当前方法区方法的运行时常量池。被引用到的字节码方法会被调用, 变量将可以通过符号引用进行访问。动态链接将这些符号链接翻译为具体的方法引用,加载还没有符号引用的的类,翻译变量的内存地址与运行时的内存地址将关联。
如何判断对象是否成为垃圾? 引用计数法:当有一个地方使用计数值+1,失效时-1,为0时是不可再被引用的对象 缺点:循环引用时,某些对象将无法被回收掉
final 关键字
- 修饰成员变量 如果final修饰的是类变量,只能在静态初始化块中指定初始化值或者声明该类变量时指定初始值。 如果final修饰的是成员变量,可以在非静态块初始化,声明该变量或者构造器中执行初始化值。
- 修饰局部变量 一定要赋值且只赋值一次,变量地址不能再次赋值
- 为什么内部类只能访问带final的外部变量? 原因一:如果内部类的方法执行完成,但是内部类对象还存在,并且引用了一个无效的成员变量。 原因二:局部变量修改,和内部类的变量值在内部改变,那么也会出问题。 所以只能访问带final的外部变量。