• overload和overridden


    今天看的书是effective java,被其中的一个小问题困惑了好久,细细得读完几遍,终于明白是什么意思。测试代码如下

     1 package test.lan;
     2 
     3 import java.math.BigInteger;
     4 import java.util.ArrayList;
     5 import java.util.Collection;
     6 import java.util.HashMap;
     7 import java.util.HashSet;
     8 import java.util.List;
     9 import java.util.Set;
    10 public class ff {
    11     public static String classify(Set<?> s){
    12         return "Set";
    13     }
    14     public static String classify(List<?> lst){
    15         return "List";
    16     }
    17     public static String classify(Collection<?> c){
    18         return "Unknown Collection";
    19     }
    20     public static void main(String[] args) {
    21         Collection<?>[] collections = {
    22                 new HashSet<String>(),
    23                 new ArrayList<BigInteger>(),
    24                 new HashMap<String,String>().values()
    25         };
    26         for (Collection<?> c:collections) {
    27             System.out.println(classify(c));
    28         }
    29         System.out.println(classify(new HashSet<String>()));
    30     }
    31 }


      咋一看,我也以为我会输出三个不同的字符串,看了解释还是迷迷糊糊,不过最后还是被我搞清楚了原因。

      overload即重载,是静态多样性的体现,具体表现在方法被重载了,要调用哪个方法,在编译的时候就已经确定了(取决于句柄);而overridden是指动态重写(覆盖),要调用哪个方法,是在运行时确定的,选择的依据是被调用的方法所在对象的运行时类型,也就是句柄所指向的对象类型来确定的。

      因此,比较保守的做法是不重载相同参数个数的方法,而采用诸如不同的参数个数的方法,或者是静态工厂类。

  • 相关阅读:
    [转]MySQL之外键约束
    [转]mysql忘记密码,如何重置密码
    [转]MS Sql 7105错误
    [轉]免费的.NET混淆和反编译工具
    一個PDO操作類
    [转]基于FPGA的八位RISC CPU的设计
    SQL Server 2005中的分区表
    [轉]使用SQLDMO备份和恢复数据库(VB & ASP)
    [轉]VS 2010 通过 Architecture创建UML类图设计
    [转]用CSS调整scrollbar(滚动条)的配色
  • 原文地址:https://www.cnblogs.com/azul0906/p/4209629.html
Copyright © 2020-2023  润新知