软构——OOP的实现与功能(下)

        上一节我们学习了OOP的部分功能,了解了该如何使用继承和重写(Override),这一节,我们将继续学习重载(Overload)的相关知识,并将对重载和重写进行深入探讨,比较其异同之处,进而加深对其的理解。

  • OOP的四种性质

  1.         Encapsulation and information hiding 封装与信息隐藏
  2.         Inheritance and overriding 继承与重写
  3.         Polymorphism, subtyping and overloading 多态、子类型、重载
  4.         *Static and Dynamic dispatch 静态与动态分派
  • 多态、子类型、重载

重载(Overload):多个方法具有同样的名字,但有不同的参数列表或返回值类型。(所以会便于静态检查,这是和重写的区别所在)

多态分为三类:

  1. 特殊多态(Ad hoc polymorphism):重载
  2. 参数化多态(Parametric polymorphism):泛型
  3. 子类型多态、包含多态(Subtyping):继承

特殊多态

  • 价值:方便client调用,client可用不同的参数列表,调用同样的函数
  • 会根据参数列表进行最佳匹配,进行静态检查,在编译阶段确定是哪一个方法被调用。
  • 而与之相反,Override会在run-time进行动态类型检查。

重载的规则:

  1. 参数列表一定要改变(不能是只改变名字而不改变参数类型)
  2. 返回值类型可变可不变
  3. 异常可变可不变
  4. 可以在同一个类里重载,也可在子类中重载

//错误示例
public void changeSize(int size, String name, float pattern) {}
public void changeSize(int length, String pattern, float size) {}
//仅仅改变了参数名字,size-->length ,实际上换汤不换药,两者是一样的

重载和重写的异同之处: 

重载和重写的范例:

 

 

 

参数化多态:使用泛型(Generic)编程

        泛型:其定义中包含了类型变量,即用一个泛类型,比如E,来代表

 

        而Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。

        举个例子:

public class Test {
 
    public static void main(String[] args) {
 
        ArrayList<String> list1 = new ArrayList<String>();
        list1.add("abc");
 
        ArrayList<Integer> list2 = new ArrayList<Integer>();
        list2.add(123);
 
        System.out.println(list1.getClass() == list2.getClass());
        //最后所得的结果为 true
    }
 
}

       上述代码中,虽然定义了ArrayList<String> list1和ArrayList<Integer> list2,看似两者是不同的,但是在运行时类型都会被擦除,两者都变成ArrayList,JVM看到的只是ArrayList,所以最后所得的结果为true

        所以这也是(示例方法)List<Number>和List<Integer>并不是父类和子类的关系的原因,虽然Integer是Number的子类,但是由于泛型擦除, List<Integer>并不是List<Number>的子类

子类型多态:期望不同类型的对象可以统一处理而无需区分,遵循LSP原则

  1. 重写时,子类的规约要强于父类的规约(更弱的前置条件,更强的后置条件)
  2. 子类的可见性要强于父类(即父类如果是public,子类不能为private)
  3. 子类不能比父类抛出更多的异常

(详情见LSP原则)

  • 小结

        学完了重载(Overload)和多态,对于OOP的认识才算是圆满,后续我们也将会学到更多的关于复用性、可维护性等的知识,可以发现,这些都不是关注代码该怎么敲,函数内逻辑怎么实现,而是在于我们对于开发软件这项工作,需要哪些性质,比如可复用性--降低后续开发成本,这些才是我们作为一个有全局观的开发者应该关注的点。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lyg809073256

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值