面试中常见的java基础问题

  • 面向对象编程的特性
  • String、StringBuffer和StringBuilder的区别
  • String a = " " 和 String a = new String(" ")的区别
  • Object的equals和==的区别
  • equals和hashcode的关系
  • 装箱和拆箱
  • int和Integer
  • java异常机制
  • 什么是内部类?静态内部类和非静态内部类的区别
  • 为什么匿名内部类中使用局部变量要用final修饰?
  • final、finally和finalize()的区别
  • 重载和重写
  • 抽象类和接口
  • 反射
  • 泛型
  • 集合
  • 线程

1、问:面向对象编程的特性

:面向对象编程的四大特性分别是:抽象、继承、封装、多态。
抽象:对现实世界中的事物进行概括,抽象为在计算机虚拟世界中有意义的实体。
继承:子类继承父类,不仅可以有父类原有的方法和属性,也可以增加自己的或者重写父类的方法和属性。
封装:将某事物的属性和行为包装到对象中,构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,并且尽可能的隐藏内部的细节,只保留一些对外接口使之与外部发生联系。
多态:允许不同类的对象对同一消息做出各自的响应。

多态存在的条件:
1.要有继承
2.要有复写
3.父类引用指向子类对象
多态的实现方式:
接口实现,继承父类进行方法重写,同一个类中的方法重载

2、问:String、StringBuffer和StringBuilder的区别

:String是字符串常量,StringBuffer和StringBuilder是字符串变量,即String对象一创建后不可更改,而后两者的对象是可更改的。StringBuffer是线程安全的,而StringBuilder非线程安全,这是由于StringBuffer加了同步锁。String适用于少量的字符串操作的情况,StringBuffer适用于多线程下在字符缓存区进行大量操作的情况,StringBuilder适用于单线程下字符缓存区进行大量操作的情况。

3、问:String a = " " 和 String a = new String(" ")的区别

:通过String a = " “直接赋值的方式得到的是一个字符串常量,存储于常量池,需要注意的是相同内容的字符串在常量池中只有一个;通过new String(” ")方式创建的字符串不是常量而是实例对象,会在堆内存中开辟空间存放数据,且每个实例对象都有自己的地址空间。

4、问:equals和==的区别

:"=="对于基本数据类型来说比较的是两个变量值是否相等,对于引用类型来说,比较的是两个对象的内存地址是否相等;equals的情况比较复杂,它是Object的公有方法,因为java中所有类都默认继承于Object,所以所有的类都有这个方法,equals具体含义取决于如何重写,比如String的equals比较的是两个字符串内容是否相等。

5、问:equals和hashcode的关系

:默认情况下,equals相等hashcode必相等,而hashcode相等equals不一定相等,hashcode是基于内存地址计算得出。

6、问:装箱和拆箱的含义

:装箱就是自动将基本数据类型转换为包装器类型,拆箱就是自动将包装器类型转换为基本数据类型。

7、问:int和Integer的区别

:Integer是int的包装类,int是java的基本数据类型;Integer变量必须实例化后才能使用,而int变量不需要;Integer实际是对象的引用,当new一个Integer时,实际是生成一个指针指向此对象,而int是直接存储数据值;Integer默认值是null,int默认值是0。

8、问:java异常机制

在这里插入图片描述

Throwable的继承层次结构:

(1)Error:指程序无法恢复的异常情况,表示运行应用程序中较严重的问题。多发生于虚拟机自身、或者在虚拟机试图执行应用时,如VirtulMachineError(java虚拟机运行错误),属于不可查异常,即不强制程序员必须处理,即使不处理也不会出现语法错误。

(2)Exception:指程序有可能恢复的异常情况,表示程序本身可以处理的异常。其又分为两大类:

  • RuntimeException运行时异常:由程序自身的问题导致产生的异常,如NullPointerException(空指针异常),属于不可查异常。
  • 非运行时异常:由程序外部问题引起的异常,如FileNotFoundException(文件不存在异常),属于可查异常,即要求程序员必须进行处理,如果不进行处理会出现语法错误。

异常的处理机制:

(1)捕捉异常:由系统自动抛出异常。

try {  

    // 可能会发生异常的程序代码  
} catch (异常类1  异常变量) {  

    // 捕获并处理try抛出的异常类型Type1  
} catch (异常类2  异常变量) {  

    // 捕获并处理try抛出的异常类型Type2  
} finally {  

    // 无论是否发生异常,都将执行的语句块  
}

(2)抛出异常:在方法中将异常对象显性地抛出,之后异常会沿着调用层次向上抛出,交由调用它的方法来处理。配合throws声明抛出的异常和throw抛出异常。

(3)自定义异常:继承Exception或其子类。

9、问:什么是内部类?静态内部类和非静态内部类的区别

:内部类就是定义在另外一个类里面的类,它隐藏在外部类中,封装性更强,不允许除外部类以外的类访问它,但它可以直接访问外部类的成员,其中静态内部类和非静态内部类的区别:

  • 静态内部类是指被声明为static的内部类,可不依赖外部类实例化,而非静态内部类需要通过生成外部类来间接生成。
  • 静态内部类只能访问外部类的静态成员变量和静态方法,而非静态内部类由于持有外部类的引用,可以访问外部类的所有成员。

10、问:为什么匿名内部类中使用局部变量要用final修饰

:一方面,由于方法中的局部变量生命周期很短,一旦方法结束变量就会被销毁,为了保证在内部类中找到外部局部变量,通过final关键字可以得到一个外部变量的引用;另一方面,通过final关键字也不会在内部类中修改该变量的值,保护了数据的一致性。

11、问:final、finally和finalize()的区别

(1)final:关键字表示不可修改,具体表现在:

  • final修饰的变量必须要初始化,且赋值后不能再重新赋值
  • final修饰的方法不能被子类重写
  • final修饰的类不能被继承

(2)finally:和try、catch一起使用进行异常处理。无论是否捕获或处理异常,finally都会被执行,只有以下四种特殊情况,finally才不会执行:

  • 在finally语句块中发生异常
  • 在前面的代码中用了System.exit()退出程序
  • 程序所在的线程死亡
  • 关闭CPU

(3)finalize():是Object的方法,当垃圾回收器将回收的对象从内存中清除出去之前会调用finalize()方法,但此时并不代表该回收对象一定会被清除,还有机会"逃脱"。

12、问:重载和重写

:重写代表子类重写父类的方法;重载表示有多个同名函数同时存在,区别在于不同的参数个数和参数类型。

13、问:抽象类和接口的区别

:在使用上,一个类只能继承一个抽象类却可以实现多个接口;在设计上,接口是对行为的抽象,无需有子类的前提,是自上而下的设计理念,抽象类是对类的抽象,是建立在相似子类之上,是自下而上的设计理念。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值