一、重写与重载

重写:子类将父类的方法本身重新写一遍,方法名,参数,返回类型都相同

重写规则:

1、参数的类型与数量必须相同;

2、返回的类型必须一致与被重写的方法的返回类型相同。

3、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default(空)>private)

4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。

重载:在一个类中,方法名相同,参数不同

重载规则:

1、参数必须不同

2、返回的类型可以不同

3、修饰符可以不同

4、异常可以不同

简单介绍一下哈,具体的就需要你们在深入了解啦,下个啦(我是大自然的搬运工)

二、== 与equles的区别

最常见的使用就是当hash值相同时判断,先判断== 若相同,则使用equles判断值是否相同。

==:判断两个变量或者两个实例是不是指向同一个内存空间

equals:判断两个变量或实例所指向的内存空间的值是不是相同

具体可以去这个网站:

三、解决Hash冲突

说到hash冲突(大部分情况下)指:在使用hashMap时,==相同,但是equles不同时,JDK1.8之前是存入链表前部,1.8之后是存入链表之后。

1、链地址法

这种方法是把所有Hash地址相同的记录都链接在同一链表中

2、再Hash法

计算hashcode的方法不止一个,一个要是算出来重复了,就用另一个算法去算。直到不重复为止

3、公共溢出区

建立一个公共溢出区,把冲突的都放到另一个地方,不在表里面

本想给你们放个链接,没找到,时间也不够下次哈,下次一定

四、类的加载流程

1、加载

  1. 通过全类名获取定义此类的二进制字节流
  2. 将字节流所代表的静态存储结构转换为方法区的运行时数据结构
  3. 在内存中生成一个代表该类的 Class 对象,作为方法区访问这些数据的访问入口

2、准备

  • 准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中分配。
  • 对于该阶段有以下几点需要注意:这时候进行内存分配的仅包括类变量(static),而不包括实例变量,实例变量会在对象实例化时随着对象一块分配在 Java 堆中。
  • 特殊情况:比如给 value 变量加上了 fianl 关键字,那么准备阶段 value 的值就被赋值

3、解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符7类符号引用进行。

4、初始化

初始化是类加载的最后一步,也是真正执行类中定义的 Java 程序代码(字节码),初始化阶段是执行类构造器 clinit ()方法的过程。

开始是给自己准备的面试题,也就没有特别多的规划,你们看看哈 需要啥我在看看加不加的问题哈。

五、类加载机制

简单说一下(本人没有深入了解,就了解面试所需哈,总结的时候也是为了面试而总结的)

类加载的时机

  • 隐式加载 new 创建类的实例,
  • 显式加载:loaderClass,forName等
  • 访问类的静态变量,或者为静态变量赋值
  • 调用类的静态方法
  • 使用反射方式创建某个类或者接口对象的Class对象。
  • 初始化某个类的子类
  • 直接使用java.exe命令来运行某个主类

六、双亲委派原则

双亲委派定义:

双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。

双亲委派优点:
  • 可以避免重复加载,父类已经加载了,子类就不需要再次加载
  • 更加安全,很好的解决了各个类加载器的基础类的统一问题,如果不使用该种方式,那么用户可以随意定义类加载器来加载核心api,会带来相关隐患。
双亲委派模型的工作过程
  • 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。
  • 每一个层次的类加载器都是如此。因此,所有的加载请求最终都应该传送到顶层的启动类加载器中。
  • 只有当父加载器反馈自己无法完成这个加载请求时(搜索范围中没有找到所需的类),子加载器才会尝试自己去加载。