里氏替换原则里面有“一个软件实体如果使用的是一个基类的话,那么一定适用于其子类。而且它觉察不出基类对象和子类对象的区别。也就是说,在软件里面,把基类都替换成它的子类,程序的行为没有变化。”
我暂时理解为在父类作为参数或类型使用时他的子类将替换父类进行操作。然后我看到的一个例子却让我迷惑了
import java.util.Collection;
import java.util.Map;
/**
 * 父类
 * @author LZG
 *
 */
public  class Father {
public Collection doTo(Map map)
{
System.out.println("父类被执行");
return map.values(); 
}
}import java.util.Collection;import java.util.HashMap;
public class Son extends Father{
public Collection doTo(HashMap map)
{
System.out.println("子类被执行");
return map.values(); 
}}
import java.util.*;
public class Test { /**
 * @param args
 */
public static void main(String[] args) {
// TODO 自动生成方法存根
Father f=new Son();
HashMap map=new HashMap();
f.doTo(map);
}}最后输出的结果却是  “父类被执行”
子类里面 没有重写了父类的doTo(Map map)的方法 ,然后自己又定义了一个自己的方法doTo(HashMap map) 相当方法重载
经过调试 我看到  虽然子类的方法的参数是HashMap map 在Main入口调用方法时传进去参数也是 HashMap map
但是运行的时候跑得却是调用了父类的方法
我知道  Map map 是 HashMap map 的父类
其他的里面到底又有什么样的关系还请给位高手帮小弟解答呀!

解决方案 »

  1.   

    向上就近匹配原则 
    方法的参数表中的数据类型和调用时给出的参数类型不尽相同时(类型不尽相同是指兼容类型),会根据向上匹配的就近原则。(参数类型就近向上转化匹配)http://tangy.iteye.com/blog/652688
      

  2.   

     doTo(HashMap map),  doTo(HashMap map)这俩方法不构成重写@Override关系。不信加@Override到doTo(HashMap map)上试试,会报错的。
      

  3.   

    ╮(╯▽╰)╭ 自己的问题呢,还是自己来解决啊!
    首先我们为了使问题更清楚的展现出来我们修改一下父类的代码!
    package test;import java.util.Collection;
    import java.util.Map;
    /**
     * 父类
     * @author LZG
     *
     */
    public abstract  class Father {
        public abstract Collection doTo(Map map);
    }
    这里就是把父类的doTo的方法修改为抽象方法!
    然后再子类上重写doTo方法!
    package test;import java.util.Collection;
    import java.util.Map;import java.util.HashMap;
    public class Son extends Father{
        //子类自己的方法
        public Collection doTo(HashMap map)
        {
            System.out.println("子类被执行");
            return map.values(); 
        }
            //重写父类的方法
    public Collection doTo(Map map) {
    // TODO 自动生成方法存根
                 System.out.println("子类重写父类的方法....");
    return null;
    }}大家注意,这里和之前的子类只是添加多了重写父类doTo方法!
    也就是子类里面有两个doTo方法,一个是重写父类以后的daTo方法传入的参数为(Map map),一个是子类自己的daTo方法(HashMap map)!
    Main方法的类不变。然后运行程序,调试后我们发现。虽然在Main在Main方法的类时。我们的代码为:
     Father f=new Son();
            HashMap map=new HashMap();
            f.doTo(map);
    虽然doTo方法传进去的参数为 (HashMap map)
    但是,在调试的时候,我发现程序还是跑到了
             //重写父类的方法
    public Collection doTo(Map map) 
    里。
    原因:
    因为 HashMap 和 Map 是 子类继承父类的关系。虽然子类的面有一个参数为(HashMap map)doTo的方法。但是系统还是认为你调用的是重写父类的方法doTo(Map map) 。
    而且,我们new子类的时候。也是以父类作为容器来装载的。
    Father f=new Son();
    所以此时的 f  是没有子类自有的方法。只有父类的方法。
    从而程序输出来的是 “子类重写父类的方法....”