前言
关于 “==” 和 equals() 的区别这个问题,我之前一直搞的很乱,虽然面试的时候一直没有被问到,但是我感觉这种是属于最基础的知识,如果不懂好像不是很好。后来我发现通过这个问题,可以串联起很多的知识点,所以我觉得可以写一篇文章来总结一下,顺便把这个问题涉及的知识点总结梳理一下。
“==” 与 equals() 的区别
对于这个问题,我们首先要知道,“==”是一个符号,而equals()是一个方法。这就意味着equals()方法里面可以使用“==”。“==”的本质其实是判断两个对象的地址是否相等,而equals()里面用了“==”,所以在没有重写的情况下equals()也是用来判断两个对象地址是否相等的,若equals()重写,就要看重写后的方法要判断啥了。
重载和重写
说到重写,那我们就来顺便说一下方法重写和方法重载。之前我在面试的时候也有被问到过,方法重载指的是同一个类当中有很多名字相同的方法,但它们的参数不同,用来定义相似的功能。而方法重写是子类继承父类后,重写父类的方法。方法重写一般和多态有关系。
多态
既然重写和多态有关系,那我们就顺便再来聊聊多态。多态是面向对象的三大特性之一。我之前面试的时候,面试官问过我,叫我介绍一下面向对象的特性,我关于封装和继承都讲的挺好的,就是多态不太好解释,当时感觉 也是没理解,我自己当时说的自己都听不懂,估计面试官也听不懂。我今天趁着这个机会又重新梳理了一下。
我还是举电商支付双系统项目的例子来说明。在支付模块里,我想提供多种支付方式让用户选择。所以我会写一个payment父类,然后声明支付方法pay()。接着,我又写了很多子类,比如微信支付子类,支付宝支付子类,来重写这个pay()方法的具体逻辑。这样,无论用户选择哪种支付方式,我都可以通过统一的pay接口来执行具体的pay操作。
abstract class Payment {
public abstract void pay();
}
class CreditCardPayment extends Payment {
@Override
public void pay() {
System.out.println("进行信用卡支付");
}
}
class CashPayment extends Payment {
@Override
public void pay() {
System.out.println("进行现金支付");
}
}
class MobilePayment extends Payment {
@Override
public void pay() {
System.out.println("进行移动支付");
}
}
public class Main {
public static void main(String[] args) {
Payment creditCardPayment = new CreditCardPayment();
Payment cashPayment = new CashPayment();
Payment mobilePayment = new MobilePayment();
creditCardPayment.pay(); // 输出: 进行信用卡支付
cashPayment.pay(); // 输出: 进行现金支付
mobilePayment.pay(); // 输出: 进行移动支付
}
}
一句话总结多态就是:通过抽象类和方法重写,来实现多态这种思想。