前言
书接上回,这期我们针对前两期的知识点中容易混淆以及面试中经常出现的问题进行一个总结
一、==和equals的区别
我们说到过Java的数据类型有基本数据类型,当基本数据类型进行对比时,直接使用“==”进行比较的时他们的值;当数据类型是复合数据类型时(类),使用“==”比较的是他们在内存中存放的地址。
equals这个方法是在Object类中定义的方法,在object这个类中的equals方法还是比较对象的内存地址,只不过在一些类库中重写了equals这个方法,使其不再是比较内存地址。(我们通过String类的例子来说明)
首先看一下用==比较的效果
public class demo1 {
public static void main(String[] args) {
String a = "123";
String b = "123";
String c = new String("123");
System.out.println(a == b);
System.out.println(a == c);
}
}
运行结果为true、false。原因是a="123"这个创建完成后,b="123"创建的时候在a="123"创建的String缓冲池中正好找到了"123"这个值,所以a、b的内存地址是同一个地址,c通过new对象的方式获得,表示我需要再新建一个"123"的值放到内存中,所以c和a、b的内存地址不同,自然返回false。
然后我们用equals比较看一下
public class demo1 {
public static void main(String[] args) {
String a = "123";
String b = "123";
String c = new String("123");
System.out.println(a.equals(b));
System.out.println(a.equals(c));
}
}
返回结果true、true。这又是为什么呢?这需要我们看一下equals的源码。
首先是Object类中的equals()方法
我们看到再object这个类中的equals就是用"=="比较的这两个值得内存地址,上面的为什么会返回true呢,这是应为String这个类重写了object得equals()方法,源码如下:
显而易见,在String这个类重写得equals()方法中我们可以看到,他比较的是字符串中每一个字符是否相等,(也就是比较的是值)。
其实,我们也可以通过自己重写equals方法来让它去比较是否为同一对象等等,equals()方法正因为在不同得类库中重写才能实现对应的比较效果。
二、重写和重载的区别
重载和重写作为经常被拿来对比的两个不同的概念,我们在上期中已经详细介绍了他们两个各自的特点,感兴趣的小伙伴可以去看一下上期的内容。
三、接口和抽象类的异同点
首先,上期我们讲到了,接口和抽象类都不能直接被实例化,他们的子类需要去实现他们的方法后才可以实例化。
其次就是不同点:
1、接口只能定义抽象方法不能实现方法,抽象类既可以定义抽象方法,也可以实现方法。
2、单继承,多实现。接口可以实现多个,只能继承一个抽象类。
3、接口强调的是功能(like a),抽象类强调的是所属关系(is a)。
4、接口中的所有成员变量为public static final, 静态不可修改,当然必须初始化。接口中的所有方法都是public abstract 公开抽象的。而且不能有构造方法。抽象类就比较自由了,和普通的类差不多,可以有抽象方法也可以没有,可以有正常的方法,也可以没有。
总结
本期主要是对前两期介绍的只是中容易混淆以及面试中经常会问到的问题的一个总结和我自己的一些理解,希望对给位小伙伴有帮助!原创不易,希望大家点赞关注评论支持一下!(有不正确的地方欢迎交流指正!)