一、什么是面向对象?
1. 把具体的事物抽象成类,封装事物的特征。
2. 面向对象的特征:封装、继承、多态
封装:外部调用者无需关注内部细节
继承:子类继承基类的共同属性,并作出个性化扩展
多态:外部调用一个方法时,可以有不同的执行逻辑和结果,继承、重写、父类引用指向子类对象
二、JDK、JRE、JVM
JDK:java开发环境
JRE:java运行环境
JVM:java虚拟机
三、==和equals
==是运算符,对比的是栈中的值,equals比较的是对中对象的内存地址
常见于与String相关的笔试题,Object类提供的equals方法底层使用的是==,而String类重写了equals方法,没重写就是比地址,重写了就是比值
例如
str1在常量池中指向“Hello”,str2在常量池和堆空间中都创建了对象,str3指向了str2的引用(内存地址),所以
str1 == str2 str1在常量池中,str2在堆空间中,==比地址,false
str1 == str3 str1在常量池中,str3在堆空间中,==比地址,false
str2 == str3 str2在堆空间中,str3在堆空间中,str2传递引用给str3,==比地址,true
str1.equals(str2) 已重写,equals比较值,str1=“Hello”,str2=“Hello”,true
str1.equals(str3) 已重写,equals比较值,str1=“Hello”,str3=str2,true
str2.equals(str3) 已重写,equals比较值,str3 = str2,true
四、final
1.用法
修饰类:这个类不能被继承
修饰方法:这个方法不能被重写,但能重载
修饰变量:修饰基本数据类型时,这个变量不能被修改;修饰引用类型时,不能更改引用,可以更改属性值
2.成员变量声明时要赋初值,局部变量使用前要赋初值
3.局部内部类和匿名内部类只能访问外部的final变量(lamda表达式),因为
五、String、StringBuffer、StringBuilder
String | StringBuffer | StringBuilder | |
有啥用 | 创建和操作字符串 | ||
有啥区别 | 创建的字符串不能修改,只会修改引用 | 可以修改字符串内容 | 单线程 |
线程安全 | 线程安全 | 线程不安全 | |
性能等级 | 3 | 2 | 1 |
使用场景 | 多线程共享变量使用 | 优先使用 |
六、重载和重写
重载:同一个类中,方法名必须相同
重写:父类和子类中,方法名、参数列表必须相同,访问修饰符和返回值类型要小于父类
private和protected不允许重写
七、接口和抽象类的区别
语法上:
1.接口中只能是抽象方法,抽象类可以存在普通成员函数
2.接口中的成员变量只能是public static final ,抽象类中随便
3.一个类只能继承一个抽象类,但可以实现多个接口
使用场景上,接口更偏向于做什么,抽象类偏向于事物的本质是什么
八、List和Set的区别
List:有序,可重复。
Set:无序,不可重复;只能用Iterator取出所有元素。
九、hashCode和equals
1.hashCode()获取到一个int型的hashcode,这个哈希码的作用是确定该对象在哈希表中的索引位置,哈希表存储的是散列结构即k-v,能够通过key快速检索对象在堆空间的位置。
2.在存储数据时,发生hash冲突时会调用equals检查两个对象是否相同。
十、