java基础面试题汇总2(十题一章)

这篇博客汇总了十个核心的Java基础面试题目,涵盖了clone方法、多态机制、抽象类与接口的区别、super关键字的使用、String与StringBuffer的对比、finally块的执行逻辑、final、finally与finalize的区别、Error与Exception的差异、sleep()与wait()方法的异同,以及同步与异步的适用场景。通过深入探讨这些概念,有助于理解Java编程的关键原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.写clone()方法时,通常都会有一行代码,是什么?
clone缺省行为:super.clone();因为首先要把父类中的成员先复制,然后再复制自己的成员


2.java中的多态机制是什么?
父类或者接口定义的引用变量时可以指向子类或具体实现类的实例对象,而程序调用的方法在运行时才会进行动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法


3.抽象类abstract class和接口interface的区别
接口可以说是一种特殊的抽象类;接口中的所有方法都必须是抽象的,接口中的所有方法定义默认是public abstract,所有变量定义默认是public final static;
抽象类和普通的类一样可以包含具体实现方法和变量,不同的是:抽象类不能够被实例化和允许有抽象方法;如果继承了抽象类的子类没有实现抽象类的全部抽象方法,则该子类也要被定义为抽象类;抽象类中不能有抽象静态方法,因为这些抽象方法都需要被重写的,所以不能设置为static,否则就不能被重写;
抽象类和接口在语法上的区别有:
1.抽象类可以有构造方法,而接口中不能有构造方法;
2.抽象类中可以有普通成员变量和非抽象的普通方法,而接口中所有的方法都默认且必须为public abstract;所有变量也都默认且必须为:public final static;
3.一个类可以实现多个接口,但是只能继承一个抽象类或者普通的类;


4.super.getClass()方法的调用;下面程序的输出结果:
public class Test extends Data{
    public static void main(String[] args){
        new Test().test();
    }
    public void test(){
        System.out.println(super.getClass().getName());
    }
}   
最终输出的结果为Test而不是Data。
在test方法中调用super.getClass().getName()方法,由于getClass()方法在Object类中定义成了final类型的方法,因此子类不能覆盖该方法,所以,在test方法中调用该方法其实就是在调用父类继承的getClass(),最终调用的是自身的getClass()
如果想要获得Data,可以使用super.getClass().getSuperclass().getName();即可


5.String和StringBuffer的区别
java提供了两类:String/StringBuffer,他们都可以存储和操作字符串,其中String提供了值不可改变的字符串,而StringBuffer则提供了可进行修改的字符串
String类实现了equals方法,而StringBuffer没有实现equals方法, 所以StringBuffer依然采用的是默认的==方法来比较两个StringBuffer数据;所以,当将StringBuffer对象存储到java集合中将会出问题,因为无法正确比较两个数据是否相等;
当需要对字符串进行修改、追加之类的操作时,应使用StringBuffer,因为他提供了进行该操作的一系列方法比如append,在这些操作上,String的效率远远低于StringBuffer


6.finally块里面的代码一定会执行吗?到底是在什么时候执行?
第一个答案是不一定的,有两种情况下不会执行:
1.try语句没有执行到,比如在try之前就返回值了表示已经执行完毕了,此时别说是finally,就是try也不会执行
2.在try语句块中有System.exit(0)这样的语句,他是用来终止Java虚拟机JVM的
第二个答案,目前网上看到的最好的解是:finally语句是在try的return语句执行之后,return返回之前执行;看如下代码:
try{
    System.out.println(1);
    return 1;
}
catch(Exception e){
}
finally{
    System.out.println(2);
    return 2;
}
最终该代码的返回结果为2,同时依次输出1和2,这表示这try语句却是先于finally执行,而在执行try的return语句时,它也先于finally执行,就好比一个罐子,return 1先将1存放在罐子里,然后在进行finally语句的逻辑语句运算,而在finally语句中执行的return 2,会将罐子里的值进行更新,因此最终返回的值为2;也就是说,try语句中的return是先于finally语句块执行的,不过他并没有直接返回,而是等到finally语句块执行完毕之后才进行结果返回的


7.final、finally、finalize的区别
final用于声明属性,表示该属性值不可变;声明方法,表示该方法不能被重写,声明类,表示类不能被继承;
finally常与异常捕获try/catch语句一起用,作为异常处理语句结构的一部分;
finalize是Object类的一个方法,在垃圾收集器执行的时候会自动调用待回收对象的此方法;我们可以覆盖此方法来自定义垃圾收集时的其他资源的回收,比如关闭文件等。


8.error和exception有什么区别?
error表示恢复不是不可能但是很困难的情况下的一种严重问题,比如内存溢出,这种问题不可能指望程序能处理;而exception表示一种设计或实现的问题;如果程序运行正常,就不会发生异常,而有可能会发生error错误问题


9.sleep()和wait()方法有什么区别
sleep()是线程类的方法,调用线程的sleep方法将会导致次线程暂停执行指定时间,将执行机会给其他线程也就是所说的让出CPU,但是其监控状态仍然保持,指定时间过后将会自动恢复,也就是说sleep方法不会释放对象锁;
而wait()是Object类的方法,调用对象的wait方法之后会导致本县城放弃对象锁而进入等待锁定状态,只有针对此对象发出notify()/notifyAll()后本线程才会进入对象锁定池准备获得对象所进入运行状态;


10.同步和异步分别在什么情况下使用?
如果数据将在多个线程之间进行共享时,就必须要使用同步进行数据读取;比如正在写的数据可能这个时候会同时被另一个线程读取,或者正在读的数据此时正同时被另一个线程进行写操作,这时候为了保证数据的正确性,必须使用同步来进行操作
当一个程序在对象上调用了一个需要花费很长时间才能执行完的方法,并且这个方法的执行并不会影响程序的其他操作时,这时候我们可以采用异步编程的方式来执行该方法,从而提高程序的执行效率
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值