Java基础面试题

1、说一下面向对象

要说面向对象的话,我们可以将面向过程与它对比
面向过程:我觉得面向过程的话,就是比如你要做一件事,你应该从什么地方开始做起,然后你要怎么样做,一步一步去把它完成,这个完成的过程就是面向过程。
面向对象:而面向对象的话,就是我们先梳理清楚,这件事涉及到了什么东西,比如,我们要去扫地,不是说向面向过程一样,一个人先找到灰斗和扫帚,然后开始扫地,我们会先梳理扫地这件事涉及到人、灰斗和扫帚、地面这四个对象,然后我们会根据对象的职责去给对象定义相应的行为,将这些行为关联起来就形成了扫地这件事。

2、面向对象的三大特征

面向对象的三大特征分别是封装、继承和多态。
封装的话就是将类的属性或方法私有化,属性不能由外部对象直接访问,外部对象只能通过事先定义好的接口来进行访问。
继承的话就是我们可以将一类事物的共同特征抽象成一个公共的类即父类,然后可以通过继承父类的方式来构造新类即子类
多态的话就是上面我们说可以通过继承父类的方式构造子类,当这个父类存在多个子类并且子类都重写了父类的某个方法的时候,这时候不同子类型的对象就可以对同一个方法做出不同的响应,这就是多态的表现。

3、多态分为哪两种

重载:实现的是编译时的多态性,也称为前绑定
重写:实现的是运行时的多态性,也称为后绑定

4、多态存在的三个必要条件
  1. 继承
  2. 重写
  3. 父类引用指向子类对象
5、抽象类特点
  1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
  2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
  4. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
  5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
6、抽象类和接口的区别
  1. 抽象类有构造方法,接口没有
  2. 抽象类中可以有普通成员变量,接口中成员变量只能是public final static 类型的
  3. 抽象类可以有普通成员方法,接口只能有public abstract类型的成员方法
  4. 一个类可以实现多个接口,但只能继承一个抽象类
7、接口和抽象类的作用
  • 接口:主要针对功能、动作,将拥有这些动作的类共同实现此接口,比如:鸟、飞机都能fly(), 体现了开闭原则:对修改关闭,对扩展开放,提高了代码严谨性
  • 抽象类:将拥有共同属性特征的类继承此类,增强了代码的复用性,父类中添加新方法时子类将全部拥有不用逐一去新增,提高了代码的灵活性
8、说说异常吧

异常分为编译时异常和运行时异常还有错误

  1. 编译时异常:RuntimeException以外的异常。这类异常在代码编译的时候编译器会提示你这里会抛出异常需要你手动捕获,如果不捕获的话就会编译错误。
  2. 运行时异常:即RuntimeException,此类异常在代码编写时不会被编译器检测出来,可以不需要被捕获,不过程序员可以根据需要进行捕获
  3. 错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
9、常见的运行时异常
  1. NullPointerException:空指针异常
  2. ArrayIndexOutOfBoundsException:数组下标越界异常
  3. NumberFormatException:数字格式转换异常
10、常见的编译时异常
  1. IOException:io操作异常
  2. ClassNotFoundException:应用程序试图加载类时,找不到相应的类,抛出该异常。
  3. IllegalAccessException:拒绝访问一个类的时候,抛出该异常。
11、java异常处理机制

抛出异常以及捕获异常 ,一个方法所能捕捉的异常,一定是Java代码在某处所抛出的异常。简单地说,异常总是先被抛出,后被捕捉的。

12、Java的深拷贝以及浅拷贝
  • 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递
  • 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并赋值其内容
13、HashMap的实现原理,HashMap是如何解决hash冲突的问题?
  • HashMap的实现原理

  • HashMap是如何解决hash冲突的问题
    hashMap使用链表法解决hash冲突 : 在哈希表中,每一个桶(bucket)或者槽(slot)都会对应一条链表,所有哈希值相同的元素放到相同槽位对应的链表中。

14、ThreadLocalMap解决hash冲突

开放寻址法核心思想:如果出现散列冲突,我们就重新探测一个空闲位置,再将元素插入。

一种比较简单的探测方法:线性探测法(Linear Probing)

当我们往散列表中插入元素时,如果某个数据经过散列函数散列之后,存储位置已经被占用了,那么我们就从当前位置开始,依次往后遍历,直到找到空余的位置插入为止

15、 Java代码父子类执行顺序

父类静态(代码块和变量) → 子类静态(代码块和变量) → 父类非静态 → 父类构造函数 → 子类非静态 →子类构造函数

16、 cookie和session是什么,他们的区别与联系?

cookie和session都是一种用户会话跟踪技术。
cookie的原理就是,当客户端请求服务器时,服务器就可以使用response向客户端浏览器颁发一个cookie,客户端会把cookie保存起来,当浏览器再次发起请求的时候,就会携带保存的cookie一起提交给服务器,服务器检查该cookie,以此来辨认用户状态。
session的原理就是,当浏览器第一次发送请求时,服务器自动生成一个session和一个session id用来标识这个session,并将其通过响应发送到浏览器,当浏览器第二次发送请求的时候,会将之前的session id放在请求中一并发送到服务器,服务器从请求中提取出session id并和保存的所有session id进行对比,找到这个用户的session,一般session id都是通过cookie保存的。

17、讲一下java的集合

java的集合主要是两大类,一类是Collection,一类是Map,Collection是存储一个元素的集合,Map是存储key-value键值对元素的集合,Collection的子接口主要有List,Set,Queue,Map的子接口主要有HashMap,List实现类主要是ArrayList,Set主要实现类是HashSet,List存储的是有序可重复的数据,Set存储的是无序不可重复的数据,也有有序的,比如LinkedHashSet,HashMap可以存储null的key和value,Hashtable不可以。

18、类加载器有哪些,它们是相互继承的吗?

有启动类加载器BootstrapClassLoader,扩展类加载器Extension ClassLoader(ExtClassLoader),系统类加载器App ClassLoader(应用程序类加载器),自定义类加载器,启动类加载器JVM内核中的加载器,该加载器是用C++语言写的,其他的类加载器都是ClassLoader的子类,不是相互继承关系

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值