面向对象面试题
1.面向对象深刻理解?
(1)程序设计思想
(2)该思想侧重于,考虑程序中有哪些对象,不同的对象有哪些属性和行为,对象之间关系,
(3)面向过程,更注重实现功能的步骤和顺序,
(4)面向对象三要素:封装,继承,多态.
2.JRE,JDK,JVM区别?
是什么:
(1)JDK:java development kit.
(2)JRE:java runtime environment
(3)JVM:java虚拟机.
三种关系:
(1)JDK=JRE + Java工具(javac java jconsole,jmap)
(2)JRE=JVM + 类库(Object,String...)
3.JDK1.8之前和JDK1.8之后定义接口不同?
(1)在JDK1.8以前接口中只能定义抽象方法和静态常量.
(2)JDK1.8以后可以有default方法和静态方法,
使用:
静态常量,通过接口名称使用.
抽象方法必须有实现类重写,实现类对象可以调用,
default方法由实现类对象调用,
静态方法,通过接口名称调用,
4.接口和抽象类有何不同?
(1)语法上的区别:包含抽象方法的类必须是抽象类,抽象类中也可以不包含抽象方法,在JDK1.8以前接口中只能定义抽象方法和静态常量.
(2)功能不同:接口设计的目的是对类中的方法进行约束,接口是对行为的抽象,表达A like B eg:Bird like Fly , 抽象类设计的目的是代码复用:A is B eg: Man is Person
5.final , finally , finalize的区别,有什么作用?
final是一个关键字,可以修饰类,变量和方法.
作用:被final声明的类,不能被继承,被声明为final的变量必须给初始值,并且只能赋值一次,被声明为final的方法不能被重写,
finally是和异常处理相关的一个关键字.
作用:在异常处理时提供finally块来执行最终操作, 通常释放资源.
finalize是Object中定义的方法,
作用:垃圾回收器将对象从堆内存中回收之前,会调用对象的finalize方法,
6.局部变量和成员变量区别?
(1)定义位置不同: 局部变量定义在方法的内部,成员变量是在类中定义的变量.
(2)作用范围不一样:局部变量只能在本方法中使用.
成员变量:实例变量(非静态成员变量)在所有非静态方法中可以使用, 静态变量(静态成员变量)在所有的方法中都可以使用.
(3)默认值不一样:成员变量有默认值:基本类型:可能是0的是0 , boolean类型是false , 引用类型:null
局部变量没有默认值:必须手动赋值.
(4)生命周期不同:局部变量,随着方法进栈而生成,随着方法出栈而消失.
成员变量:实例变量,随着对象的创建而生成,随着对象被gc回收,而消失. 静态变量,随着类的加载而生成,类被卸载时,静态变量被销毁
7.值传递和引用传递的区别?
什么意思:指的是在方法调用时,是将实参复制一份给形参
public void m1(Node n,int m) {
Node n = new Node();
int m = 10;
m1(n,m);
}
区别:基本数据类型的变量,由于存储的是数据本身;所以就是值传递 . 引用数据类型的变量,存储的是对象的地址,所以就是引用传递.
8.==和equals区别?
①、== : 基本类型的变量在内存中存储的是数据,那就是比较数据; 引用类型的变量在内存中存放的是对象的地址,那就是比较地址;
②、equals : 是Object类中定义方法,是一个运算符,比较2个变量内容是否一样
该方法默认实现是,当前对象的引用,和传递进来的对象引用是否指向同一个对象 , 可以重写
public boolean equals(Object obj) {
return (this == obj);
}
9.hashcode和equals的区别?
①、hashCode和equals都是Object类中的方法;
②、equals默认的实现:对象地址是否一样;
③、hashCode是基于native方法实现的,底层是通过hash函数返回一个hash值;
public native int hashCode();
该问题通常会结合HashSet和HashMap为何要要求元素重写hashCode和equals方法;
10.重载和重写区别?
①重载:在一个类中定义多个方法名相同,形参列表不同(个数,类型)的方法; 目的:为了方便调用,并且可以达到调用区分;
②重写:在子类中声明和父类方法名,形参列表相同方法; 返回值:返回值类型如果是引用类型,可以是父类方法返回值的子类类型;返回值类型如果是基本类型,必须一样;
访问权限修饰词:子类方法>=父类方法
异常抛出声明:抛出异常可以是父类异常的子类异常
private 修饰的方法无法重写;
11.Java的数据类型
四类八种:(1)整形,byte,short,int,long (2)浮点型:float,double ,(3)字符:char ,(4)布尔: boolean
引用类型:类,接口,枚举,数组,注解
12.包装类和基本数据类型区别?
(1)概念:包装类是对基本数据类型的封装.
(2)有哪些包装类:int的包装类是Interger, char的包装类是Character ,其余的基本数据类型的包装类都是首字母大写
13.为什么要提供包装类?
作用:
包装类作为基本数据类型对应的引用数据类型,方便了涉及到对象的操作,
包装类中提供了对应基本数据类型最大值,最小值等属性以及相关方法.
14.包装类和基础类型怎么转换?
(1)基本类型转化包装类型(装箱):包装类.valueOf(基本类型)
(2)包装类型转化基本类型(拆箱):对象.xxValue();
(3)jdk1.5以后提供了自动的包装类和基本类型的转化,不需要显示调用上面的两个方法,自动装箱和拆箱.
15.构造器代码块,局部代码块,静态代码块执行顺序和执行次数?
(1)执行顺序:
静态代码块:当类加载的时候执行,如果类中有多个静态代码块,按照书写顺序执行,
构造器代码块:对象被创建(任意构造方法执行)之前执行,优先于构造方法,如果类中有多个构造代码块,按照书写顺序执行,
局部代码块,当方法执行的时候执行,如果方法中有多个局部代码块,按照顺序执行,
(2)执行次数:静态代码块执行一次,构造器代码块每次创建对象都会执行,局部代码块每次调用方法都会执行.
16.构造代码块的作用?
(1)可以把所有的构造方法公共的代码放在构造代码块中
(2)匿名内部类的初始化操作,匿名内部类没有明显的构造方法.
17.Integer String 是否可以被继承? 为什么?
不能被继承.
因为Integer 和String 都是被final修饰的类,被final修饰的类不能被继承.
public final class Integer extends Number ;
public final class String ;
18.Integer缓存区间?什么时候触发缓存区间?
(1)Integer缓存区间:在Integer类中定义了一个内部类private static class IntegerCache{}
在IntegerCache中维护了一个Integer的数组,[-128,127]范围的Integer实例
(2)什么时候触发缓存区间:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
基本数据类型转化为包装类型的时候,如果基本数据类型范围[-128,127]从数组中返回Integer实例,否则创建Integer实例.
19.String str = "abc" 和String str = new String("abc")的区别?
(1)String str = "abc" 如果常量池中没有"abc" 在常量池中创建"abc" ,str指向常量池"abc"
(2)String str = new String("abc") 如果常量池没有"abc" 在常量池创建"abc" ,在堆中创建对象,将常量池"abc"复制到堆中,str指向堆中对象 ,
20.String StringBuffer StringBuilder 区别?是否线程安全? 怎么做到线程安全?
(1)是否可以改变:
String底层维护的Char[]数组,使用final修饰,既然使用final修饰,无法重新给他赋值;String中的方法,替换,拼接,字串等都是返回一个新的字符串,
StringBuffer和StringBuilder底层维护的char[]数组,没有使用final修饰,对象都是在原来对象字符数组的基础上进行操作,不会产生新的对象;
(2)线程安全:
StringBuffer所有的方法都是用synchronized进行修饰,线程安全;
String是不可变的字符串,线程安全
StringBuilder线程不安全,
(3)使用场景:
如果不经常改变字符串的值,拼串操作,使用String;
如果有拼接字符串要求,没有线程安全使用StringBuilder,有线程安全使用StringBuffer
21包装类型,Math,String类常用的方法有哪些?
(1)包装类中常用方法:
将包装类转化为各种基本类型的方法
将字符串转化为各种基本类型方法:Integer.parseInt(String str) Double.parseDouble(String str)
②Math类中常用方法: abs ceil/floor random max/min
22.&和&& | || 区别是什么?
①& | :即可以作为逻辑运算符又可以作为位运算符
②&& || :只能作为逻辑运算符
③ & |作为逻辑运算符和&& ||作为逻辑运算符的区别 :&& || 有短路效果,当有多个表达式时,左边的表达式值可以确定结果时,就再继续运算右边的表达式的值
23,JDK1.8之后有哪些新特性?
1.lambda表达式
2.stream
3.接口增强
4.并行数组排序
5.Optional
6.新的时间和日期的API
7.可重复注解
24.Java中深克隆和浅克隆的区别?怎么实现?
①区别:
浅克隆:
原对象中为基本数据类型的属性值克隆给克隆对象,
原对象中为引用数据类型的引用值克隆给克隆对象,
源对象和克隆对象中引用类型的属性指向的是同一个对象
深克隆:原对象和克隆对象引用数据类型的属性指向不是同一个对象
②如何实现
浅克隆:
对Person对象进行Clone
1.要求实现Cloneable标识性接口(标记该类的对象可以被clone)
2.重写Object 中clone方法
@Data
public class Person implements Cloneable {
private int id;
private String name;
private Address addr;
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
@Data
class Address {
private int id;
private String city;
}
protected native Object clone() throws CloneNotSupportedException;
深克隆:利用IO读写; JSON的序列化和反序列化
25.Comparable 和Comparator的区别,分别说出使⽤场景?
区别:
①排序逻辑 :Comparable排序逻辑必须在待排序元素的类中,也称为自然排序,Comparator排序的逻辑写在另一个类中实现,也称为比较器排序
②排序方法 :int compareTo(E o1) , int compare(E o1,E o2)
③接口所在包: java.lang.Comparable , java.util.Comparator
使用场景:
TreeMap&TreeSet
Collections.sort(List<E> list)
Collections.sort(List<E> list,Comparator<E> comparator)
26.Object类和范型的区别,说出范型的执⾏机制,为什么要使⽤范型?
①Object类和泛型的区别:
public Object doSomething(Object obj) {....}
public <T> T doSomething(T t) {....}
如果从方法调用的角度,没有什么区别
eg:如果调用第一个方法,传递String,返回String,需要将返回的Object强转为String
String newFoo = (String) my.doSomething(foo);
eg:如果调用第二个方法,传递String,返回String
String newFoo =my.doSomething(foo);
②为什么使用泛型?
不需要做强制类型转换
编译时自动检查类型安全。如果使用Object类的话,你没法保证返回的类型一定是String,也许是其它类型。这时你就会在运行时得到一个类型转换异常
③泛型的执行机制?
泛型的本质是一种参数化类型也就是将数据类型作为参数传递,其中T相当于形式参数负责占位,而真正传递的数据类型String相当于实际参数;用于给形式参数T进行赋值;从而使所有T都被替换为String;由于实际参数可以传递各种引用类型,因此叫泛型
27.Error 和Exception 有什么区别?
①、从继承体系:Error和Exception都是Throwable的子类
②、从功能来说:Error是程序无法处理的异常 , Exception是程序可以处理的异常
继承体系:
28.什么是反射?
①反射是为了动态加载一个类,动态调用一个方法,动态访问一个属性 这些动态要求设计的;
②JVM会为每一个类创建一个java.lang.Class的实例,通过该对象就可以获取该类的信息,然后通过java.lang.reflect包下的API达到各种动态要求
29.设计模式
创建型模式:提供了对象创建过程中的各种问题的解决方案总结
单例模式,抽象工厂模式,原型模式,构建者模式,工厂方法模式
结构性模式:对类在设计上的总结,比较关注类继承,组合关系。
代理模式(静态代理,动态代理),适配器模式,桥接模式,装饰者模式,外观模式,享元模式,组合模式.
行为型模式:对象直接的交互和职责划分总结;
观察者模式、模板模式、策略模式、职责链模式、迭代器模式、状态模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)