2.java面试之基础知识

本文详细介绍了面向对象的三大特性:继承、封装和多态,并解释了final、finally、finalize的区别。此外,还探讨了Exception、Error的不同以及常见的RuntimeException。

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

1. 面向对象的特征:继承 ,封装 和多态

面向对象是对现实

  • 继承
    继承是从已有类得到的继承信息创建新的类的过程, 提供信息继承的类被称为父类;得到继承信息的类被称为子类, 继承让变化汇总的软件系统, 有了一定的延续性, 同时继承也是封装程序中可变因素的重要手段。

  • 封装
    通常认为封装是吧数据和操作数据的方法绑定起来, 对数据的访问只能通过已定义的接口。面向对象的本质就是将显示世界描绘成一系列完全自治,封闭的对象。我们在类中编写的方法, 就是对现实细节的一种封装;我们编写一个类就是对数据和数据操作的封装, 可以说, 封装就是隐藏一切可影藏的东西, 只向外界提供最简单的编程接口。

  • 多态性
    多态性是指运行不同子类型的对象对同一消息做出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的操作。对泰兴分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务, 那么运行时的多态就可以理解为:当A系统访问b系统提供的服务是, b系统有多种提供服务的方式, 但一切对A系统来说, 都是透明的。方法重载实现就是编译时的多态性, 而方法重写, 实现的是运行时的多态性,运行时的多态是面向对象最精髓的东西。

2.final, finally, finalize 的区别

  • final 关键字用于修饰变量,方法,l类, 修饰的变量不能重新赋值, 修饰的方法不能覆盖,类不能被继承
  • finally 用于 异常处理中, 无论有没有异常出现, finally中的代码都会执行
  • finalize Object中的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法, 可以覆盖此方法来提供垃圾收集时其他资源的回收, 例如关闭文件等, 改方法更像是一个对象生命周期的临终方法,但是我们不能主动去调用该方法。

3.Exception、Error、运行时异常与一般异常有何异同

  • Error类和Exception类都是Throwable类子类

  • Error类一般是指与虚拟机相关的问题, 如系统崩溃, 虚拟机错误,内存空间不足鞥, 对于这类异常, 程序无法修复和预防。

  • Exception类表示程序可以处理的异常,可以捕获可能恢复,应该竟可能的处理异常, 使程序恢复运行, 而不是随意终止异常。

  • Exception类分为运行时异常和检查异常, 运行时异常编译可以通过, 但是一运行就终止, 程序不会处理运行时异常, 出现这类异常,程序会终止, 而检查异常要么用try catch 捕获, 要么用throws抛出, 交给父类处理。

4.五个常见的RuntimeExcption

  • NullPointerException
  • ClassNotFoundException
  • NumberFormatException
  • IllegalArgumentException
  • ClassCastException
  • NoClassDefFoundException
  • SQLException

5.int 和 Integer 有什么区别,Integer的值缓存范围

java为了能将8种基本的数据类型当做对象操作, 为每一个基本数据类型引入了对应的扮装类

6.String、StringBuilder、StringBuffer

  • String 对象定义后不可变, 是线程安全的 ,若修改, 等于重新生成新的字符串对象
  • StringBuffer 是线程安全的,在修改时,是对StringBuffer对象本身进行修改, 不会生成新的对象 。在方法行加入了属于synchronized关键字,执行效率慢
  • StringBuilder 线程不安全的,同StringBuffer都是调用AbstractStringBuilder公共方法,

7. 重载和重写的区别

重写和重载都是实现多态性的标志

  • 重写
    是运行时多态性,发生在父类和子类之间, 重写要求子类被重写方法,与父类的重写的方法有相同的返回值类型,比父类被重写方法更好访问, 不能比父类被重写方法声明更多的异常。

    • 参数列表和返回值类型一直
    • 构造函数不能被重写,声明的final 、static 的方法不能被重写,static 可被再次声明
    • 访问权限不能比被重写的访问权限低
    • 不能抛出被重写方法声明的更广泛的强制性异常
  • 重载
    是编译时多态性, 重载发生在同一个类中,同名的方法, 有不同的参数列表,视为重载

    • 方法名相同,参数列表中参数顺序类型个数不同
    • 重载与方法返回值无关,存在于父类和子类和同类中
    • 可以抛出不同的异常, 可以有不同的修饰符

8.抽象类和接口有什么区别

抽象类是对根源的抽象, 接口是对动作的抽象
区别
- 抽象类有默认方法实现, 接口没有
- 抽象使用extends , 接口使用implements
- 抽象可有构造器,接口不能
- 抽象除了不能实例化, 和普通java类没有区别, 接口完全是不同类型
- 抽象可有public ,protected 和default修饰符, 接口默认使用public
- 抽象可有main方法, 接口没有
- 抽象可继承一个类,实现多个接口,接口只能继承一个, 或者多个接口

9.说说反射的用途及实现

10.Session与Cookie区别

11.equals与==的区别

  • equals 用来比较两个对象的内容是否相等
  • == 比较基本数据类型, 则比较的数值是否相等, 如果比较引用数据类型, 则比较的是对象的地址是否相等

12.hashCode和equals方法的区别与联系

因为如果只覆盖了equals而没有覆盖hashCode, 则两个不同的instance a和b虽然equals结果(业务逻辑上)相等,但却会有不同的hashcode,这样hashmap里面会同时存在a和b,而实际上我们需要hashmap里面只能保存其中一个,因为从业务逻辑方向看它们是相等的.

equals方法和hashCode方法如果不同时按你自己逻辑覆盖的话,HashMap就会出问题。比如你只覆盖了equals方法而没有覆盖hashCode方法,那么HashMap在第一步寻找链表的时候会出错,有同样值的两个对象Key1和Key2并不会指向同一个链表或桶,因为你没有提供自己的hashCode方法,那么就会使用Object的hashCode方法,该方法是根据内存地址来比较两个对象是否一致,由于Key1和Key2有不桶的内存地址,所以会指向不同的链表,这样HashMap会认为key2不存在,虽然我们期望Key1和Key2是同一个对象;反之如果只覆盖了hashCode方法而没有覆盖equals方法,那么虽然第一步操作会使Key1和Key2找到同一个链表,但是由于equals没有覆盖,那么在遍历链表的元素时,key1.equals(key2)也会失败(事实上Object的equals方法也是比较内存地址),从而HashMap认为不存在Key2对象,这同样也是不正确的。

一、equals方法的作用

1、默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象)。

2 、要是类中覆盖了equals方法,那么就要根据具体的代码来确定equals方法的作用了,覆盖后一般都是通过对象的内容是否相等来判断对象是否相等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值