六大设计原则
定义
如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。
白话点来说就是,子类可以扩展父类的功能,但不能改变父类原有的功能。
继承
优点
1) 代码共享,减少创建类的工作量,每个子类都拥有父类的属性和方法;
2) 提高代码的重用性;
3) 子类可以形似父类,但又异于父类;
4) 提高代码的可扩展性;
5) 提高产品或项目的开放性。
缺点
1) 继承是侵入性的。只要继承,就必须拥有父类的属性和方法。
2) 降低代码的灵活性。子类会多一些父类的约束。增强了耦合性。
3) 当父类的常量、变量、方法被修改时,需要考虑子类的修改。
继承弊端举例
此处用木鱼不是鱼,不会游泳示例
设计一个鱼类
public class Fish {
public void swim() {
System.out.println("鱼都会游泳");
}
}
调用
public class Client {
public static void main(String[] args) {
Fish fish = new Fish();
fish.swim();
}
}
结果
设计一个木鱼类继承鱼类
木鱼不会游泳,可以敲击
public class WoodenFish extends Fish {
public void swim() {
System.out.println("木鱼不会游泳");
}
public void knock() {
System.out.println("木鱼可以敲击");
}
}
调用
public class Client {
public static void main(String[] args) {
WoodenFish fish = new WoodenFish();
fish.swim();
fish.knock();
}
}
结果
我们发现原本运行正常的鱼能游泳功能发生了错误。原因就是木鱼类在给方法起名时重名,导致重写了父类的方法,造成所有鱼能游泳的功能的代码全部调用了木鱼类重写后的方法,造成原本正常的功能出现了错误。
四层含义
-
子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
-
子类中可以增加自己特有的方法。
-
当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
-
当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。