东东
发布于 2022-10-28 / 15 阅读 / 0 评论 / 0 点赞

JAVA基础面试题

1、面向对象的三个基本特征

封装、继承、多态
封装:隐藏部分属性和实现细节,对数据的访问只能通过公共的接口,通过这种方式可以对内部数据进行不同级别的保护。
继承:子类继承父类的特征和行为。
多态:同一个行为,不同的子类可以有不同的形式。
多态存在的三个条件:1、继承;2、重写;3、父类引用指向子类对象

2、重写和重载

重写:方法重写,继承后子类覆盖父类的方法;
重载:方法名相同,通过参数的不同来判断使用不同的方法,不能通过返回值来重载;

构造方法不同进行重写,只能进行重载

&和&&的区别

&:既可以为按位与运算,还可以为逻辑与运算;

  1. 当为按位与运算:进行二进制计算时,对应的二进制位都为1,结果为1,否则结果位0;
  2. 当为逻辑与运算:不具备短路性。

&&:逻辑与运算;进行条件判断时,运算符左右两边都为TRUE时,结果才为TRUE。具备短路性:即第一个表达式为FALSE时,直接返回FALSE。

Java的数据类型

基本数据类型(8个):byte、short、int、long、float、double、char、boolean;
其他为引用数据类型:String

String

  1. 引用数据类型;
  2. final修饰,不可被继承
  3. 不可变性,创建后值不能更改,任何修改都会生成新的对象
  4. 线程安全

String和StringBuffer和StringBuilder的区别

String:String 的值被创建后不能修改,任何对 String 的修改都会引发新的 String 对象的生成。
StringBuffer:跟 String 类似,但是值可以被修改,使用 synchronized 来保证线程安全。
StringBuilder:StringBuffer 的非线程安全版本,没有使用 synchronized,具有更高的性能,推荐优先使用。

== 和 equals

==:运算符,用于比较基础类型变量和引用类型变量。

  1. 比较基础类型变量时,比较变量保存的值是否相同;
  2. 比较引用类型变量时,比较的是两个对象的地址是否相同

equals:Object 类中定义的方法,通常用于比较两个对象的值是否相等。

equals 在 Object 方法中其实等同于 ==,但是在实际的使用中,equals 通常被重写用于比较两个对象的值是否相同。

深拷贝和浅拷贝区别是什么?

浅拷贝:对于基础数据类型:直接复制数据值;对于引用数据类型:只是复制了对象的引用地址,新旧对象指向同一个内存地址,修改其中一个对象的值,另一个对象的值随之改变。
深拷贝:对于基础数据类型:直接复制数据值;对于引用数据类型:开辟新的内存空间,在新的内存空间里复制一个一模一样的对象,新老对象不共享内存,修改其中一个对象的值,不会影响另一个对象。

深拷贝相比于浅拷贝速度较慢并且花销较大。

Java是值传递还是引用传递

Java中只有值传递,对于引用数据类型,传递的值为对象的引用

静态变量和成员变量的区别

  1. 成员变量存在堆中,静态变量存在方法区中;
  2. 成员变量和对象共存亡,随着对象的创建而存在,随着对象的回收而释放。静态变量则和类共存亡随着类的加载而存在,随着类的消失而消失
  3. 成员变量属于对象,也叫实例变量,静态变量属于类,也叫类变量;
  4. 成员变量只能被对象所调用,静态变量可以被对象调用,也可以被类名调用。

是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?

在静态方法内部,如果显时创建了对象实例,则可以通过实例进行非静态方法的调用。

类方法加载顺序

  1. 单一类初始化顺序:静态变量->静态代码块->普通变量->初始化块(普通代码块)->构造器
  2. 存在继承关系的初始化顺序:父类(静态变量->静态代码块)->子类类(静态变量->静态代码块)->父类(普通变量->初始化块(普通代码块)->构造器)->子类类(普通变量->初始化块(普通代码块)->构造器)

静态变量、静态代码块只初始化一次;

阐述 final、finally、finalize 的区别。

final:关键字,可以修饰类、方法、变量

  1. 修饰类:该类不能再派生出新的子类,不能作为父类被继承。因此,一个类不能同时被声明为abstract 和 final。
  2. 修饰方法:该方法不能被子类重写。
  3. 修饰变量:该变量必须在声明时给定初值,而在以后只能读取,不可修改。 如果变量是对象,则指的是引用不可修改,但是对象的属性还是可以修改的。

finally:通常配合 try、catch 使用,用于存放那些无论是否出现异常都一定会执行的代码。在 return 前会先执行 finally 语句块
finalize:Object 中的方法,在垃圾收集器将对象从内存中清除出去之前做必要的清理工作,只能执行一次,不建议手动执行。