13.重载和重写的区别?

2022-01-01 62 0

如果一个类有多个名字相同但参数个数不同的方法,我们通常称这些方法为方法重载(overload)。如果方法的功能是一样的,但参数不同,使用相同的名字可以提高程序的可读性。

如果子类具有和父类一样的方法(参数相同、返回类型相同、方法名相同,但方法体可能不同),我们称之为方法重写(override)。方法重写用于提供父类已经声明的方法的特殊实现,是实现多态的基础条件。

  • 方法重载发生在同一个类中,同名的方法如果有不同的参数(参数类型不同、参数个数不同或者二者都不同)。
  • 方法重写发生在子类与父类之间,要求子类与父类具有相同的返回类型,方法名和参数列表,并且不能比父类的方法声明更多的异常,遵守里氏代换原则。

什么是里氏代换原则?

里氏代换原则也被称为李氏替换原则(Liskov Substitution Principle, LSP),其规定,任何父类可以出现的地方,子类也一定可以出现。

LSP 是继承复用的基石,只有当子类可以替换掉父类,软件的单位功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。

这意味着子类在扩展父类的功能时,不应改变父类原有的行为。例如,如果有一个方法接受一个父类对象作为参数,那么传入该方法的任何子类对象也都应该能使得方法正常工作。

class Bird {
    void fly() {
        System.out.println("鸟正在飞");
    }
}

class Duck extends Bird {
    @Override
    void fly() {
        System.out.println("鸭子正在飞");
    }
}

class Ostrich extends Bird {
    // Ostrich违反了LSP,因为鸵鸟不会飞,但却继承了会飞的鸟类
    @Override
    void fly() {
        throw new UnsupportedOperationException("鸵鸟不会飞");
    }
}

在这个例子中,Ostrich(鸵鸟)类违反了 LSP 原则,因为它改变了父类 Bird 的行为(即飞行)。设计时应该更加谨慎地使用继承关系,确保遵守 LSP 原则。

除了李氏替换原则外,还有其他几个重要的面向对象设计原则,它们共同构成了 SOLID 原则,分别是:

①、单一职责原则(Single Responsibility Principle, SRP),指一个类应该只有一个引起它变化的原因,即一个类只负责一项职责。这样做的目的是使类更加清晰,更容易理解和维护。

②、开闭原则(Open-Closed Principle, OCP),指软件实体(类、模块、方法等)应该对扩展开放,对修改关闭。这意味着设计时应该易于扩展,添加新功能时,尽量不修改现有代码,而是通过添加新代码来实现。

③、接口隔离原则(Interface Segregation Principle, ISP),指客户端不应该依赖它不需要的接口。这意味着设计接口时应该尽量精简,不应该设计臃肿庞大的接口。

④、依赖倒置原则(Dependency Inversion Principle, DIP),指高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。这意味着设计时应该尽量依赖接口或抽象类,而不是实现类。

相关文章

深拷贝和浅拷贝?
hashCode 与 equals?
== 和 equals 的区别?
final、finally、finalize 的区别?
final 关键字有什么作用?
18.静态变量和实例变量的区别?静态方法、实例方法呢?

发布评论