记录面试题
先答定义,再特点(优缺点),最后应用场景
1.面向对象的三大特性是什么?封装、继承、多态分别解决了什么问题?面试官考核目标:考察对 OOP 本质的理解)
答:三大特性是,封装、继承、多态。
封装解决了数据的安全性和(方便维护)复杂性问题,只对外暴露必要的接口,防止外部代码随意访问和修改对象的内部状态;
继承(缺点:强耦合,改父类,子类也要同时被改变)解决了代码的复用性和扩展性问题,避免重复编写相同的代码;
多态解决了代码的统一性和扩展性问题,允许同一段代码作用于不同的对象(同一动作不同实现)
2. 接口和抽象类的区别是什么?Java 8 之后接口发生了哪些变化(默认方法/静态方法)?(面试官考核目标:考察抽象能力与设计取舍,以及是否跟进了语言演进)
答:抽象类单继承(一个类只有一个父类,有构造方法),接口多实现(一个类可以有多个接口,没有构造方法),抽象类定义属性和方法,接口定义行为规范(方法要做什么)
jdk8之后增加的默认方法是指,接口写的默认方法不用重写,可以在实现类中直接调用,静态方法属于接口本身可以在接口中直接调用
3. 方法重写(Override)和方法重载(Overload)的区别?(面试官考核目标:考察编译期静态绑定与运行期动态绑定的区别)
答:方法重载(重载发生在同一个类中)是在同一个类中,可以存在多个方法名相同,参数不同的方法(在同一个类中,允许存在多个方法名相同但参数列表不同的方法。),是在编译期(静态绑定),重载体现的是编译时多态:编译器根据静态类型和参数列表选择方法,效率高,但灵活性低。,重写(重写发生在父子类之间)是父类和子类间方法名和参数必须一致(子类重新定义父类中方法签名相同的方法,从而覆盖父类的实现。),是在运行期(动态绑定),重写体现的是运行时多态:JVM 通过虚方法表(vtable)在运行期根据对象实际类型分派方法,这是 Java 多态的基石。
4. String、<StringBuffer、<StringBuilder 的区别?为什么 String 设计为不可变?
答:三个都是引用型变量,String每次修改都会创建新对象(不可变),而其它两个都是在原有对象上修改(可变)String用于字符串不常变化的场景,StringBuffer用于多线程环境下频繁操作字符串,StringBuilder用于单线程环境下频繁操作字符串,保证线程安全(不可变对象可以被多个线程自由共享,无需同步,天然线程安全。常量池共享、Hash 缓存、线程安全、安全防护)
5. 请说出 == 和 equals 方法的区别是什么?Object.equals 的默认行为是什么?
答:比的是(基本型是比值,引用型比地址),equals可以比较地址也可以比较具体的内容,equals可以被重写,不行,默认行为就是(先判断,再类型判断,再判断字符内容)
6. equals 和 hashCode 的契约是什么?为什么重写 equals 必须重写 hashCode?两个对象 hashCode 相同,equals 一定相同吗?反过来呢?
答:契约是equals 相等则 hashCode 必须相等;但 hashCode 相等 → equals 不一定相等。 重写 equals 必须同时重写 hashCode,且用相同字段。只重写 equals 不重写 hashCode,会导致"相等的对象"被分到不同的桶,从而找不到、去不了重。hashCode 相等则 equals 不一定相等
7. 什么是自动拆装箱?Integer 的缓存机制(-128~127)了解吗?
答:自动拆装箱就是 Java 编译器在基本类型和对应包装类之间自动完成的转换:基本类型 → 包装类叫装箱,包装类 → 基本类型叫拆箱。Integer 内部用 IntegerCache 预缓存了 -128~127 之间的 Integer 对象,自动装箱落到这个区间时直接复用缓存对象,超出才新建,所以 Integer a=100, b=100 时 a==b 为 true,而 200 时为 false。
8. final、finally、finalize 三者有什么区别?
答:final是修饰符用来修饰变量方法和类,finally是异常处理块通常用来释放资源,finalize是Object的一个方法,当他被重写并且该方法没有执行并且在对象被回收时会触发判定,通过判断不会被回收,否则会被回收,jdk5版本被废弃
9. Java 是值传递还是引用传递?方法参数传递的本质是什么?
答:Java是值传递,没有引用传递,方法参数传递的本质是把实参复制一份给形参,引用型把地址复制给形参,实参和形参共用一个对象,但是形参无法影响对象
10. 什么是浅拷贝和深拷贝?如何实现深拷贝?
答:浅拷贝:只复制对象和基本类型字段,引用类型复制地址而共享同一个对象,改一个影响另一个。深拷贝:连引用字段指向的对象也复制,两个对象完全独立(不仅复制对象本身,还把引用类型字段指向的对象也复制一份。 新对象和原对象完全独立,互不影响。)。如何实现:1.重写 clone(),逐层手动拷贝,2.序列化 + 反序列化3.JSON 序列化

浙公网安备 33010602011771号