面向对象面试题

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.设计模式

创建型模式:提供了对象创建过程中的各种问题的解决方案总结

单例模式,抽象工厂模式,原型模式,构建者模式,工厂方法模式

结构性模式:对类在设计上的总结,比较关注类继承,组合关系。

代理模式(静态代理,动态代理),适配器模式,桥接模式,装饰者模式,外观模式,享元模式,组合模式.

行为型模式:对象直接的交互和职责划分总结;

观察者模式、模板模式、策略模式、职责链模式、迭代器模式、状态模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式。

posted @   英俊潇洒的萨克君  阅读(150)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示