这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战
参与工作以来,准确来说应该是开始打螺丝以来,也是时候温故而知新了,一点一点重新认识Java
1.面向对象
-
什么是面向对象
对标面向过程,是两种完全不同得处理问题角度;面向过程注重的是事情的每个步骤及顺序,面向对象则是注重参与者(对象)、以及各自需要做什么(方法)。
比如:洗衣机洗衣服
面向过程会将任务拆解成一系列的步骤(函数),1、打开洗衣机----->2、放衣服----->3、放洗衣粉----->4、清洗----->5、烘干
面向对象会拆出人和洗衣机两个对象:
人:打开洗衣机 放衣服 放洗衣粉
洗衣机:清洗 烘干
-
面向对象
-
继承
直接继承基类(父类),共性的方法或者属性直接使用基类,子类只需拓展延伸自己所需即可
-
封装
封装的意义在于,内部的细节不对外部透明,外部只需知道如何调用(传参)即可
-
多态
基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同(常见于接口有多个实现)
-
2.==和equals的区别
== 是java提供的等于比较运算符,用来比较两个变量指向的内存地址是否相同;
equal是Object提供的一个方法,所有的类都是继承自Object的,所以需要关注equals是否被重写;默认的equals内部也是采用== 比较的。
public Boolean equals(Object obj) {
return (this == obj);
}
在日常业务上,更多的使用一般是String之间的比较或者用 .toString()的方式去比较;如下是String 重写的equals方法,实际上比较的还是字符串之间的内容;首先用== 比较内存地址是否指向相同,如果相同,则直接返回;确定是否字符串,比较长度,排序对比char字符。
public Boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
常见例子
public class StringDemo {
public static void main(String args[]) {
String str1 = "Hello";
String str2 = new String("Hello");
String str3 = str2;
// 引用传递
System.out.println(str1 == str2);
// false
System.out.println(str1 == str3);
// false
System.out.println(str2 == str3);
// true
System.out.println(str1.equals(str2));
// true
System.out.println(str1.equals(str3));
// true
System.out.println(str2.equals(str3));
// true
}
}
3.hashCode与equals
-
hashCode的介绍
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,Java中的任何类都包含有hashCode() 函数。
-
为什么要有hashCode
1、HashCode的存在主要是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址的
2、如果两个对象equals相等,那么这两个对象的HashCode一定也相同
3、如果对象的equals方法被重写,那么对象的HashCode方法也尽量重写
4、如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置