1、什么是面向对象
面向对象是一种编程思路,与之相对应的是面向过程。
二者的区别在于:
面向对象注重调用事情的参与者,也就是我们所说的对象,
而面向过程更注重事情的具体实现步骤,顺序等。
那么举个生活中洗衣服的例子就是:
面向对象就是我们把衣服放到洗衣机,然后给洗衣机输入指令,从而调用洗衣机来帮我们洗衣服,
而面向过程就好比是我们自己洗衣服,需要把衣服浸湿,然后摊平放洗衣粉,再用刷子刷等一系列过程都需要我们自己来实现。
因此我们可以看出:
面向对象是更加易于复用,扩展和维护的,
而面向过程则更加直接高效。
说起面向对象当然不能不提它的三大特性:封装、继承、多态。
一、封装:
两层含义:
一层含义是把对象的属性和行为看成一个密不可分的整体,将这两者“封装”在一个不可分割的独立对象中;
另一层含义指“信息隐藏”,把不需要让外界知道的信息隐藏起来,有些对象的属性及行为允许外界用户知道或使用,但不允许更改,而另一些属性或行为,则不允许外界知晓,或只允许使用对象的功能,而尽可能隐藏对象的功能实现细节。
封装的优点:
- 能够减少代码的耦合
- 类内部的结构可以自由修改。
- 精确的控制成员变量
- 隐藏信息实现细节
实现封装步骤
- 修改属性的可见性限制对属性的访问
- 对每个值属性提供对外的公共方法访问
二、继承
继承就是子类继承父类的方法或属性,而不需要自己再定义,只需要做出自己的改变和扩展。
继承格式:
class 父类 { }
class 子类 extends 父类 { }
继承的好处:
(1)提高类代码的复用性
(2)提高了代码的维护性
三、多态
继承是多态的前提。多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。
不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
多态性允许每个对象以适合自身的方式去响应共同的消息,优点增强了软件的灵活性和重用性。
以上是我对面向对象的理解。
2、说说你对JDK JRE JVM的理解
JDK:
Java Develpment Kit java 开发工具
JRE:
Java Runtime Environment java运行时环境
JVM:
java Virtual Machine java 虚拟机
它们的关系是JDK里包含有JRE,JRE里包含有JVM
.java文件通过javac编译成.class字节码文件,然后安装在不同系统上的JVM能够直接识别.class字节码文件,这就实现了我们所说的“一句代码,处处运行”。
3、==和equals比较
“==”是运算符
①如果比较的对象是基本数据类型,则比较的是其存储的值是否相等;
②如果比较的是引用数据类型,则比较的是所指向对象的地址值是否相等(是否是同一个对象)。
equals是Object中的方法,一般不能用于比较基本数据类型,如果没有对 equals 方法进行重写,则相当于“==”,比较的是引用类型变量所指向的对象的地址值。
一般情况下,类会重写equals方法用来比较两个对象的内容是否相等。比如String类中的equals()是被重写了,比较的是对象的值。
4、hashCode与equals
hashCode() 的作用是获取散列码,它实际上是返回一个整数值。这个散列码的作用是确定该对象在散列表中的索引位置。
散列表存储的是key-value键值对,它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!
以“HashSet如何检查重复”为例子来说明为什么要有hashCode:
对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,看该位置是否有值。
如果没有、HashSet会假设对象没有重复出现。
但是如果发现有值,这时会调用equals()方法来检查两个对象是否真的相同。如果两者相同,HashSet就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。这样就大大减少了equals的次数,相应就大大提高了执行速度。
hashCode与equals的关系是
- 如果两个对象相等,则hashcode一定也是相同的
- 两个对象有相同的hashcode值,它们也不一定是相等的
- equals