面试题
什么是面向对象
- 面向对象和面向过程是两种截然不同的编程方式
- 面向过程更注重每一步骤的执行过程和顺序
- 面向对象更注重这些事有哪些参与者,以及各自需要做什么
面向对象的三大特征
封装:明确标识外部能访问和不能访问的数据项,内部细节对外部调用透明,外部调用无需修改,及内部实现
继承:继承基类的方法并做出自己特有的改变和扩展,对于共性的方法只需要调用父类的方法和属性,无需重新定义,只用扩展子类个性的方法
多态: 基于不同的实现对于外部调用的同一个方法,实际的是执行逻辑不同
JDK&JRE&JVM的区别
jdk java开发工具
jre java运行环境
jvm java虚拟机
jdk包含jre和jvm
jre 包含jvm
==和equals的区别
==比较的是栈中的值,对于基础数据类型比较的是值,对于引用类型比较的是地址
equals,如果是object中的equals方法是用双等于 所以比较的是地址
如果重写了equals方法比较的是值
final,finally,finallize的区别
final表示不可变的
修饰在变量上表示变量一旦被赋值不可改变,修饰在引用数据类型上表示引用地址不可变
修饰在方法上表示方法不可被继承,但是可以被重载
修饰在类上表示类不可被继承,不可被修改,常见的类有string,integer
finally表示异常代码块中一定会执行的代码,比如关闭资源,事务回滚操作
finallize表示调用垃圾回收,但是由于调用垃圾回收器的实际时间不确定
为什么局部内部类和匿名内部类只能访问final变量
内部类和外部类属于同于级别的,内部类不会因为定义在方法内部执行完成之后就会被销毁
如果外部类方法执行结束,局部变量就会被销毁,但是内部类可能存在被引用所以会出现一个内部类访问一个不存在的变量
为了解决这个问题就会复制一份外部类的变量,这样当局部变量被销毁之后内部类仍然可以访问,但是实际访问的是拷贝的变量
这样相当延长了外部类的局部变量生命周期
但是在复制为内部类的成员变量时必须保证这变量是完全相同的所以必须使用final修饰
String,StringBuffer,StringBuilder的区别以及使用场景
String是用final修饰的类,这个类不可被继承,也不能修改其引用所以每一次修改时
都会在创建一个新的引用指向该变量
StringBuffer和StringBulider都是在原有对象上进行修改所以他们的性能高于string
stringBuffer是线程安全的,stringBuilder是线程不安全的所以stringBuilder性能高与
stringbuffer
如果经常修改字符串,优先使用用stringBuider
再多线程环境下用stringBuffer,如果不经常修改字符串用string
重写和重载的区别
重载 :发生在同一个类中,方法名称相同方法参数不同,参数类型不同,参数个数,与返回值无关
重写 :发生在继承关系中方法名称相同,方法参数相同,返回值小于等于父类,如果有异常,应该小于等于父类
访问修饰符应该大于等于父类,如果是private修饰的子类不能重写
接口和抽象类的区别
抽象类可以存在普通的成员方法,接口中只能是public abstract修饰的
抽象类中成员变量可以是各种类型的,接口只能是public static final修饰的
抽象类只能单继承,但是接口可以多实现